Mercurial > libervia-pubsub
annotate idavoll/backend.py @ 18:7937d6fbbe2a
Small code cleanups
author | Ralph Meijer <ralphm@ik.nu> |
---|---|
date | Mon, 30 Aug 2004 17:41:18 +0000 |
parents | 46cd13c68ac0 |
children | eddea65d1032 |
rev | line source |
---|---|
1 | 1 from twisted.application import service |
2 from twisted.python import components, failure | |
3 from twisted.internet import defer, reactor | |
15 | 4 from twisted.protocols.jabber import jid |
1 | 5 |
6 class IBackendService(components.Interface): | |
7 """ Interface to a backend service of a pubsub service """ | |
8 | |
2 | 9 def do_publish(self, node, publisher, item): |
10 """ Returns a deferred that returns """ | |
11 | |
1 | 12 class BackendException(Exception): |
13 def __init__(self, msg = ''): | |
14 self.msg = msg | |
15 | |
16 def __str__(self): | |
17 return self.msg | |
18 | |
19 class NodeNotFound(BackendException): | |
5
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
20 def __init__(self, msg = 'Node not found'): |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
21 BackendException.__init__(self, msg) |
1 | 22 |
23 class NotAuthorized(BackendException): | |
24 pass | |
25 | |
5
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
26 class PayloadExpected(BackendException): |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
27 def __init__(self, msg = 'Payload expected'): |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
28 BackendException.__init__(self, msg) |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
29 |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
30 class NoPayloadAllowed(BackendException): |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
31 def __init__(self, msg = 'No payload allowed'): |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
32 BackendException.__init__(self, msg) |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
33 |
15 | 34 class Subscription: |
35 def __init__(self, state): | |
36 self.state = state | |
37 | |
38 class NodeConfiguration: | |
39 def __init__(self): | |
40 self.persist_items = False | |
41 self.deliver_payloads = False | |
42 | |
43 class Node: | |
44 def __init__(self, name): | |
45 self.name = name | |
46 self.configuration = NodeConfiguration() | |
47 self.subscriptions = {} | |
48 self.affiliations = {} | |
49 self.items = {} | |
50 | |
1 | 51 class MemoryBackendService(service.Service): |
52 | |
53 __implements__ = IBackendService, | |
54 | |
55 def __init__(self): | |
15 | 56 self.nodes = {} |
1 | 57 |
15 | 58 node = Node("ralphm/mood/ralphm@ik.nu") |
59 node.subscriptions["ralphm@doe.ik.nu"] = Subscription("subscribed") | |
18 | 60 node.subscriptions["notify@ik.nu/mood_monitor"] = Subscription("subscribed") |
15 | 61 node.affiliations["ralphm@ik.nu"] = "owner" |
62 node.affiliations["ralphm@doe.ik.nu"] = "publisher" | |
63 node.configuration.persist_items = True | |
64 node.configuration.deliver_payloads = True | |
65 self.nodes[node.name] = node | |
66 | |
67 def do_publish(self, node_id, publisher, items): | |
1 | 68 try: |
69 try: | |
15 | 70 node = self.nodes[node_id] |
71 persist_items = node.configuration.persist_items | |
72 deliver_payloads = node.configuration.deliver_payloads | |
1 | 73 except KeyError: |
74 raise NodeNotFound | |
75 | |
76 try: | |
15 | 77 if node.affiliations[publisher] not in ['owner', 'publisher']: |
1 | 78 raise NotAuthorized |
79 except KeyError: | |
80 raise NotAuthorized() | |
2 | 81 |
5
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
82 if items and not persist_items and not deliver_payloads: |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
83 raise NoPayloadAllowed |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
84 elif not items and (persist_items or deliver_payloads): |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
85 raise PayloadExpected |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
86 |
15 | 87 print "publish by %s to %s" % (publisher, node_id) |
2 | 88 |
5
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
89 if persist_items or deliver_payloads: |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
90 for item in items: |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
91 if item["id"] is None: |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
92 item["id"] = 'random' |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
93 |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
94 if persist_items: |
15 | 95 self.storeItems(node_id, publisher, items) |
5
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
96 |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
97 if items and not deliver_payloads: |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
98 for item in items: |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
99 item.children = [] |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
100 |
15 | 101 recipients = self.get_subscribers(node_id) |
102 recipients.addCallback(self.magic_filter, node_id, items) | |
103 recipients.addCallback(self.pubsub_service.do_notification, node_id) | |
2 | 104 |
5
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
105 return defer.succeed(None) |
1 | 106 except: |
18 | 107 return defer.fail(failure.Failure()) |
1 | 108 |
15 | 109 def do_subscribe(self, node_id, subscriber, requestor): |
110 # expect subscriber and requestor to be a jid.JID | |
111 try: | |
112 try: | |
113 node = self.nodes[node_id] | |
114 except KeyError: | |
115 raise NodeNotFound | |
116 | |
117 affiliation = node.affiliations.get(requestor.full(), 'none') | |
118 | |
119 if affiliation == 'banned': | |
120 raise NotAuthorized | |
121 | |
122 print subscriber.full() | |
123 print subscriber.userhostJID().full() | |
124 print requestor.full() | |
125 | |
126 if subscriber.userhostJID() != requestor: | |
127 raise NotAuthorized | |
128 | |
129 try: | |
130 subscription = node.subscriptions[subscriber.full()] | |
131 except KeyError: | |
132 subscription = Subscription('subscribed') | |
133 node.subscriptions[subscriber.full()] = subscription | |
134 | |
135 print node.subscriptions | |
136 | |
137 return defer.succeed({ | |
138 'affiliation': affiliation, | |
139 'node': node_id, | |
140 'jid': subscriber, | |
141 'subscription': subscription.state}) | |
142 except: | |
18 | 143 return defer.fail(failure.Failure) |
15 | 144 |
145 | |
146 def magic_filter(self, subscribers, node_id, items): | |
5
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
147 list = {} |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
148 for subscriber in subscribers: |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
149 list[subscriber] = items |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
150 |
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
151 return list |
2 | 152 |
15 | 153 def get_subscribers(self, node_id): |
1 | 154 d = defer.Deferred() |
155 try: | |
15 | 156 result = self.nodes[node_id].subscriptions.keys() |
1 | 157 except: |
158 f = failure.Failure() | |
159 reactor.callLater(0, d.errback, f) | |
160 else: | |
161 reactor.callLater(0, d.callback, result) | |
162 | |
163 return d | |
164 | |
15 | 165 def storeItems(self, node_id, publisher, items): |
5
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
166 for item in items: |
15 | 167 self.nodes[node_id].items[item["id"]] = item |
5
05a5d412e1b1
Added PayloadExpected and NoPayloadAllowed exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
168 |
15 | 169 print self.nodes[node_id].items |