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