changeset 706:80e9d3ecb272

plugin XEP-0277, group blog: rich text management for sending microblogs
author Goffi <goffi@goffi.org>
date Thu, 14 Nov 2013 18:35:51 +0100
parents 6c8a119dcc94
children 890fbf2d7fdd
files src/plugins/plugin_misc_groupblog.py src/plugins/plugin_xep_0277.py
diffstat 2 files changed, 53 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/plugin_misc_groupblog.py	Thu Nov 14 17:53:47 2013 +0100
+++ b/src/plugins/plugin_misc_groupblog.py	Thu Nov 14 18:35:51 2013 +0100
@@ -250,9 +250,12 @@
         @param message: message to publish
         @param extra: dict which option name as key, which can be:
             - allow_comments: True to accept comments, False else (default: False)
+            - rich: if present, contain rich text in currently selected syntax
         """
         node_name = self.getNodeName(client.jid)
         mblog_data = {'content': message}
+        if 'rich' in extra:
+            mblog_data['rich'] = extra['rich']
         P = self.host.plugins["XEP-0060"]
         access_model_value = ACCESS_TYPE_MAP[access_type]
 
@@ -275,29 +278,33 @@
             #        node owned by somebody else)
             defer_blog = self.host.plugins["XEP-0060"].createNode(service, comments_node, _options, profile_key=client.profile)
 
-        mblog_item = self.host.plugins["XEP-0277"].data2entry(mblog_data, client.profile)
-        form = data_form.Form('submit', formNamespace=NS_PUBSUB_ITEM_CONFIG)
+        def itemCreated(mblog_item):
+            form = data_form.Form('submit', formNamespace=NS_PUBSUB_ITEM_CONFIG)
 
-        if access_type == "PUBLIC":
-            if access_list:
-                raise BadAccessListError("access_list must be empty for PUBLIC access")
-            access = data_form.Field(None, P.OPT_ACCESS_MODEL, value=access_model_value)
-            form.addField(access)
-        elif access_type == "GROUP":
-            access = data_form.Field(None, P.OPT_ACCESS_MODEL, value=access_model_value)
-            allowed = data_form.Field(None, P.OPT_ROSTER_GROUPS_ALLOWED, values=access_list)
-            form.addField(access)
-            form.addField(allowed)
-            mblog_item.addChild(form.toElement())
-        elif access_type == "JID":
-            raise NotImplementedError
-        else:
-            error(_("Unknown access_type"))
-            raise BadAccessTypeError
+            if access_type == "PUBLIC":
+                if access_list:
+                    raise BadAccessListError("access_list must be empty for PUBLIC access")
+                access = data_form.Field(None, P.OPT_ACCESS_MODEL, value=access_model_value)
+                form.addField(access)
+            elif access_type == "GROUP":
+                access = data_form.Field(None, P.OPT_ACCESS_MODEL, value=access_model_value)
+                allowed = data_form.Field(None, P.OPT_ROSTER_GROUPS_ALLOWED, values=access_list)
+                form.addField(access)
+                form.addField(allowed)
+                mblog_item.addChild(form.toElement())
+            elif access_type == "JID":
+                raise NotImplementedError
+            else:
+                error(_("Unknown access_type"))
+                raise BadAccessTypeError
 
-        defer_blog = self.host.plugins["XEP-0060"].publish(service, node_name, items=[mblog_item], profile_key=client.profile)
-        defer_blog.addErrback(self._mblogPublicationFailed)
-        return defer_blog
+            defer_blog = self.host.plugins["XEP-0060"].publish(service, node_name, items=[mblog_item], profile_key=client.profile)
+            defer_blog.addErrback(self._mblogPublicationFailed)
+            return defer_blog
+
+        entry_d =  self.host.plugins["XEP-0277"].data2entry(mblog_data, client.profile)
+        entry_d.addCallback(itemCreated)
+        return entry_d
 
     def _mblogPublicationFailed(self, failure):
         #TODO
@@ -311,6 +318,7 @@
         @param message: microblog
         @param extra: dict which option name as key, which can be:
             - allow_comments: True to accept comments, False else (default: False)
+            - rich: if present, contain rich text in currently selected syntax
         @profile_key: %(doc_profile)s
         """
 
@@ -347,9 +355,9 @@
         service, node = self.host.plugins["XEP-0277"].parseCommentUrl(node_url)
 
         mblog_data = {'content': message}
-        mblog_item = self.host.plugins["XEP-0277"].data2entry(mblog_data, profile)
-
-        return self.host.plugins["XEP-0060"].publish(service, node, items=[mblog_item], profile_key=profile)
+        entry_d = self.host.plugins["XEP-0277"].data2entry(mblog_data, profile)
+        entry_d.addCallback(lambda mblog_item: self.host.plugins["XEP-0060"].publish(service, node, items=[mblog_item], profile_key=profile))
+        return entry_d
 
     def _itemsConstruction(self, items, pub_jid, client):
         """ Transforms items to group blog data and manage comments node
--- a/src/plugins/plugin_xep_0277.py	Thu Nov 14 17:53:47 2013 +0100
+++ b/src/plugins/plugin_xep_0277.py	Thu Nov 14 18:35:51 2013 +0100
@@ -19,6 +19,7 @@
 
 from logging import debug, info, warning, error
 from twisted.words.protocols.jabber import jid
+from twisted.internet import defer
 from sat.core import exceptions
 from sat.tools.xml_tools import ElementParser
 
@@ -27,15 +28,17 @@
 import uuid
 from time import time
 import urlparse
+from cgi import escape
 
 NS_MICROBLOG = 'urn:xmpp:microblog:0'
+NS_XHTML = 'http://www.w3.org/1999/xhtml'
 
 PLUGIN_INFO = {
     "name": "Microblogging over XMPP Plugin",
     "import_name": "XEP-0277",
     "type": "XEP",
     "protocols": [],
-    "dependencies": ["XEP-0163", "XEP-0060"],
+    "dependencies": ["XEP-0163", "XEP-0060", "TEXT-SYNTAXES"],
     "main": "XEP_0277",
     "handler": "no",
     "description": _("""Implementation of microblogging Protocol""")
@@ -130,15 +133,24 @@
             microblog_data = self.item2mbdata(item)
             self.host.bridge.personalEvent(itemsEvent.sender.full(), "MICROBLOG", microblog_data, profile)
 
+    @defer.inlineCallbacks
     def data2entry(self, data, profile):
         """Convert a data dict to en entry usable to create an item
         @param data: data dict as given by bridge method
-        @return: domish.Element"""
+        @return: deferred which fire domish.Element"""
         _uuid = unicode(uuid.uuid1())
-        content = data['content']
         _entry = atom.Entry()
-        #FIXME: need to escape html
+
+        if "rich" in data:
+            synt = self.host.plugins["TEXT-SYNTAXES"]
+            converted = yield synt.convert(data['rich'], synt.getCurrentSyntax(profile), "XHTML")
+            content = u'<div xmlns="%s">%s</div>' % (NS_XHTML, converted)
+            _entry.title.attrs['type'] = 'xhtml'
+        else:
+            content = escape(data['content'])
+            _entry.title.attrs['type'] = 'text'
         _entry.title = unicode(content).encode('utf-8')
+
         _entry.author = atom.Author()
         _entry.author.name = data.get('author', self.host.getJidNStream(profile)[0].userhost()).encode('utf-8')
         _entry.updated = float(data.get('timestamp', time()))
@@ -152,8 +164,9 @@
         _entry_elt = ElementParser()(str(_entry).decode('utf-8'))
         item = pubsub.Item(payload=_entry_elt)
         item['id'] = _uuid
-        return item
+        defer.returnValue(item)
 
+    @defer.inlineCallbacks
     def sendMicroblog(self, data, profile):
         """Send XEP-0277's microblog data
         @param data: must include content
@@ -165,8 +178,9 @@
         if not content:
             error(_("Microblog data's content value must not be empty"))
             raise exceptions.DataError('empty content')
-        item = self.data2entry(data, profile)
-        return self.host.plugins["XEP-0060"].publish(None, NS_MICROBLOG, [item], profile_key=profile)
+        item = yield self.data2entry(data, profile)
+        ret = yield self.host.plugins["XEP-0060"].publish(None, NS_MICROBLOG, [item], profile_key=profile)
+        defer.returnValue(ret)
 
     def getLastMicroblogs(self, pub_jid, max_items=10, profile_key='@DEFAULT@'):
         """Get the last published microblogs