Mercurial > libervia-pubsub
annotate idavoll/backend.py @ 105:8d8946e67fcb
Move to Twisted 2.0.
author | Ralph Meijer <ralphm@ik.nu> |
---|---|
date | Fri, 08 Apr 2005 10:01:40 +0000 |
parents | b75fcc554358 |
children | dc36882d2620 |
rev | line source |
---|---|
105 | 1 from twisted.words.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 |
105 | 6 from zope.interface import implements |
84 | 7 import sha |
8 import time | |
2 | 9 |
24
4f3bbefc6fad
Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents:
23
diff
changeset
|
10 class Error(Exception): |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
11 msg = '' |
1 | 12 |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
13 def __str__(self): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
14 return self.msg |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
15 |
24
4f3bbefc6fad
Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents:
23
diff
changeset
|
16 class NodeNotFound(Error): |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
17 msg = 'Node not found' |
1 | 18 |
24
4f3bbefc6fad
Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents:
23
diff
changeset
|
19 class NotAuthorized(Error): |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
20 pass |
20
eddea65d1032
Added two exceptions: NoInstantNodes and NodeExists.
Ralph Meijer <ralphm@ik.nu>
parents:
18
diff
changeset
|
21 |
24
4f3bbefc6fad
Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents:
23
diff
changeset
|
22 class PayloadExpected(Error): |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
23 msg = 'Payload expected' |
15 | 24 |
24
4f3bbefc6fad
Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents:
23
diff
changeset
|
25 class NoPayloadAllowed(Error): |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
26 msg = 'No payload allowed' |
2 | 27 |
24
4f3bbefc6fad
Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents:
23
diff
changeset
|
28 class NoInstantNodes(Error): |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
29 pass |
23
884268687229
Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents:
20
diff
changeset
|
30 |
24
4f3bbefc6fad
Moved memory backend to its own file.
Ralph Meijer <ralphm@ik.nu>
parents:
23
diff
changeset
|
31 class NodeExists(Error): |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
32 pass |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
33 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
34 class NotImplemented(Error): |
34 | 35 pass |
36 | |
37 class NotSubscribed(Error): | |
38 pass | |
29
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 class IBackendService(components.Interface): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
41 """ 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
|
42 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
43 def get_supported_affiliations(self): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
44 """ Reports the list of supported affiliation types. |
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 @return: a list of supported affiliation types. |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
47 """ |
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 class INodeCreationService(components.Interface): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
50 """ A service for creating nodes """ |
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 def create_node(self, node_id, requestor): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
53 """ Create a node. |
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 @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
|
56 """ |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
57 |
90
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
58 class INodeDeletionService(components.Interface): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
59 """ A service for deleting nodes. """ |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
60 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
61 def register_pre_delete(self, pre_delete_fn): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
62 """ Register a callback that is called just before a node deletion. |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
63 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
64 The function C{pre_deleted_fn} is added to a list of functions |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
65 to be called just before deletion of a node. The callback |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
66 C{pre_delete_fn} is called with the C{node_id} that is about to be |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
67 deleted and should return a deferred that returns a list of deferreds |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
68 that are to be fired after deletion. The backend collects the lists |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
69 from all these callbacks before actually deleting the node in question. |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
70 After deletion all collected deferreds are fired to do post-processing. |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
71 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
72 The idea is that you want to be able to collect data from the |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
73 node before deleting it, for example to get a list of subscribers |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
74 that have to be notified after the node has been deleted. To do this, |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
75 C{pre_delete_fn} fetches the subscriber list and passes this |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
76 list to a callback attached to a deferred that it sets up. This |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
77 deferred is returned in the list of deferreds. |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
78 """ |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
79 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
80 def get_subscribers(self, node_id): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
81 """ Get node subscriber list. |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
82 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
83 @return: a deferred that fires with the list of subscribers. |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
84 """ |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
85 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
86 def delete_node(self, node_id, requestor): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
87 """ Delete a node. |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
88 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
89 @return: a deferred that fires when the node has been deleted. |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
90 """ |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
91 |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
92 class IPublishService(components.Interface): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
93 """ A service for publishing items to a node. """ |
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 def publish(self, node_id, items, requestor): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
96 """ Publish items to a pubsub node. |
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 @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
|
99 """ |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
100 class INotificationService(components.Interface): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
101 """ A service for notification of published items. """ |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
102 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
103 def register_notifier(self, observerfn, *args, **kwargs): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
104 """ Register callback which is called for notification. """ |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
105 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
106 def get_notification_list(self, node_id, items): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
107 pass |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
108 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
109 class ISubscriptionService(components.Interface): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
110 """ A service for managing subscriptions. """ |
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 def subscribe(self, node_id, subscriber, requestor): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
113 """ 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
|
114 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
115 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
|
116 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
|
117 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
|
118 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
|
119 exception should be raised. |
59
0fa161c00ed9
Use jid.JIDs everywhere in the backend.
Ralph Meijer <ralphm@ik.nu>
parents:
53
diff
changeset
|
120 |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
121 @return: a deferred that returns the subscription state |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
122 """ |
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 unsubscribe(self, node_id, subscriber, requestor): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
125 """ 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
|
126 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
127 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
|
128 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
|
129 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
|
130 be raised. |
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 fires when unsubscription is complete. |
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 IAffiliationsService(components.Interface): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
136 """ 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
|
137 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
138 def get_affiliations(self, entity): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
139 """ 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
|
140 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
141 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
|
142 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
|
143 C{entity}. |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
144 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
145 @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
|
146 and subscriptions. |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
147 """ |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
148 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
149 class IRetractionService(components.Interface): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
150 """ A service for retracting published items """ |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
151 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
152 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
|
153 """ Removes item in node from persistent storage """ |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
154 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
155 def purge_node(self, node_id, requestor): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
156 """ Removes all items in node from persistent storage """ |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
157 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
158 class IItemRetrievalService(components.Interface): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
159 """ A service for retrieving previously published items. """ |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
160 |
80
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
161 def get_items(self, node_id, requestor, max_items=None, item_ids=[]): |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
162 """ Retrieve items from persistent storage |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
163 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
164 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
|
165 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
|
166 If neither is given, return all items. |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
167 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
168 @return: a deferred that returns the requested items |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
169 """ |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
170 |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
171 class BackendService(service.MultiService, utility.EventDispatcher): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
172 |
105 | 173 implements(IBackendService) |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
174 |
101
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
175 options = {"pubsub#persist_items": |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
176 {"type": "boolean", |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
177 "label": "Persist items to storage"}, |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
178 "pubsub#deliver_payloads": |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
179 {"type": "boolean", |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
180 "label": "Deliver payloads with event notifications"}, |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
181 } |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
182 |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
183 default_config = {"pubsub#persist_items": True, |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
184 "pubsub#deliver_payloads": True, |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
185 } |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
186 |
43
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
187 def __init__(self, storage): |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
188 service.MultiService.__init__(self) |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
189 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
|
190 self.storage = storage |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
191 |
53
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
192 def supports_publisher_affiliation(self): |
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
193 return True |
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
194 |
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
195 def supports_outcast_affiliation(self): |
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
196 return True |
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
197 |
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
198 def supports_persistent_items(self): |
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
199 return True |
39
788114f9b5bc
Added get_supported_affiliations() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents:
34
diff
changeset
|
200 |
65
d617f8d19263
Add get_node_type() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents:
61
diff
changeset
|
201 def get_node_type(self, node_id): |
72
a914cad421c5
Added get_nodes() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents:
65
diff
changeset
|
202 return self.storage.get_node_type(node_id) |
a914cad421c5
Added get_nodes() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents:
65
diff
changeset
|
203 |
a914cad421c5
Added get_nodes() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents:
65
diff
changeset
|
204 def get_nodes(self): |
a914cad421c5
Added get_nodes() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents:
65
diff
changeset
|
205 return self.storage.get_nodes() |
65
d617f8d19263
Add get_node_type() to BackendService.
Ralph Meijer <ralphm@ik.nu>
parents:
61
diff
changeset
|
206 |
101
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
207 def get_node_meta_data(self, node_id): |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
208 d = self.storage.get_node_configuration(node_id) |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
209 |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
210 d.addCallback(self._make_meta_data) |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
211 return d |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
212 |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
213 def _make_meta_data(self, meta_data): |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
214 options = [] |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
215 for key, value in meta_data.iteritems(): |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
216 if self.options.has_key(key): |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
217 option = {"var": key} |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
218 option.update(self.options[key]) |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
219 option["value"] = value |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
220 options.append(option) |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
221 |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
222 return options |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
223 |
44
bc7438476a67
Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents:
43
diff
changeset
|
224 class PublishService(service.Service): |
bc7438476a67
Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents:
43
diff
changeset
|
225 |
105 | 226 implements(IPublishService) |
44
bc7438476a67
Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents:
43
diff
changeset
|
227 |
43
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
228 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
|
229 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
|
230 d2 = self.parent.storage.get_affiliation(node_id, requestor) |
92
878a5b7697f2
Consume errors in DeferredLists.
Ralph Meijer <ralphm@ik.nu>
parents:
90
diff
changeset
|
231 d = defer.DeferredList([d1, d2], fireOnOneErrback=1, consumeErrors=1) |
43
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
232 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
|
233 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
|
234 return d |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
235 |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
236 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
|
237 configuration = result[0][1] |
95
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
238 persist_items = configuration["pubsub#persist_items"] |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
239 deliver_payloads = configuration["pubsub#deliver_payloads"] |
43
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
240 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
|
241 |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
242 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
|
243 raise NotAuthorized |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
244 |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
245 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
|
246 raise NoPayloadAllowed |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
247 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
|
248 raise PayloadExpected |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
249 |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
250 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
|
251 for item in items: |
84 | 252 if not item.getAttribute("id"): |
253 item["id"] = sha.new(str(time.time()) + | |
254 requestor.full()).hexdigest() | |
43
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
255 |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
256 if persist_items: |
44
bc7438476a67
Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents:
43
diff
changeset
|
257 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
|
258 requestor) |
43
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
259 else: |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
260 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
|
261 |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
262 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
|
263 |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
264 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
|
265 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
|
266 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
|
267 item.children = [] |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
268 |
44
bc7438476a67
Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents:
43
diff
changeset
|
269 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
|
270 '//event/pubsub/notify') |
bc7438476a67
Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents:
43
diff
changeset
|
271 |
bc7438476a67
Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents:
43
diff
changeset
|
272 class NotificationService(service.Service): |
bc7438476a67
Removed IPersistenceService, this is a feature of the storage facility.
Ralph Meijer <ralphm@ik.nu>
parents:
43
diff
changeset
|
273 |
105 | 274 implements(INotificationService) |
43
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
275 |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
276 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
|
277 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
|
278 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
|
279 return d |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
280 |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
281 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
|
282 list = {} |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
283 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
|
284 list[subscriber] = items |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
285 return list |
9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Ralph Meijer <ralphm@ik.nu>
parents:
39
diff
changeset
|
286 |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
287 def register_notifier(self, observerfn, *args, **kwargs): |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
288 self.parent.addObserver('//event/pubsub/notify', observerfn, |
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
289 *args, **kwargs) |
49
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
290 |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
291 class SubscriptionService(service.Service): |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
292 |
105 | 293 implements(ISubscriptionService) |
49
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
294 |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
295 def subscribe(self, node_id, subscriber, requestor): |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
296 if subscriber.userhostJID() != requestor: |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
297 raise NotAuthorized |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
298 |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
299 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
|
300 d2 = self.parent.storage.get_affiliation(node_id, subscriber) |
92
878a5b7697f2
Consume errors in DeferredLists.
Ralph Meijer <ralphm@ik.nu>
parents:
90
diff
changeset
|
301 d = defer.DeferredList([d1, d2], fireOnOneErrback=1, consumeErrors=1) |
49
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
302 d.addErrback(lambda x: x.value[0]) |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
303 d.addCallback(self._do_subscribe, node_id, subscriber) |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
304 return d |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
305 |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
306 def _do_subscribe(self, result, node_id, subscriber): |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
307 configuration = result[0][1] |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
308 affiliation = result[1][1] |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
309 |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
310 if affiliation == 'outcast': |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
311 raise NotAuthorized |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
312 |
59
0fa161c00ed9
Use jid.JIDs everywhere in the backend.
Ralph Meijer <ralphm@ik.nu>
parents:
53
diff
changeset
|
313 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
|
314 'subscribed') |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
315 d.addCallback(self._return_subscription, affiliation) |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
316 return d |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
317 |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
318 def _return_subscription(self, result, affiliation): |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
319 result['affiliation'] = affiliation |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
320 return result |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
321 |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
322 def unsubscribe(self, node_id, subscriber, requestor): |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
323 if subscriber.userhostJID() != requestor: |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
324 raise NotAuthorized |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
325 |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
326 d = self.parent.storage.get_node_configuration(node_id) |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
327 d.addCallback(self._do_unsubscribe, node_id, subscriber) |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
328 return d |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
329 |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
330 def _do_unsubscribe(self, result, node_id, subscriber): |
94e4ede2a357
Implement SubscriptionService with separate storage.
Ralph Meijer <ralphm@ik.nu>
parents:
44
diff
changeset
|
331 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
|
332 subscriber) |
53
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
333 |
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
334 class NodeCreationService(service.Service): |
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
335 |
105 | 336 implements(INodeCreationService) |
53
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
337 |
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
338 def supports_instant_nodes(self): |
84 | 339 return True |
53
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
340 |
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
341 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
|
342 if not node_id: |
84 | 343 node_id = 'generic/%s' % sha.new(str(time.time()) + |
344 requestor.full()).hexdigest() | |
53
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
345 |
59
0fa161c00ed9
Use jid.JIDs everywhere in the backend.
Ralph Meijer <ralphm@ik.nu>
parents:
53
diff
changeset
|
346 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
|
347 d.addCallback(lambda _: node_id) |
e602ddda2d6e
Implement NodeCreationService, using the create_node() method of Storage.
Ralph Meijer <ralphm@ik.nu>
parents:
49
diff
changeset
|
348 return d |
61 | 349 |
95
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
350 def get_node_configuration(self, node_id): |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
351 if node_id: |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
352 d = self.parent.storage.get_node_configuration(node_id) |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
353 else: |
101
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
354 # XXX: this is disabled in pubsub.py |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
355 d = defer.succeed(self.parent.default_config) |
95
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
356 |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
357 d.addCallback(self._make_config) |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
358 return d |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
359 |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
360 def _make_config(self, config): |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
361 options = [] |
101
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
362 for key, value in self.parent.options.iteritems(): |
95
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
363 option = {"var": key} |
101
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
364 option.update(value) |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
365 if config.has_key(key): |
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
366 option["value"] = config[key] |
95
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
367 options.append(option) |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
368 |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
369 return options |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
370 |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
371 def set_node_configuration(self, node_id, options, requestor): |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
372 for key in options.iterkeys(): |
101
b75fcc554358
Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents:
98
diff
changeset
|
373 if not self.parent.options.has_key(key): |
95
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
374 raise InvalidConfigurationOption |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
375 |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
376 d = self.parent.storage.get_affiliation(node_id, requestor) |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
377 d.addCallback(self._do_set_node_configuration, node_id, options) |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
378 return d |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
379 |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
380 def _do_set_node_configuration(self, affiliation, node_id, options): |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
381 if affiliation != 'owner': |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
382 raise NotAuthorized |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
383 |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
384 return self.parent.storage.set_node_configuration(node_id, options) |
3ad74552bbc7
Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents:
92
diff
changeset
|
385 |
61 | 386 class AffiliationsService(service.Service): |
387 | |
105 | 388 implements(IAffiliationsService) |
61 | 389 |
390 def get_affiliations(self, entity): | |
391 d1 = self.parent.storage.get_affiliations(entity) | |
392 d2 = self.parent.storage.get_subscriptions(entity) | |
92
878a5b7697f2
Consume errors in DeferredLists.
Ralph Meijer <ralphm@ik.nu>
parents:
90
diff
changeset
|
393 d = defer.DeferredList([d1, d2], fireOnOneErrback=1, consumeErrors=1) |
61 | 394 d.addErrback(lambda x: x.value[0]) |
395 d.addCallback(self._affiliations_result, entity) | |
396 return d | |
397 | |
398 def _affiliations_result(self, result, entity): | |
399 affiliations = result[0][1] | |
400 subscriptions = result[1][1] | |
401 | |
402 new_affiliations = {} | |
403 | |
404 for node, affiliation in affiliations: | |
405 new_affiliations[(node, entity.full())] = {'node': node, | |
406 'jid': entity, | |
407 'affiliation': affiliation, | |
408 'subscription': None | |
409 } | |
410 | |
411 for node, subscriber, subscription in subscriptions: | |
412 key = node, subscriber.full() | |
413 if new_affiliations.has_key(key): | |
414 new_affiliations[key]['subscription'] = subscription | |
415 else: | |
416 new_affiliations[key] = {'node': node, | |
417 'jid': subscriber, | |
418 'affiliation': None, | |
419 'subscription': subscription} | |
420 | |
421 return new_affiliations.values() | |
80
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
422 |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
423 class ItemRetrievalService(service.Service): |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
424 |
105 | 425 implements(IItemRetrievalService) |
80
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
426 |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
427 def get_items(self, node_id, requestor, max_items=None, item_ids=[]): |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
428 d = self.parent.storage.is_subscribed(node_id, requestor) |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
429 d.addCallback(self._do_get_items, node_id, max_items, item_ids) |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
430 return d |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
431 |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
432 def _do_get_items(self, result, node_id, max_items, item_ids): |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
433 if not result: |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
434 raise NotAuthorized |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
435 |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
436 if item_ids: |
98 | 437 return self.parent.storage.get_items_by_ids(node_id, item_ids) |
80
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
438 else: |
ec354aab3949
Implemented ItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents:
72
diff
changeset
|
439 return self.parent.storage.get_items(node_id, max_items) |
85
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
440 |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
441 class RetractionService(service.Service): |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
442 |
105 | 443 implements(IRetractionService) |
85
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
444 |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
445 def retract_item(self, node_id, item_ids, requestor): |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
446 d1 = self.parent.storage.get_node_configuration(node_id) |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
447 d2 = self.parent.storage.get_affiliation(node_id, requestor) |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
448 d = defer.DeferredList([d1, d2], fireOnOneErrback=1) |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
449 d.addErrback(lambda x: x.value[0]) |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
450 d.addCallback(self._do_retract, node_id, item_ids) |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
451 return d |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
452 |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
453 def _do_retract(self, result, node_id, item_ids): |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
454 configuration = result[0][1] |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
455 persist_items = configuration["persist_items"] |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
456 affiliation = result[1][1] |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
457 |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
458 if affiliation not in ['owner', 'publisher']: |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
459 raise NotAuthorized |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
460 |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
461 if not persist_items: |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
462 raise NodeNotPersistent |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
463 |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
464 d = self.parent.storage.remove_items(node_id, item_ids) |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
465 d.addCallback(self._do_notify_retraction, node_id) |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
466 return d |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
467 |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
468 def _do_notify_retraction(self, result, node_id): |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
469 self.parent.dispatch({ 'item_ids': result, 'node_id': node_id }, |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
470 '//event/pubsub/retract') |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
471 |
ec557449d1aa
Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents:
84
diff
changeset
|
472 def purge_node(self, node_id, requestor): |
90
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
473 d1 = self.parent.storage.get_node_configuration(node_id) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
474 d2 = self.parent.storage.get_affiliation(node_id, requestor) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
475 d = defer.DeferredList([d1, d2], fireOnOneErrback=1) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
476 d.addErrback(lambda x: x.value[0]) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
477 d.addCallback(self._do_purge, node_id) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
478 return d |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
479 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
480 def _do_purge(self, result, node_id): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
481 configuration = result[0][1] |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
482 persist_items = configuration["persist_items"] |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
483 affiliation = result[1][1] |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
484 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
485 if affiliation != 'owner': |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
486 raise NotAuthorized |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
487 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
488 if not persist_items: |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
489 raise NodeNotPersistent |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
490 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
491 d = self.parent.storage.purge_node(node_id) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
492 d.addCallback(self._do_notify_purge, node_id) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
493 return d |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
494 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
495 def _do_notify_purge(self, result, node_id): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
496 self.parent.dispatch(node_id, '//event/pubsub/purge') |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
497 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
498 class NodeDeletionService(service.Service): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
499 |
105 | 500 implements(INodeDeletionService) |
90
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
501 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
502 def __init__(self): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
503 self._callback_list = [] |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
504 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
505 def register_pre_delete(self, pre_delete_fn): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
506 self._callback_list.append(pre_delete_fn) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
507 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
508 def get_subscribers(self, node_id): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
509 return self.parent.storage.get_subscribers(node_id) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
510 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
511 def delete_node(self, node_id, requestor): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
512 d1 = self.parent.storage.get_node_configuration(node_id) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
513 d2 = self.parent.storage.get_affiliation(node_id, requestor) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
514 d = defer.DeferredList([d1, d2], fireOnOneErrback=1) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
515 d.addErrback(lambda x: x.value[0]) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
516 d.addCallback(self._do_pre_delete, node_id) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
517 return d |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
518 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
519 def _do_pre_delete(self, result, node_id): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
520 configuration = result[0][1] |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
521 persist_items = configuration["persist_items"] |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
522 affiliation = result[1][1] |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
523 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
524 if affiliation != 'owner': |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
525 raise NotAuthorized |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
526 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
527 d = defer.DeferredList([cb(node_id) for cb in self._callback_list], |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
528 consumeErrors=1) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
529 d.addCallback(self._do_delete, node_id) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
530 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
531 def _do_delete(self, result, node_id): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
532 dl = [] |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
533 for succeeded, r in result: |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
534 if succeeded and r: |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
535 dl.extend(r) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
536 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
537 d = self.parent.storage.delete_node(node_id) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
538 d.addCallback(self._do_notify_delete, dl) |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
539 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
540 return d |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
541 |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
542 def _do_notify_delete(self, result, dl): |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
543 for d in dl: |
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
544 d.callback(None) |