source: ralphm-patches/pubsub-request-options-form.patch @ 21:6e73325a5473

Last change on this file since 21:6e73325a5473 was 21:6e73325a5473, checked in by Ralph Meijer <ralphm@…>, 10 years ago

Split off data forms changes.

File size: 7.7 KB
  • wokkel/pubsub.py

    diff -r 438b64816faa -r 4d1379394cda wokkel/pubsub.py
    a b  
    380380        """
    381381        form = PubSubRequest._findForm(verbElement, NS_PUBSUB_NODE_CONFIG)
    382382        if form:
    383             if form.formType == 'submit':
    384                 self.options = form.getValues()
    385             elif form.formType == 'cancel':
    386                 self.options = {}
     383            if form.formType in ('submit', 'cancel'):
     384                self.options = form
    387385            else:
    388386                raise BadRequest(text="Unexpected form type %r" % form.formType)
    389387        else:
     
    439437    def _parse_options(self, verbElement):
    440438        form = PubSubRequest._findForm(verbElement, NS_PUBSUB_SUBSCRIBE_OPTIONS)
    441439        if form:
    442             if form.formType == 'submit':
    443                 self.options = form.getValues()
    444             elif form.formType == 'cancel':
    445                 self.options = {}
    446             else:
     440            if form.formType not in ('submit', 'cancel'):
    447441                raise BadRequest(text="Unexpected form type %r" % form.formType)
     442            self.options = form
    448443        else:
    449444            raise BadRequest(text="Missing options form")
    450445
     
    956951            handlerName, argNames = self._legacyHandlers[request.verb]
    957952            handler = getattr(self, handlerName)
    958953            args = [getattr(request, arg) for arg in argNames]
     954            if 'options' in argNames:
     955                args[argNames.index('options')] = request.options.getValues()
    959956            d = handler(*args)
    960957
    961958        # If needed, translate the result into a response
     
    10201017        return form
    10211018
    10221019
    1023     def _checkConfiguration(self, resource, values):
    1024         options = resource.getConfigurationOptions()
    1025         processedValues = {}
    1026 
    1027         for key, value in values.iteritems():
    1028             if key not in options:
    1029                 continue
    1030 
    1031             option = {'var': key}
    1032             option.update(options[key])
    1033             field = data_form.Field.fromDict(option)
    1034             if isinstance(value, list):
    1035                 field.values = value
    1036             else:
    1037                 field.value = value
    1038             field.typeCheck()
    1039 
    1040             if isinstance(value, list):
    1041                 processedValues[key] = field.values
    1042             else:
    1043                 processedValues[key] = field.value
    1044 
    1045         return processedValues
     1020    def _checkConfiguration(self, resource, form):
     1021        fieldDefs = resource.getConfigurationOptions()
     1022        form.typeCheck(fieldDefs, filterUnknown=True)
    10461023
    10471024
    10481025    def _preProcess_default(self, resource, request):
     
    10731050
    10741051
    10751052    def _preProcess_configureSet(self, resource, request):
    1076         if request.options:
    1077             request.options = self._checkConfiguration(resource,
    1078                                                        request.options)
     1053        if request.options.formType == 'cancel':
     1054            return None
     1055        else:
     1056            self._checkConfiguration(resource, request.options)
    10791057            return request
    1080         else:
    1081             return None
    10821058
    10831059
    10841060    def _toResponse_items(self, result, resource, request):
  • wokkel/test/test_pubsub.py

    diff -r 438b64816faa -r 4d1379394cda wokkel/test/test_pubsub.py
    a b  
    805805        self.assertEqual(JID('pubsub.example.org'), request.recipient)
    806806        self.assertEqual('test', request.nodeIdentifier)
    807807        self.assertEqual(JID('user@example.org/Home'), request.subscriber)
    808         self.assertEqual({'pubsub#deliver': '1'}, request.options)
     808        self.assertEqual({'pubsub#deliver': '1'}, request.options.getValues())
    809809
    810810
    811811    def test_fromElementOptionsSetCancel(self):
     
    825825        """
    826826
    827827        request = pubsub.PubSubRequest.fromElement(parseXml(xml))
    828         self.assertEqual({}, request.options)
     828        self.assertEqual('cancel', request.options.formType)
    829829
    830830
    831831    def test_fromElementOptionsSetBadFormType(self):
     
    10531053        self.assertEqual(JID('pubsub.example.org'), request.recipient)
    10541054        self.assertEqual('test', request.nodeIdentifier)
    10551055        self.assertEqual({'pubsub#deliver_payloads': '0',
    1056                           'pubsub#persist_items': '1'}, request.options)
     1056                          'pubsub#persist_items': '1'},
     1057                         request.options.getValues())
    10571058
    10581059
    10591060    def test_fromElementConfigureSetCancel(self):
     
    10731074        """
    10741075
    10751076        request = pubsub.PubSubRequest.fromElement(parseXml(xml))
    1076         self.assertEqual({}, request.options)
     1077        self.assertEqual('cancel', request.options.formType)
    10771078
    10781079
    10791080    def test_fromElementConfigureSetBadFormType(self):
     
    18951896            return defer.succeed({'pubsub#deliver_payloads': '0',
    18961897                                  'pubsub#persist_items': '1',
    18971898                                  'pubsub#owner': JID('user@example.org'),
    1898                                   'x-myfield': ['a', 'b']})
     1899                                  'x-myfield': 'a'})
    18991900
    19001901        def cb(element):
    19011902            self.assertEqual('pubsub', element.name)
     
    19681969
    19691970        def configureSet(request):
    19701971            self.assertEqual({'pubsub#deliver_payloads': False,
    1971                               'pubsub#persist_items': True}, request.options)
     1972                              'pubsub#persist_items': True},
     1973                             request.options.getValues())
    19721974            return defer.succeed(None)
    19731975
    19741976        self.resource.getConfigurationOptions = getConfigurationOptions
     
    20402042
    20412043        def configureSet(request):
    20422044            self.assertEquals(['pubsub#deliver_payloads'],
    2043                               request.options.keys())
     2045                              request.options.fields.keys())
    20442046
    20452047        self.resource.getConfigurationOptions = getConfigurationOptions
    20462048        self.resource.configureSet = configureSet
     
    25952597        return d
    25962598
    25972599
     2600    def test_setConfigurationOptionsDict(self):
     2601        """
     2602        Options should be passed as a dictionary, not a form.
     2603        """
     2604
     2605        xml = """
     2606        <iq type='set' to='pubsub.example.org'
     2607                       from='user@example.org'>
     2608          <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
     2609            <configure node='test'>
     2610              <x xmlns='jabber:x:data' type='submit'>
     2611                <field var='FORM_TYPE' type='hidden'>
     2612                  <value>http://jabber.org/protocol/pubsub#node_config</value>
     2613                </field>
     2614                <field var='pubsub#deliver_payloads'><value>0</value></field>
     2615                <field var='pubsub#persist_items'><value>1</value></field>
     2616              </x>
     2617            </configure>
     2618          </pubsub>
     2619        </iq>
     2620        """
     2621
     2622        def getConfigurationOptions():
     2623            return {
     2624                "pubsub#persist_items":
     2625                    {"type": "boolean",
     2626                     "label": "Persist items to storage"},
     2627                "pubsub#deliver_payloads":
     2628                    {"type": "boolean",
     2629                     "label": "Deliver payloads with event notifications"}
     2630                }
     2631
     2632        def setConfiguration(requestor, service, nodeIdentifier, options):
     2633            self.assertEquals({'pubsub#deliver_payloads': False,
     2634                               'pubsub#persist_items': True}, options)
     2635
     2636
     2637        self.service.getConfigurationOptions = getConfigurationOptions
     2638        self.service.setConfiguration = setConfiguration
     2639        return self.handleRequest(xml)
     2640
     2641
    25982642    def test_items(self):
    25992643        """
    26002644        Non-overridden L{PubSubService.items} yields unsupported error.
Note: See TracBrowser for help on using the repository browser.