Ignore:
Location:
wokkel
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • wokkel/pubsub.py

    r223 r226  
    4343                    'pubsub[@xmlns="' + NS_PUBSUB + '" or ' + \
    4444                           '@xmlns="' + NS_PUBSUB_OWNER + '"]'
     45
     46BOOL_TRUE = ('1','true')
     47BOOL_FALSE = ('0','false')
    4548
    4649class SubscriptionPending(Exception):
     
    253256    subscriptions = None
    254257    affiliations = None
     258    notify = None
    255259
    256260    # Map request iq type and subelement name to request verb
     
    294298        'configureSet': ['nodeOrEmpty', 'configure'],
    295299        'items': ['node', 'maxItems', 'itemIdentifiers', 'subidOrNone'],
    296         'retract': ['node', 'itemIdentifiers'],
     300        'retract': ['node', 'notify', 'itemIdentifiers'],
    297301        'purge': ['node'],
    298302        'delete': ['node'],
     
    567571
    568572
     573    def _parse_notify(self, verbElement):
     574        value = verbElement.getAttribute('notify')
     575
     576        if value:
     577            if value in BOOL_TRUE:
     578                self.notify = True
     579            elif value in BOOL_FALSE:
     580                self.notify = False
     581            else:
     582                raise BadRequest(text="Field notify must be a boolean value")
     583
     584
     585    def _render_notify(self, verbElement):
     586        if self.notify is not None:
     587            verbElement['notify'] = "true" if self.notify else "false"
     588
     589
    569590    def parseElement(self, element):
    570591        """
     
    956977        return d
    957978
     979    def retractItems(self, service, nodeIdentifier, itemIdentifiers, notify=None, sender=None):
     980        """
     981        Retract items from a publish subscribe node.
     982
     983        @param service: The publish subscribe service to delete the node from.
     984        @type service: L{JID<twisted.words.protocols.jabber.jid.JID>}
     985        @param nodeIdentifier: The identifier of the node.
     986        @type nodeIdentifier: C{unicode}
     987        @param itemIdentifiers: Identifiers of the items to be retracted.
     988        @type itemIdentifiers: C{set}
     989        @param notify: True if notification is required
     990        @type notify: C{unicode}
     991        """
     992        request = self._request_class('retract')
     993        request.recipient = service
     994        request.nodeIdentifier = nodeIdentifier
     995        request.itemIdentifiers = itemIdentifiers
     996        request.notify = notify
     997        request.sender = sender
     998        return request.send(self.xmlstream)
    958999
    9591000    def getOptions(self, service, nodeIdentifier, subscriber,
     
    13781419
    13791420
     1421    def notifyRetract(self, service, nodeIdentifier, notifications):
     1422        for subscriber, subscriptions, items in notifications:
     1423            message = self._createNotification('items', service,
     1424                                               nodeIdentifier, subscriber,
     1425                                               subscriptions)
     1426            for item in items:
     1427                retract = domish.Element((None, "retract"))
     1428                retract['id'] = item['id']
     1429                message.event.items.addChild(retract)
     1430            self.send(message)
     1431
     1432
    13801433    def notifyDelete(self, service, nodeIdentifier, subscribers,
    13811434                           redirectURI=None):
  • wokkel/test/test_pubsub.py

    r222 r226  
    907907
    908908
     909    def test_retractItems(self):
     910        """
     911        Test sending items retraction.
     912        """
     913        d = self.protocol.retractItems(JID('pubsub.example.org'), 'test',
     914                                       itemIdentifiers=['item1', 'item2'])
     915
     916        iq = self.stub.output[-1]
     917        self.assertEquals('pubsub.example.org', iq.getAttribute('to'))
     918        self.assertEquals('set', iq.getAttribute('type'))
     919        self.assertEquals('pubsub', iq.pubsub.name)
     920        self.assertEquals(NS_PUBSUB, iq.pubsub.uri)
     921        children = list(domish.generateElementsQNamed(iq.pubsub.children,
     922                                                      'retract', NS_PUBSUB))
     923        self.assertEquals(1, len(children))
     924        child = children[0]
     925        self.assertEquals('test', child['node'])
     926        itemIdentifiers = [item.getAttribute('id') for item in
     927                           domish.generateElementsQNamed(child.children, 'item',
     928                                                         NS_PUBSUB)]
     929        self.assertEquals(['item1', 'item2'], itemIdentifiers)
     930
     931        self.stub.send(toResponse(iq, 'result'))
     932        return d
     933
     934
     935    def test_retractItemsWithSender(self):
     936        """
     937        Test retracting items request from a specific JID.
     938        """
     939        d = self.protocol.retractItems(JID('pubsub.example.org'), 'test',
     940                                       itemIdentifiers=['item1', 'item2'],
     941                                       sender=JID('user@example.org'))
     942
     943        iq = self.stub.output[-1]
     944        self.assertEquals('user@example.org', iq['from'])
     945
     946        self.stub.send(toResponse(iq, 'result'))
     947        return d
     948
     949
    909950    def test_getOptions(self):
    910951        def cb(form):
Note: See TracChangeset for help on using the changeset viewer.