diff -r e58b9f2cf8a3 wokkel/pubsub.py --- a/wokkel/pubsub.py Fri Jan 01 01:34:14 2010 +0100 +++ b/wokkel/pubsub.py Fri Jan 01 11:12:36 2010 +0100 @@ -119,33 +119,47 @@ -class Item(domish.Element): +class Item(object): """ Publish subscribe item. - This behaves like an object providing L{domish.IElement}. - - Item payload can be added using C{addChild} or C{addRawXml}, or using the - C{payload} keyword argument to C{__init__}. + @ivar itemIdentifier: optional item identifier + @type itemIdentifier: L{unicode} + @ivar payload: optional item payload. Either as a domish element, or as + serialized XML. + @type payload: object providing L{domish.IElement} or L{unicode}. """ - def __init__(self, id=None, payload=None): + def __init__(self, itemIdentifier=None, payload=None): + self.itemIdentifier = itemIdentifier + self.payload = payload + + + def toElement(self, namespace=NS_PUBSUB): """ - @param id: optional item identifier - @type id: L{unicode} - @param payload: optional item payload. Either as a domish element, or - as serialized XML. - @type payload: object providing L{domish.IElement} or L{unicode}. + Render to a DOM representation. + + Usually called by when rendering requests or responses. The optional + C{namespace} argument is for rendering the item in that namespace, so + L{Item} is usable in all contexts involving items. + + @param namespace: The namespace of the item. Usually L{NS_PUBSUB} or + L{NS_PUBSUB_EVENT}. + @type: C{unicode} + @rtype: L{domish.Element} """ + element = domish.Element((namespace, 'item')) - domish.Element.__init__(self, (NS_PUBSUB, 'item')) - if id is not None: - self['id'] = id - if payload is not None: - if isinstance(payload, basestring): - self.addRawXml(payload) + if self.itemIdentifier is not None: + element['id'] = self.itemIdentifier + + if self.payload is not None: + if isinstance(self.payload, basestring): + self.addRawXml(self.payload) else: - self.addChild(payload) + self.addChild(self.payload) + + return element @@ -309,7 +323,13 @@ self.items = [] for element in verbElement.elements(): if element.uri == NS_PUBSUB and element.name == 'item': - self.items.append(element) + item = Item() + item.itemIdentifier = element.getAttribute('id') + try: + item.payload = element.elements().next() + except StopIteration: + pass + self.items.append(item) def _render_items(self, verbElement): @@ -318,7 +338,7 @@ """ if self.items: for item in self.items: - verbElement.addChild(item) + verbElement.addChild(item.toElement()) def _parse_jid(self, verbElement): @@ -1124,7 +1144,7 @@ items["node"] = request.nodeIdentifier for item in result: - items.addChild(item) + items.addChild(item.toElement()) return response diff -r e58b9f2cf8a3 wokkel/test/test_pubsub.py --- a/wokkel/test/test_pubsub.py Fri Jan 01 01:34:14 2010 +0100 +++ b/wokkel/test/test_pubsub.py Fri Jan 01 11:12:36 2010 +0100 @@ -365,7 +365,6 @@ items = list(domish.generateElementsQNamed(child.children, 'item', NS_PUBSUB)) self.assertEquals(1, len(items)) - self.assertIdentical(item, items[0]) response = toResponse(iq, 'result') self.stub.send(response) @@ -699,8 +698,8 @@ request = pubsub.PubSubRequest.fromElement(parseXml(xml)) self.assertEqual(2, len(request.items)) - self.assertEqual(u'item1', request.items[0]["id"]) - self.assertEqual(u'item2', request.items[1]["id"]) + self.assertEqual(u'item1', request.items[0].itemIdentifier) + self.assertEqual(u'item2', request.items[1].itemIdentifier) def test_fromElementPublishNoNode(self):