author | Aurelien Campeas <aurelien.campeas@logilab.fr> |
Thu, 08 Apr 2010 19:36:36 +0200 | |
branch | stable |
changeset 5191 | 6d182c7d4392 |
parent 2172 | cf8f9180e63e |
child 5202 | 4a77da652759 |
permissions | -rw-r--r-- |
1714
a721966779be
new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
1 |
.. -*- coding: utf-8 -*- |
a721966779be
new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
2 |
|
a721966779be
new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
3 |
.. _hooks: |
a721966779be
new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
4 |
|
5191
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
5 |
Hooks and Operations |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
6 |
==================== |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
7 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
8 |
Principles |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
9 |
---------- |
1714
a721966779be
new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
10 |
|
5191
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
11 |
Paraphrasing the `emacs`_ documentation, let us say that hooks are an |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
12 |
important mechanism for customizing an application. A hook is |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
13 |
basically a list of functions to be called on some well-defined |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
14 |
occasion (This is called `running the hook`). |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
15 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
16 |
.. _`emacs`: http://www.gnu.org/software/emacs/manual/html_node/emacs/Hooks.html |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
17 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
18 |
In CubicWeb, hooks are classes subclassing the Hook class in |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
19 |
`server/hook.py`, implementing their own `call` method, and defined |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
20 |
over pre-defined `events`. |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
21 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
22 |
There are two families of events: data events and server events. In a |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
23 |
typical application, most of the Hooks are defined over data |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
24 |
events. There can be a lot of them. |
1714
a721966779be
new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
25 |
|
5191
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
26 |
The purpose of data hooks is to complement the data model as defined |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
27 |
in the schema.py, which is static by nature, with dynamic or value |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
28 |
driven behaviours. It is functionally equivalent to a `database |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
29 |
trigger`_, except that database triggers definitions languages are not |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
30 |
standardized, hence not portable (for instance, PL/SQL works with |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
31 |
Oracle and PostgreSQL but not SqlServer nor Sqlite). |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
32 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
33 |
.. _`database trigger`: http://en.wikipedia.org/wiki/Database_trigger |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
34 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
35 |
Data hooks can serve the following purposes: |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
36 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
37 |
* enforcing constraints that the static schema cannot express |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
38 |
(spanning several entities/relations, exotic cardinalities, etc.) |
1714
a721966779be
new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
39 |
|
5191
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
40 |
* implement computed attributes (an example could be the maintenance |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
41 |
of a relation representing the transitive closure of another relation) |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
42 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
43 |
Operations are Hook-like objects that are created by Hooks and |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
44 |
scheduled to happen just before (or after) the `commit` event. Hooks |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
45 |
being fired immediately on data operations, it is sometime necessary |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
46 |
to delay the actual work down to a time where all other Hooks have run |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
47 |
and the application state converges towards consistency. Also while |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
48 |
the order of execution of Hooks is data dependant (and thus hard to |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
49 |
predict), it is possible to force an order on Operations. |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
50 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
51 |
Events |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
52 |
------ |
2172
cf8f9180e63e
delete-trailing-whitespace
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
1714
diff
changeset
|
53 |
|
5191
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
54 |
Hooks are mostly defined and used to handle `dataflow`_ operations. It |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
55 |
means as data gets in (mostly), specific events are issued and the |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
56 |
Hooks matching these events are called. |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
57 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
58 |
.. _`dataflow`: http://en.wikipedia.org/wiki/Dataflow |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
59 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
60 |
Below comes a list of the dataflow events related to entities operations: |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
61 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
62 |
* before_add_entity |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
63 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
64 |
* before_update_entity |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
65 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
66 |
* before_delete_entity |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
67 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
68 |
* after_add_entity |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
69 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
70 |
* after_update_entity |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
71 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
72 |
* after_delete_entity |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
73 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
74 |
These define ENTTIES HOOKS. RELATIONS HOOKS are defined |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
75 |
over the following events: |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
76 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
77 |
* after_add_relation |
1714
a721966779be
new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
78 |
|
5191
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
79 |
* after_delete_relation |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
80 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
81 |
* before_add_relation |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
82 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
83 |
* before_delete_relation |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
84 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
85 |
This is an occasion to remind us that relations support the add/delete |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
86 |
operation, but no delete. |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
87 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
88 |
Non data events also exist. These are called SYSTEM HOOKS. |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
89 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
90 |
* server_startup |
2172
cf8f9180e63e
delete-trailing-whitespace
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
1714
diff
changeset
|
91 |
|
5191
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
92 |
* server_shutdown |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
93 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
94 |
* server_maintenance |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
95 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
96 |
* server_backup |
2172
cf8f9180e63e
delete-trailing-whitespace
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
1714
diff
changeset
|
97 |
|
5191
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
98 |
* server_restore |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
99 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
100 |
* session_open |
1714
a721966779be
new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
101 |
|
5191
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
102 |
* session_close |
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
103 |
|
6d182c7d4392
[doc/book] begin chapter on Hooks/Operations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2172
diff
changeset
|
104 |