Mercurial > libervia-web
diff server_side/blog.py @ 10:c28a4840e1a8
server: microblog resource
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 25 Mar 2011 00:32:58 +0100 |
parents | |
children | 513fe9bd0665 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server_side/blog.py Fri Mar 25 00:32:58 2011 +0100 @@ -0,0 +1,88 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +""" +Libervia: a Salut à Toi frontend +Copyright (C) 2011 Jérôme Poisson (goffi@goffi.org) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +""" + +from server_side.html_tools import sanitizeHtml +from twisted.internet import reactor, defer +from twisted.web import server +from twisted.web.resource import Resource +from twisted.words.protocols.jabber.jid import JID +from datetime import datetime + +class MicroBlog(Resource): + isLeaf = True + + ERROR_TEMPLATE = """ + <html> + <head> + <title>MICROBLOG ERROR</title> + </head> + <body> + <h1 style='text-align: center; color: red;'>%s</h1> + </body> + </html> + """ + + def __init__(self,host): + self.host = host + Resource.__init__(self) + if not host.bridge.isConnected("libervia"): #FIXME: hard coded value for test + host.bridge.connect("libervia") + + def render_GET(self, request): + if not request.postpath: + return MicroBlog.ERROR_TEMPLATE % "You must indicate a nickname" + else: + prof_requested = request.postpath[0] + #TODO: char check: only use alphanumerical chars + some extra(_,-,...) here + prof_found = self.host.bridge.getProfileName(prof_requested) + if not prof_found or prof_found=='libervia': + return MicroBlog.ERROR_TEMPLATE % "Invalid nickname" + else: + pub_jid=JID(self.host.bridge.getParamA('JabberID','Connection','value',prof_found)) + d = defer.Deferred() + d.addCallbacks(self.render_html_blog, self.render_error_blog, [request, prof_found], None, [request, prof_found], None) + self.host.bridge.getLastMicroblogs(pub_jid.userhost(), 10, 'libervia', d.callback, d.errback) + + return server.NOT_DONE_YET + + def render_html_blog(self, mblog_data, request, profile): + user = sanitizeHtml(profile).encode('utf-8') + request.write(""" + <html> + <head> + <link rel="stylesheet" type="text/css" href="../css/blog.css" /> + <title>%(user)s's microblog</title> + </head> + <body> + <div class='mblog_title'>%(user)s</div> + """ % {'user':user}) + for entry in mblog_data: + timestamp = float(entry.get('timestamp',0)) + _datetime = datetime.fromtimestamp(timestamp) + request.write("<div class='mblog_content'><span class='mblog_timestamp'>%(date)s</span>%(content)s</div>" % { + 'date':_datetime, + 'content':sanitizeHtml(entry['content']).encode('utf-8')}) + request.write('</body></html>') + request.finish() + + def render_error_blog(self, error, request): + request.write(MicroBlog.ERROR_TEMPLATE % "Can't access requested data") + request.finish()