class Message(Stanza): """ Stanza-inheritor class that implements a message transfer with other entities. Contains fields corresponding to the protocol. Attributes: body -- string node 'body' subject -- string node 'subject' thread -- string attribue 'thread' html -- element node with XHtmlIm element """ elementName = 'message' body = fields.StringNode('body', required=False) #? subject = fields.StringNode('subject', required=False) thread = fields.StringNode('thread', required=False) html = fields.ElementNode(XHtmlIm, required=False) def clean_type_(self, value): """ Filters stanzas by type. Sets some correct type for invalid stanzas. """ if not value in ('normal', 'chat', 'groupchat', 'headline', 'error'): return 'normal' return value
class VCardQuery(Query): """ Extends Query class from twilix.stanzas. Contains fields with nodes for personal info. """ elementName = 'vCard' elementUri = 'vcard-temp' full_name = fields.StringNode('FN', required=False) name_ = fields.ElementNode('N', Name, required=False, listed=False) nickname = fields.StringNode('NICKNAME', required=False) url = fields.StringNode('URL', required=False) birthday = fields.StringNode('BDAY', required=False) organization = fields.ElementNode('ORG', Organization, required=False, listed=False) title = fields.StringNode('TITLE', required=False) role = fields.StringNode('ROLE', required=False) # telephones TODO # addresses TODO # emails TODO jid = fields.StringNode('JABBERID', required=False) description = fields.StringNode('DESC', required=False) photo = fields.ElementNode('PHOTO', Photo, required=False, listed=False)
class Organization(VElement): """ Extends VElement class from twilix.base. Used for representation organization data. Attributes: name -- string node 'ORGNAME' unit -- string node 'ORGUNIT' """ elementName = 'ORG' name_ = fields.StringNode('ORGNAME', required=False) unit = fields.StringNode('ORGUNIT', required=False)
class Form(VElement): elementName = 'x' elementUri = 'jabber:x:data' type_ = f.StringAttr('type') title = f.StringNode('title', required=False) instructions = f.StringNode('instructions', required=False) def clean_type_(self, value): if value not in ('form', 'submit', 'cancel', 'result'): raise ElementParseError return value def clean(self): if self.type_ != 'submit': return for fname in self.fields: field = getattr(self, fname) value = field.fclean(field.value) field.value = value @property def fields(self): fields = [] for name, attr in self.nodesProps.items(): if isinstance(attr, FormField): fields.append(name) return fields def make_submit_form(self): assert self.type_ == 'form' sform = copy.deepcopy(self) fields = sform.fields for name in fields: field = getattr(sform, name) field.prepare_to_submit() setattr(sform, name, field) sform.type_ = 'submit' sform.title = None sform.instructions = None return sform def make_cancel_form(self): assert self.type_ == 'form' sform = copy.deepcopy(self) sform.children = [] sform.type_ = 'cancel' return sform
class Error(VElement): """ Extends VElement from twilix.base. Contains fields corresponding to the rfc 3920. Attributes: type\_ -- string attribute 'type' condition -- condition node with Condition text -- string node 'text' """ elementName = 'error' type_ = fields.StringAttr('type') condition = ConditionNode(Condition) text = fields.StringNode('text', required=False, uri='urn:ietf:params:xml:ns:xmpp-stanzas') def clean_type_(self, value): """ Cut off errors with wrong type. Used for validaion. :returns: value if it has correct type. :raises: ElementParseError if value has a wrong type. """ if value not in ('cancel', 'continue', 'modify', 'auth', 'wait'): raise ElementParseError, 'Wrong Error Type %s' % value return value
class FileRequest(File): name_ = fields.StringAttr('name') size = fields.IntegerAttr('size') hash_ = fields.StringAttr('hash', required=False) date = fields.DateTimeAttr('date', required=False) description = fields.StringNode('desc', required=False) range_ = fields.ElementNode(Range, required=False)
class HtmlHead(VElement): """ Extends VElement class from twilix.base Realize head tag of html. """ elementName = 'head' profile = fields.StringAttr('profile', required=False) title = fields.StringNode('title')
class AppError(Error): """ Extends class Error. Contains field corresponding to the RFC-3920. Attributes: app_text -- string node 'text' """ app_text = fields.StringNode('text', required=False, uri='application-ns')
class Name(VElement): """ Extends VElement class from twilix.base. Used for representation name data. Attributes: family_name -- string node 'FAMILY' given_name -- string node 'GIVEN' middle_name -- string node 'MIDDLE' """ elementName = 'N' family_name = fields.StringNode('FAMILY', required=False) given_name = fields.StringNode('GIVEN', required=False) middle_name = fields.StringNode('MIDDLE', required=False)
class Presence(Stanza): """ Stanza-inheritor class that implements an entity's presence info. Contains fields corresponding to the protocol. Attributes: show -- string node 'show' status -- string node 'status' priority -- integer attribue 'priority' """ elementName = 'presence' show = fields.StringNode('show', required=False) status = fields.StringNode('status', required=False) priority = fields.IntegerNode('priority', required=False) def clean_type_(self, value): """ Filters stanzas by type. Sets None type for invalid stanzas. """ if not value in ('subscribe', 'subscribed', 'unsubscribe', 'unsubscribed', 'available', 'unavailable', 'probe', 'error'): return None return value @property def type_(self): """ Return type of presence when it's requested. If type is None return 'available'. """ v = self.__getattr__('type_') if not v: return 'available' return v
class VersionQuery(Query): """ Extends Query class. Base class for version queries. Attributes: client_name -- string node 'name' represents a general name of an entity client_version -- string node 'version' reprsent a version of an entity client_os -- string node 'os' represent an OS that used to run an entity """ elementUri = 'jabber:iq:version' client_name = fields.StringNode('name', required=False) client_version = fields.StringNode('version', required=False) client_os = fields.StringNode('os', required=False)
class UserItemInfo(VElement): """ VElement-inheritor class for user info from xml stanzas. Used in multi-user chat presences and also in administrator's queries. """ elementName = 'item' elementUri = 'http://jabber.org/protocol/muc#user' affiliation = fields.StringAttr('affiliation', required=False) role = fields.StringAttr('role', required=False) nick = fields.StringAttr('nick', required=False) jid = fields.JidAttr('jid', required=False) reason = fields.StringNode('reason', required=False)
class Photo(VElement): """ Extends VElement class from twilix.base. Used for representation photo data. Attributes: type\_ -- string node 'TYPE' binval -- base64 node 'BINVAL' """ elementName = 'PHOTO' type_ = fields.StringNode('TYPE', required=False) binval = fields.Base64Node('BINVAL', required=False)
class Field(VElement): elementName = 'field' fieldType = None # To be redefined in derived classes type_ = fields.StringAttr('type') label = fields.StringAttr('label', required=False) var = fields.StringAttr('var') required = fields.FlagNode('required', default=False, required=False) values = fields.StringNode('value', listed=True, required=False) options = fields.ElementNode(Option, listed=True, required=False) def __init__(self, value=None, *args, **kwargs): self.kwargs = kwargs super(Field, self).__init__(*args, **kwargs) self.type_ = self.fieldType self.value = value def prepare_to_submit(self): self.label = None self.options = () self.required = None def restore_for_validation(self, kwargs): self.options = kwargs.get('options') def clean_type_(self, value): if value == self.fieldType: return value raise WrongElement def fclean(self, values): if self.kwargs.get('required') and not values: raise ElementParseError, "Form field %s %s is required" % \ (self.var, self.type_) return values def _get_value(self): return self.values def _set_value(self, value): self.values = value def _del_value(self, value): self.values = () value = property(_get_value, _set_value, _del_value)
class RegisterQuery(Query): """ Extends Query class. Contains special fields described in XEP-0077 for register query. Attributes: instructions -- string node 'instructions' registered -- flag node 'registered' remove -- flag node 'remove' """ elementUri = 'jabber:iq:register' instructions = fields.StringNode('instructions', required=False) registered = fields.FlagNode('registered', required=False) aremove = fields.FlagNode('remove', required=False)
class RosterItem(VElement): """ Class for xml roster item node. Inheritor of VElement. Attributes: jid -- jid attribute 'jid' subscription -- string attribute 'subscription' ask -- string attribute 'ask' nick -- string attribute 'name' groups -- string attribute 'group' """ elementName = 'item' elementUri = 'jabber:iq:roster' jid = fields.JidAttr('jid') subscription = fields.StringAttr('subscription', required=False) ask = fields.StringAttr('ask', required=False) nick = fields.StringAttr('name', required=False) groups = fields.StringNode('group', required=False, listed=True, unique=True) def __init__(self, **kwargs): super(RosterItem, self).__init__(**kwargs) self.presences = {} def is_online(self): return bool(self.presences) def __unicode__(self): """Unicode converter.""" return '<RosterItem %s %s, subscription %s>' % \ (self.jid, self.nick, self.subscription) def __repr__(self): return self.__unicode__()
class Option(VElement): elementName = 'option' label = fields.StringAttr('label', required=False) value = fields.StringNode('value')