[1] | 1 | # Copyright (c) 2003-2007 Ralph Meijer |
---|
| 2 | # See LICENSE for details. |
---|
| 3 | |
---|
| 4 | from twisted.words.xish import domish |
---|
| 5 | |
---|
| 6 | NS_X_DATA = 'jabber:x:data' |
---|
| 7 | |
---|
| 8 | class Field(domish.Element): |
---|
| 9 | def __init__(self, type='text-single', var=None, label=None, |
---|
| 10 | value=None, values=[], options={}): |
---|
| 11 | domish.Element.__init__(self, (NS_X_DATA, 'field')) |
---|
| 12 | self['type'] = type |
---|
| 13 | if var is not None: |
---|
| 14 | self['var'] = var |
---|
| 15 | if label is not None: |
---|
| 16 | self['label'] = label |
---|
| 17 | if value is not None: |
---|
| 18 | self.set_value(value) |
---|
| 19 | else: |
---|
| 20 | self.set_values(values) |
---|
| 21 | if type in ['list-single', 'list-multi']: |
---|
| 22 | for value, label in options.iteritems(): |
---|
| 23 | self.addChild(Option(value, label)) |
---|
| 24 | |
---|
| 25 | def set_value(self, value): |
---|
| 26 | if self['type'] == 'boolean': |
---|
| 27 | value = str(int(bool(value))) |
---|
| 28 | else: |
---|
| 29 | value = str(value) |
---|
| 30 | |
---|
| 31 | value_element = self.value or self.addElement('value') |
---|
| 32 | value_element.children = [] |
---|
| 33 | value_element.addContent(value) |
---|
| 34 | |
---|
| 35 | def set_values(self, values): |
---|
| 36 | for value in values: |
---|
| 37 | value = str(value) |
---|
| 38 | self.addElement('value', content=value) |
---|
| 39 | |
---|
| 40 | class Option(domish.Element): |
---|
| 41 | def __init__(self, value, label=None): |
---|
| 42 | domish.Element.__init__(self, (NS_X_DATA, 'option')) |
---|
| 43 | if label is not None: |
---|
| 44 | self['label'] = label |
---|
| 45 | self.addElement('value', content=value) |
---|
| 46 | |
---|
| 47 | class Form(domish.Element): |
---|
| 48 | def __init__(self, type, form_type): |
---|
| 49 | domish.Element.__init__(self, (NS_X_DATA, 'x'), |
---|
| 50 | attribs={'type': type}) |
---|
| 51 | self.add_field(type='hidden', var='FORM_TYPE', values=[form_type]) |
---|
| 52 | |
---|
| 53 | def add_field(self, type='text-single', var=None, label=None, |
---|
| 54 | value=None, values=[], options={}): |
---|
| 55 | self.addChild(Field(type, var, label, value, values, options)) |
---|