annotate idavoll/backend.py @ 79:c40ccc30dfb7

Added note on max_items attribute.
author Ralph Meijer <ralphm@ik.nu>
date Tue, 09 Nov 2004 14:50:18 +0000
parents a914cad421c5
children ec354aab3949
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
49
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
1 from twisted.protocols.jabber import jid
24
4f3bbefc6fad Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents: 23
diff changeset
2 from twisted.python import components
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
3 from twisted.application import service
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
4 from twisted.xish import utility
43
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
5 from twisted.internet import defer
2
9701df89c534 First take at notifications
Ralph Meijer <ralphm@ik.nu>
parents: 1
diff changeset
6
24
4f3bbefc6fad Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents: 23
diff changeset
7 class Error(Exception):
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
8 msg = ''
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
9
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
10 def __str__(self):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
11 return self.msg
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
12
24
4f3bbefc6fad Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents: 23
diff changeset
13 class NodeNotFound(Error):
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
14 msg = 'Node not found'
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
15
24
4f3bbefc6fad Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents: 23
diff changeset
16 class NotAuthorized(Error):
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
17 pass
20
eddea65d1032 Added two exceptions: NoInstantNodes and NodeExists.
Ralph Meijer <ralphm@ik.nu>
parents: 18
diff changeset
18
24
4f3bbefc6fad Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents: 23
diff changeset
19 class PayloadExpected(Error):
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
20 msg = 'Payload expected'
15
46cd13c68ac0 Redone memory storage of nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 5
diff changeset
21
24
4f3bbefc6fad Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents: 23
diff changeset
22 class NoPayloadAllowed(Error):
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
23 msg = 'No payload allowed'
2
9701df89c534 First take at notifications
Ralph Meijer <ralphm@ik.nu>
parents: 1
diff changeset
24
24
4f3bbefc6fad Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents: 23
diff changeset
25 class NoInstantNodes(Error):
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
26 pass
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 20
diff changeset
27
24
4f3bbefc6fad Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents: 23
diff changeset
28 class NodeExists(Error):
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
29 pass
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
30
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
31 class NotImplemented(Error):
34
b65b7ea5c992 Remove nonsense message.
Ralph Meijer <ralphm@ik.nu>
parents: 29
diff changeset
32 pass
b65b7ea5c992 Remove nonsense message.
Ralph Meijer <ralphm@ik.nu>
parents: 29
diff changeset
33
b65b7ea5c992 Remove nonsense message.
Ralph Meijer <ralphm@ik.nu>
parents: 29
diff changeset
34 class NotSubscribed(Error):
b65b7ea5c992 Remove nonsense message.
Ralph Meijer <ralphm@ik.nu>
parents: 29
diff changeset
35 pass
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
36
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
37 class IBackendService(components.Interface):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
38 """ Interface to a backend service of a pubsub service. """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
39
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
40 def get_supported_affiliations(self):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
41 """ Reports the list of supported affiliation types.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
42
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
43 @return: a list of supported affiliation types.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
44 """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
45
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
46 class INodeCreationService(components.Interface):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
47 """ A service for creating nodes """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
48
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
49 def create_node(self, node_id, requestor):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
50 """ Create a node.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
51
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
52 @return: a deferred that fires when the node has been created.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
53 """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
54
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
55 class IPublishService(components.Interface):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
56 """ A service for publishing items to a node. """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
57
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
58 def publish(self, node_id, items, requestor):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
59 """ Publish items to a pubsub node.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
60
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
61 @return: a deferred that fires when the items have been published.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
62 """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
63 class INotificationService(components.Interface):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
64 """ A service for notification of published items. """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
65
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
66 def register_notifier(self, observerfn, *args, **kwargs):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
67 """ Register callback which is called for notification. """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
68
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
69 def get_notification_list(self, node_id, items):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
70 pass
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
71
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
72 class ISubscriptionService(components.Interface):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
73 """ A service for managing subscriptions. """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
74
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
75 def subscribe(self, node_id, subscriber, requestor):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
76 """ Request the subscription of an entity to a pubsub node.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
77
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
78 Depending on the node's configuration and possible business rules, the
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
79 C{subscriber} is added to the list of subscriptions of the node with id
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
80 C{node_id}. The C{subscriber} might be different from the C{requestor},
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
81 and if the C{requestor} is not allowed to subscribe this entity an
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
82 exception should be raised.
59
0fa161c00ed9 Use jid.JIDs everywhere in the backend.
Ralph Meijer <ralphm@ik.nu>
parents: 53
diff changeset
83
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
84 @return: a deferred that returns the subscription state
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
85 """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
86
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
87 def unsubscribe(self, node_id, subscriber, requestor):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
88 """ Cancel the subscription of an entity to a pubsub node.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
89
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
90 The subscription of C{subscriber} is removed from the list of
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
91 subscriptions of the node with id C{node_id}. If the C{requestor}
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
92 is not allowed to unsubscribe C{subscriber}, an an exception should
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
93 be raised.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
94
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
95 @return: a deferred that fires when unsubscription is complete.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
96 """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
97
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
98 class IAffiliationsService(components.Interface):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
99 """ A service for retrieving the affiliations with this pubsub service. """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
100
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
101 def get_affiliations(self, entity):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
102 """ Report the list of current affiliations with this pubsub service.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
103
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
104 Report the list of the current affiliations with all nodes within this
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
105 pubsub service, along with subscriptions to such nodes, for the
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
106 C{entity}.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
107
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
108 @return: a deferred that returns the list of all current affiliations
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
109 and subscriptions.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
110 """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
111
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
112 class IRetractionService(components.Interface):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
113 """ A service for retracting published items """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
114
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
115 def retract_item(self, node_id, item_id, requestor):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
116 """ Removes item in node from persistent storage """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
117
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
118 def purge_node(self, node_id, requestor):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
119 """ Removes all items in node from persistent storage """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
120
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
121 class IItemRetrievalService(components.Interface):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
122 """ A service for retrieving previously published items. """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
123
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
124 def get_items(self, node_id, max_items=None, item_ids=[],
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
125 requestor=None):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
126 """ Retrieve items from persistent storage
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
127
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
128 If C{max_items} is given, return the C{max_items} last published
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
129 items, else if C{item_ids} is not empty, return the items requested.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
130 If neither is given, return all items.
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
131
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
132 @return: a deferred that returns the requested items
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
133 """
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
134
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
135 class BackendService(service.MultiService, utility.EventDispatcher):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
136
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
137 __implements__ = IBackendService,
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
138
43
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
139 def __init__(self, storage):
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
140 service.MultiService.__init__(self)
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
141 utility.EventDispatcher.__init__(self)
43
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
142 self.storage = storage
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
143
53
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
144 def supports_publisher_affiliation(self):
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
145 return True
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
146
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
147 def supports_outcast_affiliation(self):
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
148 return True
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
149
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
150 def supports_persistent_items(self):
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
151 return True
39
788114f9b5bc Added get_supported_affiliations() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents: 34
diff changeset
152
65
d617f8d19263 Add get_node_type() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents: 61
diff changeset
153 def get_node_type(self, node_id):
72
a914cad421c5 Added get_nodes() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents: 65
diff changeset
154 return self.storage.get_node_type(node_id)
a914cad421c5 Added get_nodes() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents: 65
diff changeset
155
a914cad421c5 Added get_nodes() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents: 65
diff changeset
156 def get_nodes(self):
a914cad421c5 Added get_nodes() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents: 65
diff changeset
157 return self.storage.get_nodes()
65
d617f8d19263 Add get_node_type() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents: 61
diff changeset
158
44
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
159 class PublishService(service.Service):
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
160
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
161 __implements__ = IPublishService,
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
162
43
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
163 def publish(self, node_id, items, requestor):
44
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
164 d1 = self.parent.storage.get_node_configuration(node_id)
59
0fa161c00ed9 Use jid.JIDs everywhere in the backend.
Ralph Meijer <ralphm@ik.nu>
parents: 53
diff changeset
165 d2 = self.parent.storage.get_affiliation(node_id, requestor)
43
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
166 d = defer.DeferredList([d1, d2], fireOnOneErrback=1)
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
167 d.addErrback(lambda x: x.value[0])
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
168 d.addCallback(self._do_publish, node_id, items, requestor)
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
169 return d
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
170
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
171 def _do_publish(self, result, node_id, items, requestor):
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
172 configuration = result[0][1]
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
173 persist_items = configuration["persist_items"]
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
174 deliver_payloads = configuration["deliver_payloads"]
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
175 affiliation = result[1][1]
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
176
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
177 if affiliation not in ['owner', 'publisher']:
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
178 raise NotAuthorized
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
179
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
180 if items and not persist_items and not deliver_payloads:
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
181 raise NoPayloadAllowed
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
182 elif not items and (persist_items or deliver_payloads):
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
183 raise PayloadExpected
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
184
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
185 print "publish by %s to %s" % (requestor.full(), node_id)
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
186
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
187 if persist_items or deliver_payloads:
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
188 for item in items:
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
189 if item["id"] is None:
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
190 item["id"] = 'random' # FIXME
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
191
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
192 if persist_items:
44
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
193 d = self.parent.storage.store_items(node_id, items,
59
0fa161c00ed9 Use jid.JIDs everywhere in the backend.
Ralph Meijer <ralphm@ik.nu>
parents: 53
diff changeset
194 requestor)
43
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
195 else:
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
196 d = defer.succeed(None)
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
197
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
198 d.addCallback(self._do_notify, node_id, items, deliver_payloads)
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
199
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
200 def _do_notify(self, result, node_id, items, deliver_payloads):
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
201 if items and not deliver_payloads:
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
202 for item in items:
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
203 item.children = []
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
204
44
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
205 self.parent.dispatch({ 'items': items, 'node_id': node_id },
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
206 '//event/pubsub/notify')
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
207
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
208 class NotificationService(service.Service):
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
209
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
210 __implements__ = INotificationService,
43
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
211
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
212 def get_notification_list(self, node_id, items):
44
bc7438476a67 Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents: 43
diff changeset
213 d = self.parent.storage.get_subscribers(node_id)
43
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
214 d.addCallback(self._magic_filter, node_id, items)
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
215 return d
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
216
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
217 def _magic_filter(self, subscribers, node_id, items):
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
218 list = {}
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
219 for subscriber in subscribers:
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
220 list[subscriber] = items
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
221 return list
9685b7e291ef Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents: 39
diff changeset
222
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
223 def register_notifier(self, observerfn, *args, **kwargs):
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
224 self.parent.addObserver('//event/pubsub/notify', observerfn,
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
225 *args, **kwargs)
49
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
226
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
227 class SubscriptionService(service.Service):
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
228
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
229 __implements__ = ISubscriptionService,
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
230
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
231 def subscribe(self, node_id, subscriber, requestor):
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
232 if subscriber.userhostJID() != requestor:
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
233 raise NotAuthorized
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
234
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
235 d1 = self.parent.storage.get_node_configuration(node_id)
59
0fa161c00ed9 Use jid.JIDs everywhere in the backend.
Ralph Meijer <ralphm@ik.nu>
parents: 53
diff changeset
236 d2 = self.parent.storage.get_affiliation(node_id, subscriber)
49
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
237 d = defer.DeferredList([d1, d2], fireOnOneErrback=1)
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
238 d.addErrback(lambda x: x.value[0])
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
239 d.addCallback(self._do_subscribe, node_id, subscriber)
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
240 return d
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
241
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
242 def _do_subscribe(self, result, node_id, subscriber):
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
243 configuration = result[0][1]
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
244 affiliation = result[1][1]
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
245
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
246 if affiliation == 'outcast':
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
247 raise NotAuthorized
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
248
59
0fa161c00ed9 Use jid.JIDs everywhere in the backend.
Ralph Meijer <ralphm@ik.nu>
parents: 53
diff changeset
249 d = self.parent.storage.add_subscription(node_id, subscriber,
49
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
250 'subscribed')
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
251 d.addCallback(self._return_subscription, affiliation)
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
252 return d
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
253
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
254 def _return_subscription(self, result, affiliation):
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
255 result['affiliation'] = affiliation
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
256 return result
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
257
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
258 def unsubscribe(self, node_id, subscriber, requestor):
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
259 if subscriber.userhostJID() != requestor:
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
260 raise NotAuthorized
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
261
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
262 d = self.parent.storage.get_node_configuration(node_id)
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
263 d.addCallback(self._do_unsubscribe, node_id, subscriber)
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
264 return d
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
265
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
266 def _do_unsubscribe(self, result, node_id, subscriber):
94e4ede2a357 Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents: 44
diff changeset
267 return self.parent.storage.remove_subscription(node_id,
59
0fa161c00ed9 Use jid.JIDs everywhere in the backend.
Ralph Meijer <ralphm@ik.nu>
parents: 53
diff changeset
268 subscriber)
53
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
269
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
270 class NodeCreationService(service.Service):
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
271
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
272 __implements__ = INodeCreationService,
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
273
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
274 def supports_instant_nodes(self):
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
275 return False
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
276
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
277 def create_node(self, node_id, requestor):
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
278 if not node_id:
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
279 raise NoInstantNodes
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
280
59
0fa161c00ed9 Use jid.JIDs everywhere in the backend.
Ralph Meijer <ralphm@ik.nu>
parents: 53
diff changeset
281 d = self.parent.storage.create_node(node_id, requestor)
53
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
282 d.addCallback(lambda _: node_id)
e602ddda2d6e Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents: 49
diff changeset
283 return d
61
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
284
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
285 class AffiliationsService(service.Service):
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
286
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
287 __implements__ = IAffiliationsService,
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
288
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
289 def get_affiliations(self, entity):
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
290 d1 = self.parent.storage.get_affiliations(entity)
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
291 d2 = self.parent.storage.get_subscriptions(entity)
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
292 d = defer.DeferredList([d1, d2], fireOnOneErrback=1)
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
293 d.addErrback(lambda x: x.value[0])
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
294 d.addCallback(self._affiliations_result, entity)
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
295 return d
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
296
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
297 def _affiliations_result(self, result, entity):
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
298 affiliations = result[0][1]
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
299 subscriptions = result[1][1]
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
300
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
301 new_affiliations = {}
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
302
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
303 for node, affiliation in affiliations:
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
304 new_affiliations[(node, entity.full())] = {'node': node,
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
305 'jid': entity,
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
306 'affiliation': affiliation,
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
307 'subscription': None
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
308 }
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
309
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
310 for node, subscriber, subscription in subscriptions:
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
311 key = node, subscriber.full()
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
312 if new_affiliations.has_key(key):
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
313 new_affiliations[key]['subscription'] = subscription
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
314 else:
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
315 new_affiliations[key] = {'node': node,
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
316 'jid': subscriber,
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
317 'affiliation': None,
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
318 'subscription': subscription}
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
319
ad08e021b4d5 Implement AffiliationsService.
Ralph Meijer <ralphm@ik.nu>
parents: 59
diff changeset
320 return new_affiliations.values()