15 |
15 |
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
16 |
16 |
|
17 |
17 |
import os
|
|
18 |
import socket
|
|
19 |
import time
|
|
20 |
import urllib2
|
|
21 |
|
|
22 |
try:
|
|
23 |
from hashlib import md5 as md5_new
|
|
24 |
except:
|
|
25 |
from md5 import new as md5_new
|
18 |
26 |
|
19 |
27 |
from quixote.directory import Directory, AccessControlled
|
20 |
28 |
from quixote import get_publisher, get_request, get_response
|
|
29 |
from quixote.html import htmltext
|
21 |
30 |
|
22 |
31 |
from qommon import errors
|
|
32 |
from qommon.vendor import feedparser
|
|
33 |
from qommon.storage import atomic_write
|
23 |
34 |
|
24 |
35 |
class BackofficeRootDirectory(AccessControlled, Directory):
|
25 |
36 |
|
... | ... | |
53 |
64 |
raise errors.AccessForbiddenError()
|
54 |
65 |
|
55 |
66 |
get_response().filter['in_backoffice'] = True
|
|
67 |
|
|
68 |
def get_feed_url(self, language):
|
|
69 |
feed_url = get_publisher().get_site_option('backoffice_feed_url')
|
|
70 |
if feed_url == 'false':
|
|
71 |
return None
|
|
72 |
elif feed_url:
|
|
73 |
return feed_url
|
|
74 |
if not get_publisher().backoffice_feed_url:
|
|
75 |
return None
|
|
76 |
return get_publisher().backoffice_feed_url.get(language)
|
|
77 |
|
|
78 |
def get_feed_filename(self, feed_url):
|
|
79 |
md5_hash = md5_new()
|
|
80 |
md5_hash.update(feed_url)
|
|
81 |
return os.path.join(get_publisher().app_dir, 'feed-' + md5_hash.hexdigest())
|
|
82 |
|
|
83 |
def get_sidebar [html] (self):
|
|
84 |
feed_url = self.get_feed_url(get_request().language)
|
|
85 |
if not feed_url:
|
|
86 |
return None
|
|
87 |
feed_filename = self.get_feed_filename(feed_url)
|
|
88 |
if not os.path.exists(feed_filename):
|
|
89 |
self.update_backoffice_feed()
|
|
90 |
return None
|
|
91 |
if os.stat(feed_filename)[8] < (time.time()-86400):
|
|
92 |
self.update_backoffice_feed()
|
|
93 |
|
|
94 |
feed = feedparser.parse(feed_filename)
|
|
95 |
if not feed.entries:
|
|
96 |
return None
|
|
97 |
|
|
98 |
publication_time = feed.entries[0]['published_parsed']
|
|
99 |
if time.mktime(publication_time) > (time.time()-7*86400):
|
|
100 |
'<div class="news recent">'
|
|
101 |
else:
|
|
102 |
'<div class="news">'
|
|
103 |
'<h3>%s</h3>' % feed.entries[0]['title'].encode(get_publisher().site_charset)
|
|
104 |
htmltext(feed.entries[0]['content'][0]['value'].encode(get_publisher().site_charset))
|
|
105 |
'</div>'
|
|
106 |
|
|
107 |
def update_backoffice_feed(self):
|
|
108 |
job = get_response().add_after_job(
|
|
109 |
N_('Updating Backoffice Info Feed'),
|
|
110 |
self.update_backoffice_feed_real,
|
|
111 |
fire_and_forget=True)
|
|
112 |
job.feed_language = get_request().language
|
|
113 |
|
|
114 |
def update_backoffice_feed_real(self, job):
|
|
115 |
feed_url = self.get_feed_url(job.feed_language)
|
|
116 |
if not feed_url:
|
|
117 |
return None
|
|
118 |
try:
|
|
119 |
fd = urllib2.urlopen(feed_url)
|
|
120 |
s = fd.read()
|
|
121 |
fd.close()
|
|
122 |
except (urllib2.URLError, socket.error):
|
|
123 |
return
|
|
124 |
feed_filename = self.get_feed_filename(feed_url)
|
|
125 |
atomic_write(feed_filename, s)
|