コード例 #1
0
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
コード例 #2
0
ファイル: vcard.py プロジェクト: rogovvladimir/twilix
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)
コード例 #3
0
ファイル: vcard.py プロジェクト: rogovvladimir/twilix
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)
コード例 #4
0
ファイル: __init__.py プロジェクト: rogovvladimir/twilix
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
コード例 #5
0
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
コード例 #6
0
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)
コード例 #7
0
ファイル: htmlim.py プロジェクト: rogovvladimir/twilix
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')
コード例 #8
0
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')
コード例 #9
0
ファイル: vcard.py プロジェクト: rogovvladimir/twilix
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)
コード例 #10
0
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
コード例 #11
0
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)
コード例 #12
0
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)
コード例 #13
0
ファイル: vcard.py プロジェクト: rogovvladimir/twilix
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)
コード例 #14
0
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)
コード例 #15
0
ファイル: register.py プロジェクト: rogovvladimir/twilix
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)
コード例 #16
0
ファイル: __init__.py プロジェクト: rogovvladimir/twilix
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__()
コード例 #17
0
class Option(VElement):
    elementName = 'option'

    label = fields.StringAttr('label', required=False)
    value = fields.StringNode('value')