diff --git a/sleekxmpp/plugins/stanza_pubsub.py b/sleekxmpp/plugins/stanza_pubsub.py index 96d02f9..01aac09 100644 --- a/sleekxmpp/plugins/stanza_pubsub.py +++ b/sleekxmpp/plugins/stanza_pubsub.py @@ -284,6 +284,14 @@ class DefaultConfig(ElementBase): t = self._getAttr('type') if not t: t = 'leaf' return t + + def getConfig(self): + return self['form'] + + def setConfig(self, value): + self['form'].setStanzaValues(value.getStanzaValues()) + print self['form']['title'] + return self registerStanzaPlugin(PubsubOwner, DefaultConfig) registerStanzaPlugin(DefaultConfig, xep_0004.Form) @@ -356,8 +364,17 @@ class OwnerDefault(OwnerConfigure): interfaces = set(('node', 'config')) plugin_attrib_map = {} plugin_tag_map = {} + + def getConfig(self): + return self['form'] + + def setConfig(self, value): + self['form'].setStanzaValues(value.getStanzaValues()) + print self['from']['title'] + return self registerStanzaPlugin(PubsubOwner, OwnerDefault) +registerStanzaPlugin(OwnerDefault, xep_0004.Form) class OwnerDelete(ElementBase, OptionalSetting): namespace = 'http://jabber.org/protocol/pubsub#owner' diff --git a/sleekxmpp/plugins/xep_0004.py b/sleekxmpp/plugins/xep_0004.py index 8696363..9e67e65 100644 --- a/sleekxmpp/plugins/xep_0004.py +++ b/sleekxmpp/plugins/xep_0004.py @@ -31,6 +31,7 @@ class Form(ElementBase): ElementBase.__init__(self, *args, **kwargs) if title is not None: self['title'] = title + self.field = FieldAccessor(self) def setup(self, xml=None): if ElementBase.setup(self, xml): #if we had to generate xml @@ -111,7 +112,7 @@ class Form(ElementBase): reportedXML = self.xml.find('{%s}reported' % self.namespace) if reportedXML is not None: self.xml.remove(reportedXML) - + def getFields(self, use_dict=False): fields = {} if use_dict else [] fieldsXML = self.xml.findall('{%s}field' % FormField.namespace) @@ -195,6 +196,27 @@ class Form(ElementBase): fields = self.getFields(use_dict=True) for field in values: fields[field]['value'] = values[field] + + def merge(self, other): + new = copy.copy(self) + nfields = new.getFields(use_dict=True) + ofields = other.getFields(use_dict=True) + nfields.update(ofields) + new.setFields([(x, nfields[x]) for x in nfields]) + return new + +class FieldAccessor(object): + def __init__(self, form): + self.form = form + + def __getitem__(self, key): + return self.form.getFields(use_dict=True)[key] + + def __contains__(self, key): + return key in self.form.getFields(use_dict=True) + + def has_key(self, key): + return key in self.form.getFields(use_dict=True) class FormField(ElementBase): diff --git a/sleekxmpp/plugins/xep_0060.py b/sleekxmpp/plugins/xep_0060.py index a92a384..0b056f0 100644 --- a/sleekxmpp/plugins/xep_0060.py +++ b/sleekxmpp/plugins/xep_0060.py @@ -4,6 +4,7 @@ import logging #from xml.etree import cElementTree as ET from .. xmlstream.stanzabase import registerStanzaPlugin, ElementBase, ET from . import stanza_pubsub +from . xep_0004 import Form class xep_0060(base.base_plugin): """ @@ -41,7 +42,8 @@ class xep_0060(base.base_plugin): submitform.field['pubsub#node_type'].setValue('leaf') else: submitform.addField('pubsub#node_type', value='leaf') - configure.append(submitform.getXML('submit')) + submitform['type'] = 'submit' + configure.append(submitform.xml) pubsub.append(configure) iq = self.xmpp.makeIqSet(pubsub) iq.attrib['to'] = jid @@ -117,7 +119,7 @@ class xep_0060(base.base_plugin): if not form or form is None: logging.error("No form found.") return False - return self.xmpp.plugin['xep_0004'].buildForm(form) + return Form(xml=form) def getNodeSubscriptions(self, jid, node): pubsub = ET.Element('{http://jabber.org/protocol/pubsub#owner}pubsub') diff --git a/sleekxmpp/xmlstream/jid.py b/sleekxmpp/xmlstream/jid.py index 292abd9..3e99711 100644 --- a/sleekxmpp/xmlstream/jid.py +++ b/sleekxmpp/xmlstream/jid.py @@ -59,24 +59,24 @@ class JID(object): if name == 'resource': if self._resource is None: self._resource = self._jid.split('/', 1)[-1] - return self._resource + return self._resource or "" elif name == 'user': if self._user is None: if '@' in self._jid: self._user = self._jid.split('@', 1)[0] else: self._user = self._user - return self._user + return self._user or "" elif name in ('server', 'domain'): if self._domain is None: self._domain = self._jid.split('@', 1)[-1].split('/', 1)[0] - return self._domain + return self._domain or "" elif name == 'full': - return self._jid + return self._jid or "" elif name == 'bare': if self._bare is None: self._bare = self._jid.split('/', 1)[0] - return self._bare + return self._bare or "" def __setattr__(self, name, value): """ diff --git a/sleekxmpp/xmlstream/stanzabase.py b/sleekxmpp/xmlstream/stanzabase.py index 3223901..7458f3c 100644 --- a/sleekxmpp/xmlstream/stanzabase.py +++ b/sleekxmpp/xmlstream/stanzabase.py @@ -362,7 +362,10 @@ class ElementBase(object): self.idx = 0 return self - def __bool__(self): + def __bool__(self): #python 3.x + return True + + def __nonzero__(self): #python 2.x return True def __next__(self):