backoffice: code to get a sidebar filled with the content of a feed (#1681)

This commit is contained in:
Frédéric Péters 2012-10-04 14:32:35 +02:00
parent 41f5570365
commit 17effa588f
2 changed files with 81 additions and 0 deletions

View File

@ -15,11 +15,22 @@
# along with this program; if not, see <http://www.gnu.org/licenses/>.
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):
'<div class="news recent">'
else:
'<div class="news">'
'<h3>%s</h3>' % feed.entries[0]['title'].encode(get_publisher().site_charset)
htmltext(feed.entries[0]['content'][0]['value'].encode(get_publisher().site_charset))
'</div>'
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)

View File

@ -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