Updated error stanza to be PEP8 compliant and include documentation.

This commit is contained in:
Lance Stout 2010-07-29 11:06:10 -04:00
parent d148f633f3
commit 25f43bd219

View file

@ -5,58 +5,127 @@
See the file LICENSE for copying permission. See the file LICENSE for copying permission.
""" """
from .. xmlstream.stanzabase import registerStanzaPlugin, ElementBase, ET
from sleekxmpp.xmlstream.stanzabase import registerStanzaPlugin
from sleekxmpp.xmlstream.stanzabase import ElementBase, ET
class Error(ElementBase): class Error(ElementBase):
namespace = 'jabber:client'
name = 'error'
plugin_attrib = 'error'
conditions = set(('bad-request', 'conflict', 'feature-not-implemented', 'forbidden', 'gone', 'internal-server-error', 'item-not-found', 'jid-malformed', 'not-acceptable', 'not-allowed', 'not-authorized', 'payment-required', 'recipient-unavailable', 'redirect', 'registration-required', 'remote-server-not-found', 'remote-server-timeout', 'resource-constraint', 'service-unavailable', 'subscription-required', 'undefined-condition', 'unexpected-request'))
interfaces = set(('code', 'condition', 'text', 'type'))
types = set(('cancel', 'continue', 'modify', 'auth', 'wait'))
sub_interfaces = set(('text',))
condition_ns = 'urn:ietf:params:xml:ns:xmpp-stanzas'
def setup(self, xml=None): """
if ElementBase.setup(self, xml): #if we had to generate xml XMPP stanzas of type 'error' should include an <error> stanza that
self['type'] = 'cancel' describes the nature of the error and how it should be handled.
self['condition'] = 'feature-not-implemented'
if self.parent is not None:
self.parent()['type'] = 'error'
def getCondition(self): Use the 'XEP-0086: Error Condition Mappings' plugin to include error
for child in self.xml.getchildren(): codes used in older XMPP versions.
if "{%s}" % self.condition_ns in child.tag:
return child.tag.split('}', 1)[-1]
return ''
def setCondition(self, value): Example error stanza:
if value in self.conditions: <error type="cancel" code="404">
for child in self.xml.getchildren(): <item-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
if "{%s}" % self.condition_ns in child.tag: <text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">
self.xml.remove(child) The item was not found.
condition = ET.Element("{%s}%s" % (self.condition_ns, value)) </text>
self.xml.append(condition) </error>
return self
def delCondition(self): Stanza Interface:
return self code -- The error code used in older XMPP versions.
condition -- The name of the condition element.
text -- Human readable description of the error.
type -- Error type indicating how the error should be handled.
def getText(self): Attributes:
text = '' conditions -- The set of allowable error condition elements.
textxml = self.xml.find("{urn:ietf:params:xml:ns:xmpp-stanzas}text") condition_ns -- The namespace for the condition element.
if textxml is not None: types -- A set of values indicating how the error
text = textxml.text should be treated.
return text
def setText(self, value): Methods:
self.delText() setup -- Overrides ElementBase.setup.
textxml = ET.Element('{urn:ietf:params:xml:ns:xmpp-stanzas}text') getCondition -- Retrieve the name of the condition element.
textxml.text = value setCondition -- Add a condition element.
self.xml.append(textxml) delCondition -- Remove the condition element.
return self getText -- Retrieve the contents of the <text> element.
setText -- Set the contents of the <text> element.
delText -- Remove the <text> element.
"""
def delText(self): namespace = 'jabber:client'
textxml = self.xml.find("{urn:ietf:params:xml:ns:xmpp-stanzas}text") name = 'error'
if textxml is not None: plugin_attrib = 'error'
self.xml.remove(textxml) interfaces = set(('code', 'condition', 'text', 'type'))
sub_interfaces = set(('text',))
conditions = set(('bad-request', 'conflict', 'feature-not-implemented',
'forbidden', 'gone', 'internal-server-error',
'item-not-found', 'jid-malformed', 'not-acceptable',
'not-allowed', 'not-authorized', 'payment-required',
'recipient-unavailable', 'redirect',
'registration-required', 'remote-server-not-found',
'remote-server-timeout', 'resource-constraint',
'service-unavailable', 'subscription-required',
'undefined-condition', 'unexpected-request'))
condition_ns = 'urn:ietf:params:xml:ns:xmpp-stanzas'
types = set(('cancel', 'continue', 'modify', 'auth', 'wait'))
def setup(self, xml=None):
"""
Populate the stanza object using an optional XML object.
Overrides ElementBase.setup.
Sets a default error type and condition, and changes the
parent stanza's type to 'error'.
Arguments:
xml -- Use an existing XML object for the stanza's values.
"""
if ElementBase.setup(self, xml):
#If we had to generate XML then set default values.
self['type'] = 'cancel'
self['condition'] = 'feature-not-implemented'
if self.parent is not None:
self.parent()['type'] = 'error'
def getCondition(self):
"""Return the condition element's name."""
for child in self.xml.getchildren():
if "{%s}" % self.condition_ns in child.tag:
return child.tag.split('}', 1)[-1]
return ''
def setCondition(self, value):
"""
Set the tag name of the condition element.
Arguments:
value -- The tag name of the condition element.
"""
if value in self.conditions:
del self['condition']
self.xml.append(ET.Element("{%s}%s" % (self.condition_ns, value)))
return self
def delCondition(self):
"""Remove the condition element."""
for child in self.xml.getchildren():
if "{%s}" % self.condition_ns in child.tag:
self.xml.remove(child)
return self
def getText(self):
"""Retrieve the contents of the <text> element."""
return self._getSubText('{%s}text' % self.condition_ns)
def setText(self, value):
"""
Set the contents of the <text> element.
Arguments:
value -- The new contents for the <text> element.
"""
self._setSubText('{%s}text' % self.condition_ns, text=value)
return self
def delText(self):
"""Remove the <text> element."""
self._delSub('{%s}text' % self.condition_ns)
return self