From 37172efce084b7371820f04b6ae840fa5cbb8c52 Mon Sep 17 00:00:00 2001 From: Friedrich Lindenberg Date: Wed, 13 Jul 2011 18:20:23 +0200 Subject: [PATCH] basic event logic layer: create an event in various eventstreams, retrieve and render (with a renderer class) --- datahub/logic/event.py | 46 ++++++++++++++++++++++++++++++++++++-- datahub/logic/renderers.py | 35 +++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 datahub/logic/renderers.py diff --git a/datahub/logic/event.py b/datahub/logic/event.py index 79d73a9..a11fa09 100644 --- a/datahub/logic/event.py +++ b/datahub/logic/event.py @@ -1,5 +1,8 @@ -from datahub.exc import NotFound -from datahub.model import Event +from datahub.core import db +from datahub.exc import NotFound, InternalError +from datahub.model import Event, EventStreamEntry + +from datahub.logic.renderers import RENDERERS def get(id): """ Get will try to find an event and return None if no event @@ -12,3 +15,42 @@ def find(id): if event is None: raise NotFound('No such event: %s' % id) return event + +def latest_by_stream(entity_type, entity_id, limit=50): + """ Fetch the `limit` latest events that occured on the given + event stream. """ + events = Event.query.join(EventStreamEntry) + events = events.filter(EventStreamEntry.entity_type==entity_type) + events = events.filter(EventStreamEntry.entity_id==entity_id) + events = events.order_by(Event.time.desc()) + events = events.limit(limit) + return events.all() + +def latest_by_entity(entity, limit=50): + """ Get events for a specific entity. """ + return latest_by_stream(entity.__tablename__, entity.id, + limit=limit) + +def emit(event, streams=[]): + """ Unlike the other logic.*.create methods, this function + expects an instantiated Event object to be passed in. As there + are many different event types, this seemed the right thing to + do. """ + streams = set(streams) + if not event.account in streams: + streams.add(event.account) + db.session.add(event) + for stream in streams: + entry = EventStreamEntry(stream.__tablename__, stream.id, + event) + db.session.add(entry) + db.session.flush() + +def renderer(event): + """ Retrieve and instantiate an appropriate renderer for this + event. """ + try: + return RENDERERS[type(event)](event) + except KeyError: + raise InternalError('No renderer for %s' % type(event)) + diff --git a/datahub/logic/renderers.py b/datahub/logic/renderers.py new file mode 100644 index 0000000..11da7d8 --- /dev/null +++ b/datahub/logic/renderers.py @@ -0,0 +1,35 @@ +#import cgi +from flask import url_for + +from datahub.model.event import ResourceCreatedEvent + +class EventRenderer(object): + html_template = '' + plain_template = '' + + def __init__(self, event): + self.event = event + + def params(self): + return self.event.data + + def __html__(self): + return self.html_template % self.params() + + def __unicode__(self): + return self.plain_template % self.params() + +class ResourceCreatedEventRenderer(EventRenderer): + html_template = '''has created + %(owner)s/%(resource)s''' + + def params(self): + data = self.event.data.copy() + data['url'] = url_for('node', owner=data['owner'], + node=data['resource']) + return data + +RENDERERS = { + ResourceCreatedEvent: ResourceCreatedEventRenderer + } +