diff --git a/combo/data/models.py b/combo/data/models.py
index 241772f3..9344ab5e 100644
--- a/combo/data/models.py
+++ b/combo/data/models.py
@@ -14,11 +14,15 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+import feedparser
+import hashlib
import json
+import requests
from django.conf import settings
from django.contrib.auth.models import Group
from django.contrib.contenttypes.models import ContentType
+from django.core.cache import cache
from django.core.exceptions import ObjectDoesNotExist
from django.core import serializers
from django.db import models
@@ -34,6 +38,7 @@ import cmsplugin_blurp.utils
from .library import register_cell_class, get_cell_classes, get_cell_class
from combo import utils
+from combo.utils import NothingInCacheException
def element_is_visible(element, user=None):
@@ -469,3 +474,27 @@ class LinkCell(CellBase):
if self.anchor:
context['url'] += '#' + self.anchor
return super(LinkCell, self).render(context)
+
+
+@register_cell_class
+class FeedCell(CellBase):
+ url = models.URLField(_('URL'), blank=True)
+
+ template_name = 'combo/feed-cell.html'
+
+ class Meta:
+ verbose_name = _('RSS/Atom Feed')
+
+ def render(self, context):
+ cache_key = hashlib.md5(self.url).hexdigest()
+ feed_content = cache.get(cache_key)
+ if not context.get('ajax') and feed_content is None:
+ raise NothingInCacheException()
+ if not feed_content:
+ feed_response = requests.get(self.url)
+ if feed_response.status_code == 200:
+ feed_content = feed_response.content
+ cache.set(cache_key, feed_content, 600)
+ if feed_content:
+ context['feed'] = feedparser.parse(feed_content)
+ return super(FeedCell, self).render(context)
diff --git a/combo/public/templates/combo/feed-cell.html b/combo/public/templates/combo/feed-cell.html
new file mode 100644
index 00000000..501850cd
--- /dev/null
+++ b/combo/public/templates/combo/feed-cell.html
@@ -0,0 +1,9 @@
+{% load i18n %}
+{% for entry in feed.entries %}
+{% if entry.link %}
+
+ {% else %}
+ {{entry.title}}
+{% endif %}
+{% if entry.description %}{{entry.description}}
{% endif %}
+{% endfor %}
diff --git a/debian/control b/debian/control
index 51ffe603..1d91bca1 100644
--- a/debian/control
+++ b/debian/control
@@ -12,6 +12,7 @@ Depends: ${misc:Depends}, ${python:Depends},
python-django (>= 1.7),
python-gadjo,
python-requests,
+ python-feedparser,
python-django-cmsplugin-blurp
Recommends: python-django-mellon
Description: Portal Management System (Python module)
diff --git a/requirements.txt b/requirements.txt
index 8a3cab79..d41f377a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -4,3 +4,4 @@ django-ckeditor
django-cmsplugin-blurp
django-jsonfield
requests
+feedparser
diff --git a/setup.py b/setup.py
index 272ecf3d..b253c3b4 100644
--- a/setup.py
+++ b/setup.py
@@ -106,6 +106,7 @@ setup(
'django-ckeditor',
'gadjo',
'django-cmsplugin-blurp',
+ 'feedparser'
'django-jsonfield',
],
zip_safe=False,