84 lines
3.1 KiB
Python
84 lines
3.1 KiB
Python
import logging
|
|
import hashlib
|
|
from xml.etree import ElementTree as ET
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from django.core.cache import cache
|
|
|
|
import feedparser
|
|
|
|
from cms.plugin_base import CMSPluginBase
|
|
from cms.plugin_pool import plugin_pool
|
|
|
|
from . import models
|
|
from . import forms
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class SelectUserFeedPlugin(CMSPluginBase):
|
|
model = models.SelectUserFeed
|
|
name = _('select user feeds')
|
|
render_template = 'feed_plugin/select_user_feed.html'
|
|
text_enabled = True
|
|
|
|
def render(self, context, instance, placeholder):
|
|
request = context['request']
|
|
user = request.user
|
|
submit = 'select-user-feed-plugin-%s' % instance.id
|
|
if request.method == 'POST' and submit in request.POST:
|
|
form = forms.FeedForm(data=request.POST)
|
|
if form.is_valid():
|
|
models.FeedPreference.objects.filter(user=user).delete()
|
|
for feed in form.cleaned_data['feeds']:
|
|
models.FeedPreference.objects.get_or_create(
|
|
user=user, feed=feed)
|
|
else:
|
|
initial = dict(feeds=models.FeedPreference.objects.filter(user=user)
|
|
.values_list('feed_id', flat=True))
|
|
form = forms.FeedForm(initial=initial)
|
|
context.update(dict(form=form, submit=submit))
|
|
return context
|
|
|
|
class ShowUserFeedPlugin(CMSPluginBase):
|
|
model = models.ShowUserFeed
|
|
name = _('show user feeds')
|
|
render_template = 'feed_plugin/show_user_feed.html'
|
|
text_enabled = True
|
|
|
|
def get_feeds(self, instance, user):
|
|
entries = []
|
|
logger.debug('loading RSS feeds of user %s', user.username)
|
|
for pref in models.FeedPreference.objects.filter(user=user):
|
|
feed = feedparser.parse(pref.feed.url)
|
|
for entry in feed.entries:
|
|
for attribute in ('published_parsed', 'updated_parsed',
|
|
'created_parsed', 'expired_parsed'):
|
|
date = getattr(entry, attribute, None)
|
|
if date is not None:
|
|
break
|
|
entries.append((date, entry.title, entry.link, pref.feed.name,
|
|
pref.feed.color_hex, pref.feed.css_classes))
|
|
logger.debug('loading finished of %s entries', len(entries))
|
|
entries.sort(reverse=True)
|
|
entries = entries[:instance.limit]
|
|
return [dict(title=title, link=link, feed_name=feed_name,
|
|
color_hex=color_hex, css_classes=css_classes)
|
|
for date, title, link, feed_name, color_hex, css_classes in entries]
|
|
|
|
def render(self, context, instance, placeholder):
|
|
request = context['request']
|
|
user = request.user
|
|
key = 'user-feeds-%s-%s' % (user.id, instance.timeout)
|
|
entries = cache.get(key)
|
|
if entries is None:
|
|
entries = self.get_feeds(instance, user)
|
|
cache.set(key, entries, instance.timeout)
|
|
context.update(dict(entries=entries))
|
|
return context
|
|
|
|
|
|
plugin_pool.register_plugin(SelectUserFeedPlugin)
|
|
plugin_pool.register_plugin(ShowUserFeedPlugin)
|