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