Hi All,

I've been experimenting with the new event system in 7.1, and I'd like
to use it to set some values in my tables on each insert/update. 
Basically, I've created a mixin class (BaseMixin) which adds two fields
to each model that inherits the mixin - a user_id and a last updated
field which I want to use for audit purposes. A separate
history/versioning system will come after this.

The function attach_user_committing gets called on a flush, and in it I
can find all the newly added objects to the session by inspecting
Session._new, but I'm not sure how to determine which ones have been
updated.  Any suggestions/comments on the below would be greatly
appreciated!

Thanks,
Damian

def attach_user_committing(Session, flush_context, instances):
    user_id =
authenticated_userid(pyramid.threadlocal.get_current_request())
    #for each object being committed/flushed, set the flushing/commiting
user
    for obj in Session._new.values():
        obj.user_id = user_id
        obj.last_updated = datetime.now()

#this event ensures that user_id & lastupdate is correctly updated on
each flush.
event.listen(Session, "before_flush", attach_user_committing)

#We add lastupdate and userid fields (and mappings)
#to the base class for inheritance
class BaseMixin(object):
    @sa.ext.declarative.declared_attr
    def user_id(cls):
        return sa.Column(sa.Integer, sa.ForeignKey('users.id'),
                        nullable=False)
    @sa.ext.declarative.declared_attr
    def last_update_date(cls):
        return sa.Column(sa.DateTime,
                                    default=datetime.now())
    @sa.ext.declarative.declared_attr
    def user(cls):
        return orm.relationship('User')

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

Reply via email to