Mercurial > libervia-web
comparison libervia_server/blog.py @ 388:893451e35686
server_side: display blog banner if it is defined
author | souliane <souliane@mailoo.org> |
---|---|
date | Tue, 25 Feb 2014 11:31:11 +0100 |
parents | 41a386a27002 |
children | 2d782349b88a |
comparison
equal
deleted
inserted
replaced
387:933bce4cb816 | 388:893451e35686 |
---|---|
17 # You should have received a copy of the GNU Affero General Public License | 17 # You should have received a copy of the GNU Affero General Public License |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | 18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 | 19 |
20 from sat_frontends.tools.strings import addURLToText | 20 from sat_frontends.tools.strings import addURLToText |
21 from libervia_server.html_tools import sanitizeHtml | 21 from libervia_server.html_tools import sanitizeHtml |
22 from twisted.internet import reactor, defer | 22 from twisted.internet import defer |
23 from twisted.web import server | 23 from twisted.web import server |
24 from twisted.web.resource import Resource | 24 from twisted.web.resource import Resource |
25 from twisted.words.protocols.jabber.jid import JID | 25 from twisted.words.protocols.jabber.jid import JID |
26 from datetime import datetime | 26 from datetime import datetime |
27 from feed import atom | |
28 from constants import Const | 27 from constants import Const |
28 import re | |
29 | 29 |
30 | 30 |
31 class MicroBlog(Resource): | 31 class MicroBlog(Resource): |
32 isLeaf = True | 32 isLeaf = True |
33 | 33 |
63 d2 = defer.Deferred() | 63 d2 = defer.Deferred() |
64 if len(request.postpath) > 1 and request.postpath[1] == 'atom.xml': | 64 if len(request.postpath) > 1 and request.postpath[1] == 'atom.xml': |
65 d2.addCallbacks(self.render_atom_feed, self.render_error_blog, [request], None, [request, prof_found], None) | 65 d2.addCallbacks(self.render_atom_feed, self.render_error_blog, [request], None, [request, prof_found], None) |
66 self.host.bridge.getLastGroupBlogsAtom(pub_jid.userhost(), 10, 'libervia', d2.callback, d2.errback) | 66 self.host.bridge.getLastGroupBlogsAtom(pub_jid.userhost(), 10, 'libervia', d2.callback, d2.errback) |
67 else: | 67 else: |
68 d2.addCallbacks(self.render_html_blog, self.render_error_blog, [request, prof_found], None, [request, prof_found], None) | 68 d2.addCallbacks(self._render_html_blog, self.render_error_blog, [request, prof_found], None, [request, prof_found], None) |
69 self.host.bridge.getLastGroupBlogs(pub_jid.userhost(), 10, 'libervia', d2.callback, d2.errback) | 69 self.host.bridge.getLastGroupBlogs(pub_jid.userhost(), 10, 'libervia', d2.callback, d2.errback) |
70 | 70 |
71 d1 = defer.Deferred() | 71 d1 = defer.Deferred() |
72 JID(self.host.bridge.asyncGetParamA('JabberID', 'Connection', 'value', Const.SERVER_SECURITY_LIMIT, prof_found, callback=d1.callback, errback=d1.errback)) | 72 JID(self.host.bridge.asyncGetParamA('JabberID', 'Connection', 'value', Const.SERVER_SECURITY_LIMIT, prof_found, callback=d1.callback, errback=d1.errback)) |
73 d1.addCallbacks(got_jid) | 73 d1.addCallbacks(got_jid) |
74 | 74 |
75 return server.NOT_DONE_YET | 75 return server.NOT_DONE_YET |
76 | 76 |
77 def render_html_blog(self, mblog_data, request, profile): | 77 def _render_html_blog(self, mblog_data, request, profile): |
78 """Retrieve the blog banner or other user's specific stuff before actually rendering the static blog""" | |
79 def check_banner(banner): | |
80 """Regexp from http://answers.oreilly.com/topic/280-how-to-validate-urls-with-regular-expressions/""" | |
81 if re.match(r"^(https?|ftp)://[a-z0-9-]+(\.[a-z0-9-]+)+(/[\w-]+)*/[\w-]+\.(gif|png|jpg)$", banner): | |
82 style = {'banner': banner} | |
83 else: | |
84 style = {} | |
85 self.render_html_blog(mblog_data, style, request, profile) | |
86 eb = lambda failure: self.render_error_blog(failure, request, profile) | |
87 self.host.bridge.asyncGetParamA('Blog banner', 'Misc', 'value', Const.SERVER_SECURITY_LIMIT, profile, callback=check_banner, errback=eb) | |
88 | |
89 def render_html_blog(self, mblog_data, style, request, profile): | |
90 """Actually rendering the static blog | |
91 @param mblog_data: list of microblog data | |
92 @param style: dict defining the blog's rendering parameters | |
93 @param request: the HTTP request | |
94 @profile | |
95 """ | |
96 if not isinstance(style, dict): | |
97 style = {} | |
78 user = sanitizeHtml(profile).encode('utf-8') | 98 user = sanitizeHtml(profile).encode('utf-8') |
99 banner = style['banner'].encode('utf-8') if 'banner' in style else '' | |
100 banner_elt = "<img src='%(banner)s' alt='%(user)s'/>" % {'user': user, 'banner': banner} if banner else user | |
79 request.write(""" | 101 request.write(""" |
80 <html> | 102 <html> |
81 <head> | 103 <head> |
82 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | 104 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
83 <link rel="alternate" type="application/atom+xml" href="%(user)s/atom.xml"/> | 105 <link rel="alternate" type="application/atom+xml" href="%(user)s/atom.xml"/> |
84 <link rel="stylesheet" type="text/css" href="../css/blog.css" /> | 106 <link rel="stylesheet" type="text/css" href="../css/blog.css" /> |
85 <title>%(user)s's microblog</title> | 107 <title>%(user)s's microblog</title> |
86 </head> | 108 </head> |
87 <body> | 109 <body> |
88 <div class='mblog_title'>%(user)s</div> | 110 <div class='mblog_title'>%(banner_elt)s</div> |
89 """ % {'user': user}) | 111 """ % {'user': user, 'banner_elt': banner_elt}) |
90 mblog_data = sorted(mblog_data, key=lambda entry: (-float(entry.get('published', 0)))) | 112 mblog_data = sorted(mblog_data, key=lambda entry: (-float(entry.get('published', 0)))) |
91 for entry in mblog_data: | 113 for entry in mblog_data: |
92 timestamp = float(entry.get('published', 0)) | 114 timestamp = float(entry.get('published', 0)) |
93 _datetime = datetime.fromtimestamp(timestamp) | 115 _datetime = datetime.fromtimestamp(timestamp) |
94 | 116 |