hooks/notification.py
changeset 3536 f6c9a5df80fb
parent 3427 78dfef45ee48
child 4075 e710f4052bd6
equal deleted inserted replaced
3524:a3431f4e2f40 3536:f6c9a5df80fb
    88         if view is None:
    88         if view is None:
    89             return
    89             return
    90         RenderAndSendNotificationView(self._cw, view=view)
    90         RenderAndSendNotificationView(self._cw, view=view)
    91 
    91 
    92 
    92 
       
    93 class EntityUpdatedNotificationOp(hook.SingleLastOperation):
       
    94 
       
    95     def precommit_event(self):
       
    96         session = self.session
       
    97         for eid in session.transaction_data['changes']:
       
    98             view = session.vreg['views'].select('notif_entity_updated', session,
       
    99                                                 rset=session.eid_rset(eid),
       
   100                                                 row=0)
       
   101             RenderAndSendNotificationView(session, view=view)
       
   102 
       
   103 
       
   104 class EntityUpdateHook(NotificationHook):
       
   105     __regid__ = 'notifentityupdated'
       
   106     __abstract__ = True # do not register by default
       
   107 
       
   108     events = ('before_update_entity',)
       
   109     skip_attrs = set()
       
   110 
       
   111     def __call__(self):
       
   112         session = self._cw
       
   113         if self.entity.eid in session.transaction_data.get('neweids', ()):
       
   114             return # entity is being created
       
   115         if session.is_super_session:
       
   116             return # ignore changes triggered by hooks
       
   117         # then compute changes
       
   118         changes = session.transaction_data.setdefault('changes', {})
       
   119         thisentitychanges = changes.setdefault(self.entity.eid, set())
       
   120         attrs = [k for k in self.entity.edited_attributes if not k in self.skip_attrs]
       
   121         if not attrs:
       
   122             return
       
   123         rqlsel, rqlrestr = [], ['X eid %(x)s']
       
   124         for i, attr in enumerate(attrs):
       
   125             var = chr(65+i)
       
   126             rqlsel.append(var)
       
   127             rqlrestr.append('X %s %s' % (attr, var))
       
   128         rql = 'Any %s WHERE %s' % (','.join(rqlsel), ','.join(rqlrestr))
       
   129         rset = session.execute(rql, {'x': self.entity.eid}, 'x')
       
   130         for i, attr in enumerate(attrs):
       
   131             oldvalue = rset[0][i]
       
   132             newvalue = self.entity[attr]
       
   133             if oldvalue != newvalue:
       
   134                 thisentitychanges.add((attr, oldvalue, newvalue))
       
   135         if thisentitychanges:
       
   136             EntityUpdatedNotificationOp(session)
       
   137 
       
   138 
    93 # supervising ##################################################################
   139 # supervising ##################################################################
    94 
   140 
    95 class SomethingChangedHook(NotificationHook):
   141 class SomethingChangedHook(NotificationHook):
    96     __regid__ = 'supervising'
   142     __regid__ = 'supervising'
    97     events = ('before_add_relation', 'before_delete_relation',
   143     events = ('before_add_relation', 'before_delete_relation',