author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Tue, 16 Feb 2010 09:25:18 +0100 | |
changeset 4593 | d0b5ef72a492 |
parent 4584 | eef17cfcfa9c |
child 4719 | aaed3f813ef8 |
permissions | -rw-r--r-- |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
1 |
"""some hooks to handle notification on entity's changes |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
2 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
3 |
:organization: Logilab |
4307
7fba9c34c88f
update copyright
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4075
diff
changeset
|
4 |
:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2. |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
5 |
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
6 |
:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
7 |
""" |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
8 |
__docformat__ = "restructuredtext en" |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
9 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
10 |
from logilab.common.textutils import normalize_text |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
11 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
12 |
from cubicweb import RegistryException |
4075
e710f4052bd6
use implements instead of entity_implements
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3536
diff
changeset
|
13 |
from cubicweb.selectors import implements |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
14 |
from cubicweb.server import hook |
3427
78dfef45ee48
[notification] add missing import, fix dummy AttributeError in RenderAndSendNotificationView
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3422
diff
changeset
|
15 |
from cubicweb.sobjects.supervising import SupervisionMailOp |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
16 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
17 |
class RenderAndSendNotificationView(hook.Operation): |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
18 |
"""delay rendering of notification view until precommit""" |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
19 |
def precommit_event(self): |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
20 |
view = self.view |
3418
7b49fa7e942d
[api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3376
diff
changeset
|
21 |
if view.cw_rset is not None and not view.cw_rset: |
3072
6fb42c53f6df
backport 3.5 branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3023
diff
changeset
|
22 |
return # entity added and deleted in the same transaction (cache effect) |
3422
089c4b71ac16
[hooks] fix dummy NameError in RenderAndSendNotification
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3418
diff
changeset
|
23 |
if view.cw_rset and self.session.deleted_in_transaction(view.cw_rset[view.cw_row or 0][view.cw_col or 0]): |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
24 |
return # entity added and deleted in the same transaction |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
25 |
self.view.render_and_send(**getattr(self, 'viewargs', {})) |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
26 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
27 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
28 |
class NotificationHook(hook.Hook): |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
29 |
__abstract__ = True |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
30 |
category = 'notification' |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
31 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
32 |
def select_view(self, vid, rset, row=0, col=0): |
2900 | 33 |
return self._cw.vreg['views'].select_or_none(vid, self._cw, |
34 |
rset=rset, row=0, col=0) |
|
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
35 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
36 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
37 |
class StatusChangeHook(NotificationHook): |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
38 |
"""notify when a workflowable entity has its state modified""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3163
diff
changeset
|
39 |
__regid__ = 'notifystatuschange' |
4075
e710f4052bd6
use implements instead of entity_implements
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3536
diff
changeset
|
40 |
__select__ = NotificationHook.__select__ & implements('TrInfo') |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
41 |
events = ('after_add_entity',) |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
42 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
43 |
def __call__(self): |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
44 |
entity = self.entity |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
45 |
if not entity.from_state: # not a transition |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
46 |
return |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
47 |
rset = entity.related('wf_info_for') |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
48 |
view = self.select_view('notif_status_change', rset=rset, row=0) |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
49 |
if view is None: |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
50 |
return |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
51 |
comment = entity.printable_value('comment', format='text/plain') |
3023
7864fee8b4ec
backport 3.5 step 1, remaining wf changes in hooks to merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2900
diff
changeset
|
52 |
# XXX don't try to wrap rest until we've a proper transformation (see |
7864fee8b4ec
backport 3.5 step 1, remaining wf changes in hooks to merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2900
diff
changeset
|
53 |
# #103822) |
7864fee8b4ec
backport 3.5 step 1, remaining wf changes in hooks to merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2900
diff
changeset
|
54 |
if comment and entity.comment_format != 'text/rest': |
7864fee8b4ec
backport 3.5 step 1, remaining wf changes in hooks to merge
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2900
diff
changeset
|
55 |
comment = normalize_text(comment, 80) |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
56 |
RenderAndSendNotificationView(self._cw, view=view, viewargs={ |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
57 |
'comment': comment, 'previous_state': entity.previous_state.name, |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
58 |
'current_state': entity.new_state.name}) |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
59 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
60 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
61 |
class RelationChangeHook(NotificationHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3163
diff
changeset
|
62 |
__regid__ = 'notifyrelationchange' |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
63 |
events = ('before_add_relation', 'after_add_relation', |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
64 |
'before_delete_relation', 'after_delete_relation') |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
65 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
66 |
def __call__(self): |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
67 |
"""if a notification view is defined for the event, send notification |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
68 |
email defined by the view |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
69 |
""" |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
70 |
rset = self._cw.eid_rset(self.eidfrom) |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
71 |
view = self.select_view('notif_%s_%s' % (self.event, self.rtype), |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
72 |
rset=rset, row=0) |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
73 |
if view is None: |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
74 |
return |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
75 |
RenderAndSendNotificationView(self._cw, view=view) |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
76 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
77 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
78 |
class EntityChangeHook(NotificationHook): |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
79 |
"""if a notification view is defined for the event, send notification |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
80 |
email defined by the view |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
81 |
""" |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3163
diff
changeset
|
82 |
__regid__ = 'notifyentitychange' |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
83 |
events = ('after_add_entity', 'after_update_entity') |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
84 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
85 |
def __call__(self): |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
86 |
rset = self.entity.as_rset() |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
87 |
view = self.select_view('notif_%s' % self.event, rset=rset, row=0) |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
88 |
if view is None: |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
89 |
return |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
90 |
RenderAndSendNotificationView(self._cw, view=view) |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
91 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
92 |
|
3536
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
93 |
class EntityUpdatedNotificationOp(hook.SingleLastOperation): |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
94 |
|
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
95 |
def precommit_event(self): |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
96 |
session = self.session |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
97 |
for eid in session.transaction_data['changes']: |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
98 |
view = session.vreg['views'].select('notif_entity_updated', session, |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
99 |
rset=session.eid_rset(eid), |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
100 |
row=0) |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
101 |
RenderAndSendNotificationView(session, view=view) |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
102 |
|
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
103 |
|
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
104 |
class EntityUpdateHook(NotificationHook): |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
105 |
__regid__ = 'notifentityupdated' |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
106 |
__abstract__ = True # do not register by default |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
107 |
|
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
108 |
events = ('before_update_entity',) |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
109 |
skip_attrs = set() |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
110 |
|
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
111 |
def __call__(self): |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
112 |
session = self._cw |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
113 |
if self.entity.eid in session.transaction_data.get('neweids', ()): |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
114 |
return # entity is being created |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
115 |
if session.is_super_session: |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
116 |
return # ignore changes triggered by hooks |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
117 |
# then compute changes |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
118 |
changes = session.transaction_data.setdefault('changes', {}) |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
119 |
thisentitychanges = changes.setdefault(self.entity.eid, set()) |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
120 |
attrs = [k for k in self.entity.edited_attributes if not k in self.skip_attrs] |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
121 |
if not attrs: |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
122 |
return |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
123 |
rqlsel, rqlrestr = [], ['X eid %(x)s'] |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
124 |
for i, attr in enumerate(attrs): |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
125 |
var = chr(65+i) |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
126 |
rqlsel.append(var) |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
127 |
rqlrestr.append('X %s %s' % (attr, var)) |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
128 |
rql = 'Any %s WHERE %s' % (','.join(rqlsel), ','.join(rqlrestr)) |
4584
eef17cfcfa9c
[notification] we should use unsafe_execute here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4307
diff
changeset
|
129 |
rset = session.unsafe_execute(rql, {'x': self.entity.eid}, 'x') |
3536
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
130 |
for i, attr in enumerate(attrs): |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
131 |
oldvalue = rset[0][i] |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
132 |
newvalue = self.entity[attr] |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
133 |
if oldvalue != newvalue: |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
134 |
thisentitychanges.add((attr, oldvalue, newvalue)) |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
135 |
if thisentitychanges: |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
136 |
EntityUpdatedNotificationOp(session) |
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
137 |
|
f6c9a5df80fb
backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3427
diff
changeset
|
138 |
|
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
139 |
# supervising ################################################################## |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
140 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
141 |
class SomethingChangedHook(NotificationHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3163
diff
changeset
|
142 |
__regid__ = 'supervising' |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
143 |
events = ('before_add_relation', 'before_delete_relation', |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
144 |
'after_add_entity', 'before_update_entity') |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
145 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
146 |
def __call__(self): |
3163
edfe43ceaa35
backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3072
diff
changeset
|
147 |
# XXX use proper selectors |
edfe43ceaa35
backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3072
diff
changeset
|
148 |
if self._cw.is_super_session or self._cw.repo.config.repairing: |
edfe43ceaa35
backport 3.5
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3072
diff
changeset
|
149 |
return # ignore changes triggered by hooks or maintainance shell |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
150 |
dest = self._cw.vreg.config['supervising-addrs'] |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
151 |
if not dest: # no supervisors, don't do this for nothing... |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
152 |
return |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
153 |
if self._call(): |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
154 |
SupervisionMailOp(self._cw) |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
155 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
156 |
def _call(self): |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
157 |
event = self.event.split('_', 1)[1] |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
158 |
if event == 'update_entity': |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
159 |
if self._cw.added_in_transaction(self.entity.eid): |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
160 |
return False |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
161 |
if self.entity.e_schema == 'CWUser': |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
162 |
if not (self.entity.edited_attributes - frozenset(('eid', 'modification_date', |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
163 |
'last_login_time'))): |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
164 |
# don't record last_login_time update which are done |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
165 |
# automatically at login time |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
166 |
return False |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
167 |
self._cw.transaction_data.setdefault('pendingchanges', []).append( |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
168 |
(event, self)) |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
169 |
return True |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
170 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
171 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
172 |
class EntityDeleteHook(SomethingChangedHook): |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3163
diff
changeset
|
173 |
__regid__ = 'supervisingentitydel' |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
174 |
events = ('before_delete_entity',) |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
175 |
|
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
176 |
def _call(self): |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
177 |
try: |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
178 |
title = self.entity.dc_title() |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
179 |
except: |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
180 |
# may raise an error during deletion process, for instance due to |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
181 |
# missing required relation |
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
182 |
title = '#%s' % eid |
2847
c2ee28f4d4b1
use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2841
diff
changeset
|
183 |
self._cw.transaction_data.setdefault('pendingchanges', []).append( |
3427
78dfef45ee48
[notification] add missing import, fix dummy AttributeError in RenderAndSendNotificationView
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3422
diff
changeset
|
184 |
('delete_entity', (self.entity.eid, str(self.entity.e_schema), title))) |
2841
107ba1c45227
rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff
changeset
|
185 |
return True |