Feed parsing and formatting
This commit is contained in:
parent
9d3b278e4f
commit
48501957a1
5 changed files with 34 additions and 30 deletions
|
@ -12,7 +12,7 @@ def parse(obj, raw, stream):
|
|||
|
||||
# Date stamp handling
|
||||
ts = raw['published'] / 1000
|
||||
obj.published = datetime.utcfromtimestamp(ts)
|
||||
obj.published = datetime.fromtimestamp(ts)
|
||||
|
||||
# Authorship and title
|
||||
obj.title = raw['title']
|
||||
|
@ -32,6 +32,8 @@ def parse(obj, raw, stream):
|
|||
obj.visual = raw['enclosure'][0]['href']
|
||||
elif 'visual' in raw and 'url' in raw['visual']:
|
||||
obj.visual = raw['visual']['url']
|
||||
if obj.visual.lower().strip() == 'none':
|
||||
obj.visual = ''
|
||||
|
||||
# Collect text in nested JSON content
|
||||
if 'content' in obj.raw:
|
||||
|
|
|
@ -12,6 +12,7 @@ from django.core.mail import send_mail
|
|||
from wagtail.contrib.settings.models import BaseSetting, register_setting
|
||||
|
||||
from .models import Entry, Stream
|
||||
import feedler.feedparser as feedparser
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger('feedler')
|
||||
|
@ -60,5 +61,5 @@ def handle_save_settings(sender, instance, *args, **kwargs):
|
|||
except Entry.DoesNotExist:
|
||||
logger.info("Adding entry '%s'" % eid)
|
||||
entry = Entry()
|
||||
entry.parse(raw_entry, stream)
|
||||
entry = feedparser.parse(entry, raw_entry, stream)
|
||||
entry.save()
|
||||
|
|
|
@ -6,8 +6,6 @@ from wagtail.wagtailcore.models import Page, Orderable
|
|||
from wagtail.wagtailadmin.edit_handlers import FieldPanel
|
||||
from wagtail.wagtailcore.fields import RichTextField
|
||||
|
||||
import feedler.feedparser as feedparser
|
||||
|
||||
class Stream(models.Model):
|
||||
title = models.CharField(max_length=255)
|
||||
ident = models.CharField(max_length=255)
|
||||
|
@ -38,10 +36,6 @@ class Entry(models.Model):
|
|||
class Meta:
|
||||
verbose_name_plural = 'Entries'
|
||||
|
||||
def parse(self, raw, stream):
|
||||
# TODO: Exception handling
|
||||
feedparser.parse(self, raw, stream)
|
||||
|
||||
class FeedPage(Page):
|
||||
intro = RichTextField(default='', blank=True)
|
||||
stream = models.ForeignKey(Stream, on_delete=models.PROTECT,
|
||||
|
|
|
@ -13,7 +13,9 @@
|
|||
<section id="article-index" class="article-index-page">
|
||||
<div class="container">
|
||||
<h2>{{ page.title }}</h2>
|
||||
{% if page.intro %}
|
||||
<p class="lead">{{ page.intro|richtext }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
@ -23,15 +25,17 @@
|
|||
<div class="row">
|
||||
{% for entry in feedentries %}
|
||||
<div class="col-md-4 col-sm-6 col-xs-12">
|
||||
<div class="panel panel-default">
|
||||
{% if entry.visual %}
|
||||
<img src="{{ entry.visual }}" width="360">
|
||||
<div class="panel panel-default">
|
||||
<img src="{{ entry.visual }}">
|
||||
{% else %}
|
||||
<div class="panel panel-fulltext">
|
||||
{% endif %}
|
||||
<div class="panel-body">
|
||||
<h3><span>{{ entry.title }}</span></h3>
|
||||
<h3><span>{{ entry.title|striptags|truncatewords_html:10 }}</span></h3>
|
||||
<p>
|
||||
{{ entry.content|striptags|truncatewords_html:40 }}
|
||||
<br><em><small><span>{{ entry.author }}</span></small></em>
|
||||
<em><small><span>{{ entry.author }}</span></small></em><br><br>
|
||||
{{ entry.content|striptags|truncatewords_html:25 }}
|
||||
</p>
|
||||
</div>
|
||||
<a href="{{ entry.link }}" target="_blank" class="fill"></a>
|
||||
|
|
|
@ -2,21 +2,13 @@
|
|||
// News overview
|
||||
#news {
|
||||
|
||||
.panel-default {
|
||||
.panel-default, .panel-fulltext {
|
||||
font-size: 90%;
|
||||
padding-top: 75%; /* 1:1 Aspect Ratio */
|
||||
position: relative; /* If you want text inside of it */
|
||||
overflow: hidden;
|
||||
background: lighten($brand-primary, 10%);
|
||||
|
||||
img {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.panel-body {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
|
@ -24,10 +16,7 @@
|
|||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
transform: translateY(60%);
|
||||
background-color: rgba($brand-primary, .8);
|
||||
transition: transform .65s;
|
||||
|
||||
h3, p {
|
||||
color: white;
|
||||
}
|
||||
|
@ -58,9 +47,6 @@
|
|||
text-align: center;
|
||||
}
|
||||
}
|
||||
&:hover .panel-body {
|
||||
transform: rotateY(0);
|
||||
}
|
||||
|
||||
// expand link over the thumbnail
|
||||
a.fill {
|
||||
|
@ -72,6 +58,23 @@
|
|||
font-size: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.panel-default {
|
||||
img {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
.panel-body {
|
||||
transform: translateY(60%);
|
||||
transition: transform .65s;
|
||||
}
|
||||
&:hover .panel-body {
|
||||
transform: rotateY(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// News detail article
|
||||
|
|
Loading…
Reference in a new issue