source: ralphm-patches/pubsub-request-options-form.patch @ 26:59ace4d1df68

Last change on this file since 26:59ace4d1df68 was 26:59ace4d1df68, checked in by Ralph Meijer <ralphm@…>, 11 years ago

Clean up patches, more tests, adjust copyright statements to new year.

File size: 7.8 KB
  • wokkel/pubsub.py

    diff -r 459a78aaec20 wokkel/pubsub.py
    a b  
    356356        """
    357357        form = data_form.findForm(verbElement, NS_PUBSUB_NODE_CONFIG)
    358358        if form:
    359             if form.formType == 'submit':
    360                 self.options = form.getValues()
    361             elif form.formType == 'cancel':
    362                 self.options = {}
     359            if form.formType in ('submit', 'cancel'):
     360                self.options = form
    363361            else:
    364362                raise BadRequest(text="Unexpected form type %r" % form.formType)
    365363        else:
     
    415413    def _parse_options(self, verbElement):
    416414        form = data_form.findForm(verbElement, NS_PUBSUB_SUBSCRIBE_OPTIONS)
    417415        if form:
    418             if form.formType == 'submit':
    419                 self.options = form.getValues()
    420             elif form.formType == 'cancel':
    421                 self.options = {}
    422             else:
     416            if form.formType not in ('submit', 'cancel'):
    423417                raise BadRequest(text="Unexpected form type %r" % form.formType)
     418            self.options = form
    424419        else:
    425420            raise BadRequest(text="Missing options form")
    426421
     
    932927            handlerName, argNames = self._legacyHandlers[request.verb]
    933928            handler = getattr(self, handlerName)
    934929            args = [getattr(request, arg) for arg in argNames]
     930            if 'options' in argNames:
     931                args[argNames.index('options')] = request.options.getValues()
    935932            d = handler(*args)
    936933
    937934        # If needed, translate the result into a response
     
    996993        return form
    997994
    998995
    999     def _checkConfiguration(self, resource, values):
    1000         options = resource.getConfigurationOptions()
    1001         processedValues = {}
    1002 
    1003         for key, value in values.iteritems():
    1004             if key not in options:
    1005                 continue
    1006 
    1007             option = {'var': key}
    1008             option.update(options[key])
    1009             field = data_form.Field.fromDict(option)
    1010             if isinstance(value, list):
    1011                 field.values = value
    1012             else:
    1013                 field.value = value
    1014             field.typeCheck()
    1015 
    1016             if isinstance(value, list):
    1017                 processedValues[key] = field.values
    1018             else:
    1019                 processedValues[key] = field.value
    1020 
    1021         return processedValues
     996    def _checkConfiguration(self, resource, form):
     997        fieldDefs = resource.getConfigurationOptions()
     998        form.typeCheck(fieldDefs, filterUnknown=True)
    1022999
    10231000
    10241001    def _preProcess_default(self, resource, request):
     
    10491026
    10501027
    10511028    def _preProcess_configureSet(self, resource, request):
    1052         if request.options:
    1053             request.options = self._checkConfiguration(resource,
    1054                                                        request.options)
     1029        if request.options.formType == 'cancel':
     1030            return None
     1031        else:
     1032            self._checkConfiguration(resource, request.options)
    10551033            return request
    1056         else:
    1057             return None
    10581034
    10591035
    10601036    def _toResponse_items(self, result, resource, request):
  • wokkel/test/test_pubsub.py

    diff -r 459a78aaec20 wokkel/test/test_pubsub.py
    a b  
    1 # Copyright (c) 2003-2009 Ralph Meijer
     1# Copyright (c) 2003-2010 Ralph Meijer
    22# See LICENSE for details.
    33
    44"""
     
    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.