Another approach is using separate repositories for storing data and revision 
history, it can be implemented as events, I think Tres Seaver was talking about 
that in this thread:


  some_obj = some_objects.get(123)
  user = request.user
  # mutate some_obj
  event = SomeObjectChanged(some_obj, user)
  some_objects.store(some_obj)
  event_manager.fire(event)

and then in the event listener:

  def handle_some_obj_changed(event):
     some_objects_versions.store_revision(event.some_obj, event.user)

The event_manager could be ZCA event API. You could also move event-firing 
logic inside subclass of  class of some_objects repository:

  class VersionedSomeObjectsRepository(object):

    def __init__(self, some_objects, user):
      self.user = user
      self.some_objects = some_objects

    def store(self, some_obj):
      self.some_objects.store(some_obj)
      event = SomeObjectChanged(some_obj, self.user)
      event_manager.fire(event)

    def __getattr__(self, name):
      return getattr(self.some_objects, name)

So the above snippet could be simplified in:

  versioned_some_objects = VersionedSomeObjectsRepository(some_objects, 
request.user)
  some_obj = versioned_some_objects.get(123)
  # mutate some_obj
  versioned_some_objects.store(some_obj)

You can also preconfigure versioned repositories in application middleware.

-- 
You received this message because you are subscribed to the Google Groups 
"pylons-devel" group.
To post to this group, send email to pylons-devel@googlegroups.com.
To unsubscribe from this group, send email to 
pylons-devel+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/pylons-devel?hl=en.

Reply via email to