# HG changeset patch # User Goffi # Date 1384450551 -3600 # Node ID 80e9d3ecb272623feb068569bd3bdd2d24942db0 # Parent 6c8a119dcc9418de3e902887a3dffd3602673c6d plugin XEP-0277, group blog: rich text management for sending microblogs diff -r 6c8a119dcc94 -r 80e9d3ecb272 src/plugins/plugin_misc_groupblog.py --- 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 diff -r 6c8a119dcc94 -r 80e9d3ecb272 src/plugins/plugin_xep_0277.py --- 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'
%s
' % (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