backoffice: code to get a sidebar filled with the content of a feed (#1681)
This commit is contained in:
parent
41f5570365
commit
17effa588f
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue