Hello,

Thanks for the response - how do I access the public new collection?

In terms of the date not being updated - turns out that in my code the
columns are called last_update_date and not last_updated which
explains why it wasn't committing anything....

Also, for the Session.dirty objects I check that they've actually been
modified before committing using is_modified -

   for obj in Session.dirty:
         log.debug('Objects in dirty: %s' % obj.__dict__)
         if Session.is_modified(obj, passive=True):
             obj.user_id = user_id
             obj.last_updated = datetime.now()


Thank you for helping me spot this,

Damian

On Jun 6, 4:06 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> The code looks fine to me, other than the access of Session._new for which 
> you should be really calling upon the public "new" collection.
>
> What you might want to make sure of is that the objects you expect to see in 
> "dirty" are actually there.   Sometimes objects don't make it into "dirty" 
> until they are found to be impacted by a relationship() changing something on 
> them.   If this is the case you'd want to navigate to those objects 
> differently.
>
> On Jun 6, 2012, at 6:36 AM, Damian Dimmich wrote:
>
>
>
>
>
>
>
> > Hi,
>
> > I have a before flush event set up that sets the current user_id and 
> > datetime on new objects that are going to be commited to the database (all 
> > tables have these fields).
>
> > Unfortunately, it seems to ignore changes I make to existing objects, ie 
> > when I set the user_id (which i get from pyramid) and last_updated columns 
> > in the event handler, the sql only issues updates for the other columns 
> > that where modified.
>
> > Any ideas as to what am I missing?
>
> > Thanks in advance,
> > Damian
>
> > def attach_user_committing(Session, flush_context, instances):
> >    """This function gets called by the before_flush event,
> >    it grabs the current threads request and extracts the
> >    authenticated user_id out of it.  You can only
> >    commit things if you are authenticated.
>
> >    Once it has that id, it goes through and adds the id
> >    of the user who modified it to new commits- need to be careful that
> >    _new doesn't change.
> >    """
>
> >    #this is used when creating databases & testing only
> >    user_id = 1
> >    if not creating_database:
> >        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():
> >        #log.debug(obj)
> >        obj.user_id = user_id
> >        obj.last_updated = datetime.now()
> >    log.debug('Session dirty is : %s' %Session.dirty)
> >    for obj in Session.dirty:
> >        log.debug('Objects in dirty: %s' % obj.__dict__)
> >        #if obj._sa_instance_state.modified:
> >        obj.user_id = user_id
> >        obj.last_updated = datetime.now()
>
> >    #session.user_id = request
> > #this event ensures that user_id & lastupdate is correctly stored on each 
> > commit.
> > event.listen(Session, "before_flush", attach_user_committing)
>
> > --
> > 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 
> > athttp://groups.google.com/group/sqlalchemy?hl=en.

-- 
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