Mercurial > libervia-pubsub
diff idavoll/backend.py @ 43:9685b7e291ef
Moved common stuff out of pgsql_backend.py to backend.py.
Implemented Storage class for memory backend.
Implemented item storage for pgsql Storage.
author | Ralph Meijer <ralphm@ik.nu> |
---|---|
date | Mon, 01 Nov 2004 12:37:40 +0000 |
parents | 788114f9b5bc |
children | bc7438476a67 |
line wrap: on
line diff
--- a/idavoll/backend.py Sun Oct 31 21:12:55 2004 +0000 +++ b/idavoll/backend.py Mon Nov 01 12:37:40 2004 +0000 @@ -1,6 +1,7 @@ from twisted.python import components from twisted.application import service from twisted.xish import utility +from twisted.internet import defer class Error(Exception): msg = '' @@ -140,13 +141,74 @@ __implements__ = IBackendService, - def __init__(self): + def __init__(self, storage): service.MultiService.__init__(self) utility.EventDispatcher.__init__(self) + self.storage = storage def get_supported_affiliations(self): return ['none', 'owner', 'outcast', 'publisher'] + def publish(self, node_id, items, requestor): + d1 = self.storage.get_node_configuration(node_id) + d2 = self.storage.get_affiliation(node_id, requestor.full()) + d = defer.DeferredList([d1, d2], fireOnOneErrback=1) + d.addErrback(lambda x: x.value[0]) + d.addCallback(self._do_publish, node_id, items, requestor) + return d + + def _do_publish(self, result, node_id, items, requestor): + print result + configuration = result[0][1] + persist_items = configuration["persist_items"] + deliver_payloads = configuration["deliver_payloads"] + affiliation = result[1][1] + + if affiliation not in ['owner', 'publisher']: + raise NotAuthorized + + if items and not persist_items and not deliver_payloads: + raise NoPayloadAllowed + elif not items and (persist_items or deliver_payloads): + raise PayloadExpected + + print "publish by %s to %s" % (requestor.full(), node_id) + + if persist_items or deliver_payloads: + for item in items: + if item["id"] is None: + item["id"] = 'random' # FIXME + + if persist_items: + d = self.store_items(node_id, items, requestor.full()) + else: + d = defer.succeed(None) + + d.addCallback(self._do_notify, node_id, items, deliver_payloads) + + def _do_notify(self, result, node_id, items, deliver_payloads): + if items and not deliver_payloads: + for item in items: + item.children = [] + + self.dispatch({ 'items': items, 'node_id': node_id }, + '//event/pubsub/notify') + + def get_notification_list(self, node_id, items): + d = self.storage.get_subscribers(node_id) + d.addCallback(self._magic_filter, node_id, items) + return d + + def _magic_filter(self, subscribers, node_id, items): + list = {} + for subscriber in subscribers: + list[subscriber] = items + + return list + + def store_items(self, node_id, items, publisher): + return self.storage.store_items(node_id, items, publisher) + class NotificationService(service.Service): def register_notifier(self, observerfn, *args, **kwargs):