This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
compte-agglo-montpellier/compte_agglo_montpellier/apps/feed_plugin/cms_plugins.py

86 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:
import pdb
pdb.set_trace()
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)