Projet

Général

Profil

0001-backoffice-code-to-get-a-sidebar-filled-with-the-con.patch

pour w.c.s - Frédéric Péters, 04 octobre 2012 14:36

Télécharger (4,52 ko)

Voir les différences:

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(+)
wcs/qommon/backoffice/root.ptl
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)
wcs/qommon/publisher.py
75 75

  
76 76
    admin_help_url = None
77 77
    backoffice_help_url = None
78
    backoffice_feed_url = None
78 79

  
79 80
    root_directory_class = None
80 81
    backoffice_directory_class = None
......
354 355
        except ConfigParser.NoOptionError:
355 356
            return False
356 357

  
358
    def get_site_option(self, option):
359
        if self.site_options is None:
360
            self.load_site_options()
361
        try:
362
            return self.site_options.get('options', option)
363
        except ConfigParser.NoSectionError:
364
            return None
365
        except ConfigParser.NoOptionError:
366
            return None
367

  
357 368
    def set_config(self, request = None):
358 369
        self.reload_cfg()
359 370
        self.site_options = None # reset at the beginning of a request
360
-