From 2810827422445a37adbf04183f0a6d794a446438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 4 Oct 2012 14:32:35 +0200 Subject: [PATCH] backoffice: code to get a sidebar filled with the content of a feed (#1681) --- wcs/qommon/backoffice/root.ptl | 70 ++++++++++++++++++++++++++++++++++++++++ wcs/qommon/publisher.py | 11 +++++++ 2 files changed, 81 insertions(+) diff --git a/wcs/qommon/backoffice/root.ptl b/wcs/qommon/backoffice/root.ptl index 3c9b56a..87c5eda 100644 --- a/wcs/qommon/backoffice/root.ptl +++ b/wcs/qommon/backoffice/root.ptl @@ -15,11 +15,22 @@ # along with this program; if not, see . import os +import socket +import time +import urllib2 + +try: + from hashlib import md5 as md5_new +except: + from md5 import new as md5_new from quixote.directory import Directory, AccessControlled from quixote import get_publisher, get_request, get_response +from quixote.html import htmltext from qommon import errors +from qommon.vendor import feedparser +from qommon.storage import atomic_write class BackofficeRootDirectory(AccessControlled, Directory): @@ -53,3 +64,62 @@ class BackofficeRootDirectory(AccessControlled, Directory): raise errors.AccessForbiddenError() get_response().filter['in_backoffice'] = True + + def get_feed_url(self, language): + feed_url = get_publisher().get_site_option('backoffice_feed_url') + if feed_url == 'false': + return None + elif feed_url: + return feed_url + if not get_publisher().backoffice_feed_url: + return None + return get_publisher().backoffice_feed_url.get(language) + + def get_feed_filename(self, feed_url): + md5_hash = md5_new() + md5_hash.update(feed_url) + return os.path.join(get_publisher().app_dir, 'feed-' + md5_hash.hexdigest()) + + def get_sidebar [html] (self): + feed_url = self.get_feed_url(get_request().language) + if not feed_url: + return None + feed_filename = self.get_feed_filename(feed_url) + if not os.path.exists(feed_filename): + self.update_backoffice_feed() + return None + if os.stat(feed_filename)[8] < (time.time()-86400): + self.update_backoffice_feed() + + feed = feedparser.parse(feed_filename) + if not feed.entries: + return None + + publication_time = feed.entries[0]['published_parsed'] + if time.mktime(publication_time) > (time.time()-7*86400): + '
' + else: + '
' + '

%s

' % feed.entries[0]['title'].encode(get_publisher().site_charset) + htmltext(feed.entries[0]['content'][0]['value'].encode(get_publisher().site_charset)) + '
' + + def update_backoffice_feed(self): + job = get_response().add_after_job( + N_('Updating Backoffice Info Feed'), + self.update_backoffice_feed_real, + fire_and_forget=True) + job.feed_language = get_request().language + + def update_backoffice_feed_real(self, job): + feed_url = self.get_feed_url(job.feed_language) + if not feed_url: + return None + try: + fd = urllib2.urlopen(feed_url) + s = fd.read() + fd.close() + except (urllib2.URLError, socket.error): + return + feed_filename = self.get_feed_filename(feed_url) + atomic_write(feed_filename, s) diff --git a/wcs/qommon/publisher.py b/wcs/qommon/publisher.py index 62fc305..d01a8a1 100644 --- a/wcs/qommon/publisher.py +++ b/wcs/qommon/publisher.py @@ -75,6 +75,7 @@ class QommonPublisher(Publisher): admin_help_url = None backoffice_help_url = None + backoffice_feed_url = None root_directory_class = None backoffice_directory_class = None @@ -354,6 +355,16 @@ class QommonPublisher(Publisher): except ConfigParser.NoOptionError: return False + def get_site_option(self, option): + if self.site_options is None: + self.load_site_options() + try: + return self.site_options.get('options', option) + except ConfigParser.NoSectionError: + return None + except ConfigParser.NoOptionError: + return None + def set_config(self, request = None): self.reload_cfg() self.site_options = None # reset at the beginning of a request -- 1.7.10.4