Skip to content

Commit

Permalink
basic event logic layer: create an event in various eventstreams, ret…
Browse files Browse the repository at this point in the history
…rieve and render (with a renderer class)
  • Loading branch information
pudo committed Jul 13, 2011
1 parent b9c8200 commit 37172ef
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 2 deletions.
46 changes: 44 additions & 2 deletions 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
Expand All @@ -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))

35 changes: 35 additions & 0 deletions 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 <verb>created</verb>
<a href='%(url)s'>%(owner)s/%(resource)s</a>'''

def params(self):
data = self.event.data.copy()
data['url'] = url_for('node', owner=data['owner'],
node=data['resource'])
return data

RENDERERS = {
ResourceCreatedEvent: ResourceCreatedEventRenderer
}

0 comments on commit 37172ef

Please sign in to comment.