Changeset 105:5d8f1609aaf3
- Timestamp:
- Nov 9, 2011, 6:44:36 PM (9 years ago)
- Branch:
- default
- Children:
- 155:8b2ed9549399, 159:bbb746f79718
- Location:
- wokkel
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
wokkel/data_form.py
r96 r105 13 13 """ 14 14 15 from zope.interface import implements 16 from zope.interface.common import mapping 15 17 from twisted.words.protocols.jabber.jid import JID 16 18 from twisted.words.xish import domish … … 48 50 @type value: C{unicode} 49 51 @ivar label: Optional label for this option. 50 @type label: C{unicode} or C{NoneType} .52 @type label: C{unicode} or C{NoneType} 51 53 """ 52 54 … … 95 97 @ivar fieldType: Type of this field. One of C{'boolean'}, C{'fixed'}, 96 98 C{'hidden'}, C{'jid-multi'}, C{'jid-single'}, 97 C{'list-multi'}, {'list-single'}, C{'text-multi'},99 C{'list-multi'}, C{'list-single'}, C{'text-multi'}, 98 100 C{'text-private'}, C{'text-single'}. 99 101 100 102 The default is C{'text-single'}. 101 103 @type fieldType: C{str} 102 @ivar var: Field name. Optional if L{fieldType} is C{'fixed'}.104 @ivar var: Field name. Optional if C{fieldType} is C{'fixed'}. 103 105 @type var: C{str} 104 106 @ivar label: Human readable label for this field. … … 109 111 @ivar options: List of possible values to choose from in a response 110 112 to this form as a list of L{Option}s. 111 @type options: C{list} .113 @type options: C{list} 112 114 @ivar desc: Human readable description for this field. 113 115 @type desc: C{unicode} 114 116 @ivar required: Whether the field is required to be provided in a 115 117 response to this form. 116 @type required: C{bool} .118 @type required: C{bool} 117 119 """ 118 120 … … 366 368 is recorded in the C{formNamespace} instance variable. 367 369 370 A L{Form} also acts as read-only dictionary, with the values of fields 371 keyed by their name. See L{__getitem__}. 372 368 373 @ivar formType: Type of form. One of C{'form'}, C{'submit'}, {'cancel'}, 369 374 or {'result'}. … … 379 384 @ivar formNamespace: The optional namespace of the field names for this 380 385 form. This goes in the special field named C{'FORM_TYPE'}, if set. 381 @type formNamespace: C{str} .386 @type formNamespace: C{str} 382 387 383 388 @ivar fields: Dictionary of named fields. Note that this is meant to be … … 390 395 @type fieldList: C{list} 391 396 """ 397 398 implements(mapping.IIterableMapping, 399 mapping.IEnumerableMapping, 400 mapping.IReadMapping, 401 mapping.IItemMapping) 392 402 393 403 def __init__(self, formType, title=None, instructions=None, … … 469 479 is rendered using L{toElement}, these fields will have no C{'type'} 470 480 attribute, and it is up to the receiving party to interpret the values 471 properly (e.g. by knowing about the FORM_TYPE in L{formNamespace} and481 properly (e.g. by knowing about the FORM_TYPE in C{formNamespace} and 472 482 the field name). 473 483 … … 568 578 569 579 580 def __iter__(self): 581 return iter(self.fields) 582 583 584 def __len__(self): 585 return len(self.fields) 586 587 588 def __getitem__(self, key): 589 """ 590 Called to implement evaluation of self[key]. 591 592 This returns the value of the field with the name in C{key}. For 593 multi-value fields, the value is a list, otherwise a single value. 594 595 If a field has no type, and the field has multiple values, the value 596 of the list of values. Otherwise, it will be a single value. 597 598 Raises C{KeyError} if there is no field with the name in C{key}. 599 """ 600 field = self.fields[key] 601 602 if (field.fieldType in ('jid-multi', 'list-multi', 'text-multi') or 603 (field.fieldType is None and len(field.values) > 1)): 604 value = field.values 605 else: 606 value = field.value 607 608 return value 609 610 611 def get(self, key, default=None): 612 try: 613 return self[key] 614 except KeyError: 615 return default 616 617 618 def __contains__(self, key): 619 return key in self.fields 620 621 622 def iterkeys(self): 623 return iter(self) 624 625 626 def itervalues(self): 627 for key in self: 628 yield self[key] 629 630 631 def iteritems(self): 632 for key in self: 633 yield (key, self[key]) 634 635 636 def keys(self): 637 return list(self) 638 639 640 def values(self): 641 return list(self.itervalues()) 642 643 644 def items(self): 645 return list(self.iteritems()) 646 647 570 648 def getValues(self): 571 649 """ … … 573 651 574 652 For all named fields, the corresponding value or values are 575 returned in a dictionary keyed by the field name. For multi-value 576 fields, the dictionary value is a list, otherwise a single value. 577 578 If a field has no type, and the field has multiple values, the value of 579 the dictionary entry is the list of values. Otherwise, it will be a 580 single value. 581 653 returned in a dictionary keyed by the field name. This is equivalent 654 do C{dict(f)}, where C{f} is a L{Form}. 655 656 @see: L{__getitem__} 582 657 @rtype: C{dict} 583 658 """ 584 values = {} 585 586 for name, field in self.fields.iteritems(): 587 if (field.fieldType in ('jid-multi', 'list-multi', 'text-multi') or 588 (field.fieldType is None and len(field.values) > 1)): 589 value = field.values 590 else: 591 value = field.value 592 593 values[name] = value 594 595 return values 659 return dict(self) 596 660 597 661 -
wokkel/disco.py
r103 r105 210 210 item = data_form.Form.fromElement(child) 211 211 212 if item :212 if item is not None: 213 213 info.append(item) 214 214 -
wokkel/pubsub.py
r97 r105 385 385 """ 386 386 form = data_form.findForm(verbElement, NS_PUBSUB_NODE_CONFIG) 387 if form and form.formType == 'submit':387 if form is not None and form.formType == 'submit': 388 388 values = form.getValues() 389 389 self.nodeType = values.get('pubsub#node_type', 'leaf') … … 397 397 """ 398 398 form = data_form.findForm(verbElement, NS_PUBSUB_NODE_CONFIG) 399 if form :399 if form is not None: 400 400 if form.formType in ('submit', 'cancel'): 401 401 self.options = form … … 413 413 if element.uri == NS_PUBSUB and element.name == 'configure': 414 414 form = data_form.findForm(element, NS_PUBSUB_NODE_CONFIG) 415 if form :415 if form is not None: 416 416 if form.formType != 'submit': 417 417 raise BadRequest(text=u"Unexpected form type '%s'" % … … 497 497 """ 498 498 form = data_form.findForm(verbElement, NS_PUBSUB_SUBSCRIBE_OPTIONS) 499 if form :499 if form is not None: 500 500 if form.formType in ('submit', 'cancel'): 501 501 self.options = form … … 516 516 form = data_form.findForm(element, 517 517 NS_PUBSUB_SUBSCRIBE_OPTIONS) 518 if form :518 if form is not None: 519 519 if form.formType != 'submit': 520 520 raise BadRequest(text=u"Unexpected form type '%s'" % … … 527 527 528 528 def _render_optionsWithSubscribe(self, verbElement): 529 if self.options :529 if self.options is not None: 530 530 optionsElement = verbElement.parent.addElement('options') 531 531 self._render_options(optionsElement) … … 1195 1195 1196 1196 handler = getattr(self, handlerName) 1197 1198 1197 args = [getattr(request, arg) for arg in argNames] 1199 if 'options' in argNames:1200 args[argNames.index('options')] = request.options.getValues()1201 1202 1198 d = handler(*args) 1203 1199 -
wokkel/test/test_data_form.py
r96 r105 5 5 Tests for {wokkel.data_form}. 6 6 """ 7 8 from zope.interface import verify 9 from zope.interface.common.mapping import IIterableMapping 7 10 8 11 from twisted.trial import unittest … … 473 476 element = domish.Element((NS_X_DATA, 'field')) 474 477 element['var'] = 'test' 475 child =element.addElement(('myns', 'value'))478 element.addElement(('myns', 'value')) 476 479 field = data_form.Field.fromElement(element) 477 480 … … 989 992 990 993 991 def test_getValues(self): 992 """ 993 Each named field is represented in the values, keyed by name. 994 def test_interface(self): 995 """ 996 L{Form}s act as a read-only dictionary. 997 """ 998 form = data_form.Form('submit') 999 verify.verifyObject(IIterableMapping, form) 1000 1001 1002 def test_getitem(self): 1003 """ 1004 Using Form as a mapping will yield the value of fields keyed by name. 994 1005 """ 995 1006 fields = [data_form.Field(var='botname', value='The Jabber Bot'), … … 998 1009 values=['news', 'search'])] 999 1010 form = data_form.Form('submit', fields=fields) 1000 values = form.getValues() 1011 self.assertEqual('The Jabber Bot', form['botname']) 1012 self.assertTrue(form['public']) 1013 self.assertEqual(['news', 'search'], form['features']) 1014 1015 1016 def test_getitemOneValueTypeMulti(self): 1017 """ 1018 A single value for a multi-value field type is returned in a list. 1019 """ 1020 fields = [data_form.Field('list-multi', var='features', 1021 values=['news'])] 1022 form = data_form.Form('submit', fields=fields) 1023 self.assertEqual(['news'], form['features']) 1024 1025 1026 def test_getitemMultipleValuesNoType(self): 1027 """ 1028 Multiple values for a field without type are returned in a list. 1029 """ 1030 fields = [data_form.Field(None, var='features', 1031 values=['news', 'search'])] 1032 form = data_form.Form('submit', fields=fields) 1033 self.assertEqual(['news', 'search'], form['features']) 1034 1035 1036 def test_getitemMultipleValuesTypeSingle(self): 1037 """ 1038 Multiple values for a single-value field type returns the first value. 1039 """ 1040 fields = [data_form.Field('text-single', var='features', 1041 values=['news', 'search'])] 1042 form = data_form.Form('submit', fields=fields) 1043 self.assertEqual('news', form['features']) 1044 1045 1046 def test_get(self): 1047 """ 1048 Getting the value of a known field succeeds. 1049 """ 1050 fields = [data_form.Field(var='botname', value='The Jabber Bot')] 1051 form = data_form.Form('submit', fields=fields) 1052 self.assertEqual('The Jabber Bot', form.get('botname')) 1053 1054 1055 def test_getUnknownNone(self): 1056 """ 1057 Getting the value of a unknown field returns None. 1058 """ 1059 fields = [data_form.Field(var='botname', value='The Jabber Bot')] 1060 form = data_form.Form('submit', fields=fields) 1061 self.assertIdentical(None, form.get('features')) 1062 1063 1064 def test_getUnknownDefault(self): 1065 """ 1066 Getting the value of a unknown field returns specified default. 1067 """ 1068 fields = [data_form.Field(var='botname', value='The Jabber Bot')] 1069 form = data_form.Form('submit', fields=fields) 1070 self.assertTrue(form.get('public', True)) 1071 1072 1073 def test_contains(self): 1074 """ 1075 A form contains a known field. 1076 """ 1077 fields = [data_form.Field(var='botname', value='The Jabber Bot')] 1078 form = data_form.Form('submit', fields=fields) 1079 self.assertIn('botname', form) 1080 1081 1082 def test_containsNot(self): 1083 """ 1084 A form does not contains an unknown field. 1085 """ 1086 fields = [data_form.Field(var='botname', value='The Jabber Bot')] 1087 form = data_form.Form('submit', fields=fields) 1088 self.assertNotIn('features', form) 1089 1090 1091 def test_iterkeys(self): 1092 """ 1093 Iterating over the keys of a form yields all field names. 1094 """ 1095 fields = [data_form.Field(var='botname', value='The Jabber Bot'), 1096 data_form.Field('boolean', var='public', value=True), 1097 data_form.Field('list-multi', var='features', 1098 values=['news', 'search'])] 1099 form = data_form.Form('submit', fields=fields) 1100 self.assertEqual(set(['botname', 'public', 'features']), 1101 set(form.iterkeys())) 1102 1103 1104 def test_itervalues(self): 1105 """ 1106 Iterating over the values of a form yields all field values. 1107 """ 1108 fields = [data_form.Field(var='botname', value='The Jabber Bot'), 1109 data_form.Field('boolean', var='public', value=True)] 1110 form = data_form.Form('submit', fields=fields) 1111 self.assertEqual(set(['The Jabber Bot', True]), 1112 set(form.itervalues())) 1113 1114 1115 def test_iteritems(self): 1116 """ 1117 Iterating over the values of a form yields all item tuples. 1118 """ 1119 fields = [data_form.Field(var='botname', value='The Jabber Bot'), 1120 data_form.Field('boolean', var='public', value=True)] 1121 form = data_form.Form('submit', fields=fields) 1122 self.assertEqual(set([('botname', 'The Jabber Bot'), 1123 ('public', True)]), 1124 set(form.iteritems())) 1125 1126 1127 def test_keys(self): 1128 """ 1129 Getting the keys of a form yields a list of field names. 1130 """ 1131 fields = [data_form.Field(var='botname', value='The Jabber Bot'), 1132 data_form.Field('boolean', var='public', value=True), 1133 data_form.Field('list-multi', var='features', 1134 values=['news', 'search'])] 1135 form = data_form.Form('submit', fields=fields) 1136 keys = form.keys() 1137 self.assertIsInstance(keys, list) 1138 self.assertEqual(set(['botname', 'public', 'features']), 1139 set(keys)) 1140 1141 1142 def test_values(self): 1143 """ 1144 Getting the values of a form yields a list of field values. 1145 """ 1146 fields = [data_form.Field(var='botname', value='The Jabber Bot'), 1147 data_form.Field('boolean', var='public', value=True)] 1148 form = data_form.Form('submit', fields=fields) 1149 values = form.values() 1150 self.assertIsInstance(values, list) 1151 self.assertEqual(set(['The Jabber Bot', True]), set(values)) 1152 1153 1154 def test_items(self): 1155 """ 1156 Iterating over the values of a form yields a list of all item tuples. 1157 """ 1158 fields = [data_form.Field(var='botname', value='The Jabber Bot'), 1159 data_form.Field('boolean', var='public', value=True)] 1160 form = data_form.Form('submit', fields=fields) 1161 items = form.items() 1162 self.assertIsInstance(items, list) 1163 self.assertEqual(set([('botname', 'The Jabber Bot'), 1164 ('public', True)]), 1165 set(items)) 1166 1167 1168 def test_getValues(self): 1169 """ 1170 L{Form.getValues} returns a dict of all field values. 1171 """ 1172 fields = [data_form.Field(var='botname', value='The Jabber Bot'), 1173 data_form.Field('boolean', var='public', value=True), 1174 data_form.Field('list-multi', var='features', 1175 values=['news', 'search'])] 1176 form = data_form.Form('submit', fields=fields) 1001 1177 self.assertEqual({'botname': 'The Jabber Bot', 1002 1178 'public': True, 1003 1179 'features': ['news', 'search']}, 1004 values) 1005 1006 1007 def test_getValuesOneValueTypeMulti(self): 1008 """ 1009 A single value for a multi-value field type is returned in a list. 1010 """ 1011 fields = [data_form.Field('list-multi', var='features', 1012 values=['news'])] 1013 form = data_form.Form('submit', fields=fields) 1014 values = form.getValues() 1015 self.assertEqual({'features': ['news']}, values) 1016 1017 1018 def test_getValuesMultipleValuesNoType(self): 1019 """ 1020 Multiple values for a field without type are returned in a list. 1021 """ 1022 fields = [data_form.Field(None, var='features', 1023 values=['news', 'search'])] 1024 form = data_form.Form('submit', fields=fields) 1025 values = form.getValues() 1026 self.assertEqual({'features': ['news', 'search']}, values) 1027 1028 1029 def test_getValuesMultipleValuesTypeSingle(self): 1030 """ 1031 Multiple values for a single-value field type returns the first value. 1032 """ 1033 fields = [data_form.Field('text-single', var='features', 1034 values=['news', 'search'])] 1035 form = data_form.Form('submit', fields=fields) 1036 values = form.getValues() 1037 self.assertEqual({'features': 'news'}, values) 1180 form.getValues()) 1038 1181 1039 1182 -
wokkel/test/test_pubsub.py
r97 r105 1618 1618 1619 1619 request = pubsub.PubSubRequest.fromElement(parseXml(xml)) 1620 values = request.options .getValues()1620 values = request.options 1621 1621 self.assertIn('pubsub#access_model', values) 1622 1622 self.assertEqual(u'open', values['pubsub#access_model']) … … 2914 2914 def configureSet(request): 2915 2915 self.assertEquals(['pubsub#deliver_payloads'], 2916 request.options. fields.keys())2916 request.options.keys()) 2917 2917 2918 2918 self.resource.getConfigurationOptions = getConfigurationOptions … … 3709 3709 3710 3710 def setConfiguration(requestor, service, nodeIdentifier, options): 3711 self.assertEquals({'pubsub#deliver_payloads': False, 3712 'pubsub#persist_items': True}, options) 3713 3711 self.assertIn('pubsub#deliver_payloads', options) 3712 self.assertFalse(options['pubsub#deliver_payloads']) 3713 self.assertIn('pubsub#persist_items', options) 3714 self.assertTrue(options['pubsub#persist_items']) 3714 3715 3715 3716 self.service.getConfigurationOptions = getConfigurationOptions
Note: See TracChangeset
for help on using the changeset viewer.