author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Fri, 22 Oct 2010 18:08:05 +0200 | |
branch | stable |
changeset 6603 | 1ba51b00fc44 |
parent 6152 | 6824f8b61098 |
child 6162 | 76bd320c5ace |
permissions | -rw-r--r-- |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
1 |
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
2 |
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
3 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
4 |
# This file is part of CubicWeb. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
5 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
6 |
# CubicWeb is free software: you can redistribute it and/or modify it under the |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
7 |
# terms of the GNU Lesser General Public License as published by the Free |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
8 |
# Software Foundation, either version 2.1 of the License, or (at your option) |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
9 |
# any later version. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
10 |
# |
5424
8ecbcbff9777
replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5421
diff
changeset
|
11 |
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
12 |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
13 |
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
14 |
# details. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
15 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
16 |
# You should have received a copy of the GNU Lesser General Public License along |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5306
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
18 |
""".. VRegistry: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
19 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
20 |
The `VRegistry` |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
21 |
--------------- |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
22 |
|
5608
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
23 |
The `VRegistry` can be seen as a two-level dictionary. It contains |
5306
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
24 |
all dynamically loaded objects (subclasses of :ref:`appobject`) to |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
25 |
build a |cubicweb| application. Basically: |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
26 |
|
5306
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
27 |
* the first level key returns a *registry*. This key corresponds to the |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
28 |
`__registry__` attribute of application object classes |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
29 |
|
5306
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
30 |
* the second level key returns a list of application objects which |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
31 |
share the same identifier. This key corresponds to the `__regid__` |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
32 |
attribute of application object classes. |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
33 |
|
5306
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
34 |
A *registry* holds a specific kind of application objects. There is |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
35 |
for instance a registry for entity classes, another for views, etc... |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
36 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
37 |
The `VRegistry` has two main responsibilities: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
38 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
39 |
- being the access point to all registries |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
40 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
41 |
- handling the registration process at startup time, and during automatic |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
42 |
reloading in debug mode. |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
43 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
44 |
.. _AppObjectRecording: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
45 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
46 |
Details of the recording process |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
47 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
48 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
49 |
.. index:: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
50 |
vregistry: registration_callback |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
51 |
|
5608
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
52 |
On startup, |cubicweb| loads application objects defined in its library |
5306
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
53 |
and in cubes used by the instance. Application objects from the |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
54 |
library are loaded first, then those provided by cubes are loaded in |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
55 |
dependency order (e.g. if your cube depends on an other, objects from |
5608
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
56 |
the dependency will be loaded first). The layout of the modules or packages |
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
57 |
in a cube is explained in :ref:`cubelayout`. |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
58 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
59 |
For each module: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
60 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
61 |
* by default all objects are registered automatically |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
62 |
|
5306
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
63 |
* if some objects have to replace other objects, or have to be |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
64 |
included only if some condition is met, you'll have to define a |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
65 |
`registration_callback(vreg)` function in your module and explicitly |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
66 |
register **all objects** in this module, using the api defined |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
67 |
below. |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
68 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
69 |
.. Note:: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
70 |
Once the function `registration_callback(vreg)` is implemented in a module, |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
71 |
all the objects from this module have to be explicitly registered as it |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
72 |
disables the automatic objects registration. |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
73 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
74 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
75 |
API for objects registration |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
76 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
77 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
78 |
Here are the registration methods that you can use in the `registration_callback` |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
79 |
to register your objects to the `VRegistry` instance given as argument (usually |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
80 |
named `vreg`): |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
81 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
82 |
.. automethod:: cubicweb.cwvreg.CubicWebVRegistry.register_all |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
83 |
.. automethod:: cubicweb.cwvreg.CubicWebVRegistry.register_and_replace |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
84 |
.. automethod:: cubicweb.cwvreg.CubicWebVRegistry.register |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
85 |
.. automethod:: cubicweb.cwvreg.CubicWebVRegistry.unregister |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
86 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
87 |
Examples: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
88 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
89 |
.. sourcecode:: python |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
90 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
91 |
# web/views/basecomponents.py |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
92 |
def registration_callback(vreg): |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
93 |
# register everything in the module except SeeAlsoComponent |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
94 |
vreg.register_all(globals().values(), __name__, (SeeAlsoVComponent,)) |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
95 |
# conditionally register SeeAlsoVComponent |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
96 |
if 'see_also' in vreg.schema: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
97 |
vreg.register(SeeAlsoVComponent) |
0 | 98 |
|
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
99 |
In this example, we register all application object classes defined in the module |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
100 |
except `SeeAlsoVComponent`. This class is then registered only if the 'see_also' |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
101 |
relation type is defined in the instance'schema. |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
102 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
103 |
.. sourcecode:: python |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
104 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
105 |
# goa/appobjects/sessions.py |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
106 |
def registration_callback(vreg): |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
107 |
vreg.register(SessionsCleaner) |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
108 |
# replace AuthenticationManager by GAEAuthenticationManager |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
109 |
vreg.register_and_replace(GAEAuthenticationManager, AuthenticationManager) |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
110 |
# replace PersistentSessionManager by GAEPersistentSessionManager |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
111 |
vreg.register_and_replace(GAEPersistentSessionManager, PersistentSessionManager) |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
112 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
113 |
In this example, we explicitly register classes one by one: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
114 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
115 |
* the `SessionCleaner` class |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
116 |
* the `GAEAuthenticationManager` to replace the `AuthenticationManager` |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
117 |
* the `GAEPersistentSessionManager` to replace the `PersistentSessionManager` |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
118 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
119 |
If at some point we register a new appobject class in this module, it won't be |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
120 |
registered at all without modification to the `registration_callback` |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
121 |
implementation. The previous example will register it though, thanks to the call |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
122 |
to the `register_all` method. |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
123 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
124 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
125 |
.. _Selection: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
126 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
127 |
Runtime objects selection |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
128 |
~~~~~~~~~~~~~~~~~~~~~~~~~ |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
129 |
|
5306
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
130 |
Now that we have all application objects loaded, the question is : when |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
131 |
I want some specific object, for instance the primary view for a given |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
132 |
entity, how do I get the proper object ? This is what we call the |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
133 |
**selection mechanism**. |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
134 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
135 |
As explained in the :ref:`Concepts` section: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
136 |
|
5306
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
137 |
* each application object has a **selector**, defined by its |
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
138 |
`__select__` class attribute |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
139 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
140 |
* this selector is responsible to return a **score** for a given context |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
141 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
142 |
- 0 score means the object doesn't apply to this context |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
143 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
144 |
- else, the higher the score, the better the object suits the context |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
145 |
|
5608
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
146 |
* the object with the highest score is selected. |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
147 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
148 |
.. Note:: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
149 |
|
5608
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
150 |
When no single object has the highest score, an exception is raised in development |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
151 |
mode to let you know that the engine was not able to identify the view to |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
152 |
apply. This error is silenced in production mode and one of the objects with |
5608
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
153 |
the highest score is picked. |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
154 |
|
5608
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
155 |
In such cases you would need to review your design and make sure |
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
156 |
your selectors or appobjects are properly defined. Such an error is |
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
157 |
typically caused by either forgetting to change the __regid__ in a |
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
158 |
derived class, or by having copy-pasted some code. |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
159 |
|
5608
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
160 |
For instance, if you are selecting the primary (`__regid__ = |
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
161 |
'primary'`) view (`__registry__ = 'views'`) for a result set |
5306
763319a51e72
[doc/book] some fixes for vregistry, selectors & appobjects
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5275
diff
changeset
|
162 |
containing a `Card` entity, two objects will probably be selectable: |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
163 |
|
6152
6824f8b61098
use is_instance in a number of places (esp. documentation) rather than the deprecated implements
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6046
diff
changeset
|
164 |
* the default primary view (`__select__ = is_instance('Any')`), meaning |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
165 |
that the object is selectable for any kind of entity type |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
166 |
|
6152
6824f8b61098
use is_instance in a number of places (esp. documentation) rather than the deprecated implements
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6046
diff
changeset
|
167 |
* the specific `Card` primary view (`__select__ = is_instance('Card')`, |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
168 |
meaning that the object is selectable for Card entities |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
169 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
170 |
Other primary views specific to other entity types won't be selectable in this |
6152
6824f8b61098
use is_instance in a number of places (esp. documentation) rather than the deprecated implements
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
6046
diff
changeset
|
171 |
case. Among selectable objects, the `is_instance('Card')` selector will return a higher |
5608
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
172 |
score since it's more specific, so the correct view will be selected as expected. |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
173 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
174 |
.. _SelectionAPI: |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
175 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
176 |
API for objects selections |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
177 |
~~~~~~~~~~~~~~~~~~~~~~~~~~ |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
178 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
179 |
Here is the selection API you'll get on every registry. Some of them, as the |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
180 |
'etypes' registry, containing entity classes, extend it. In those methods, |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
181 |
`*args, **kwargs` is what we call the **context**. Those arguments are given to |
5608
f9ab62103ad4
proof read documentation
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5426
diff
changeset
|
182 |
selectors that will inspect their content and return a score accordingly. |
5147
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
183 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
184 |
.. automethod:: cubicweb.vregistry.Registry.select |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
185 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
186 |
.. automethod:: cubicweb.vregistry.Registry.select_or_none |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
187 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
188 |
.. automethod:: cubicweb.vregistry.Registry.possible_objects |
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
189 |
|
70181998897f
more / cleaner / in code documentation of vreg, selectors and appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5143
diff
changeset
|
190 |
.. automethod:: cubicweb.vregistry.Registry.object_by_id |
0 | 191 |
""" |
5886 | 192 |
|
0 | 193 |
__docformat__ = "restructuredtext en" |
1769
fb91d2b8a441
fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents:
1752
diff
changeset
|
194 |
_ = unicode |
0 | 195 |
|
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
196 |
from warnings import warn |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
197 |
|
4719
aaed3f813ef8
kill dead/useless code as suggested by pylint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4490
diff
changeset
|
198 |
from logilab.common.decorators import cached, clear_cache |
2613
5e19c2bb370e
R [all] logilab.common 0.44 provides only deprecated
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2476
diff
changeset
|
199 |
from logilab.common.deprecation import deprecated |
2684
c84691380dd4
[autoreload] remove all modules under vregistry_path() from sys.modules before reloading
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2669
diff
changeset
|
200 |
from logilab.common.modutils import cleanup_sys_modules |
0 | 201 |
|
202 |
from rql import RQLHelper |
|
203 |
||
2651
3ad936634d2a
[registry] when a source file is changed, reset and reload the whole registry
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2613
diff
changeset
|
204 |
from cubicweb import (ETYPE_NAME_MAP, Binary, UnknownProperty, UnknownEid, |
2655 | 205 |
ObjectNotFound, NoSelectableObject, RegistryNotFound, |
5880
a022dcbed0d3
[vreg] new [before|after]-registry-reset event, taking vreg as argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5753
diff
changeset
|
206 |
CW_EVENT_MANAGER) |
2658
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
207 |
from cubicweb.utils import dump_class |
6037
1b4ea3ebdf80
[vreg debug] use classid to get cleaner output
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6014
diff
changeset
|
208 |
from cubicweb.vregistry import VRegistry, Registry, class_regid, classid |
1769
fb91d2b8a441
fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents:
1752
diff
changeset
|
209 |
from cubicweb.rtags import RTAGS |
0 | 210 |
|
5035
8469d0acd949
[i18ncube] clear_rtag_objects imported when generating cube's .po file
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4996
diff
changeset
|
211 |
def clear_rtag_objects(): |
8469d0acd949
[i18ncube] clear_rtag_objects imported when generating cube's .po file
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4996
diff
changeset
|
212 |
for rtag in RTAGS: |
8469d0acd949
[i18ncube] clear_rtag_objects imported when generating cube's .po file
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4996
diff
changeset
|
213 |
rtag.clear() |
0 | 214 |
|
776 | 215 |
def use_interfaces(obj): |
3719 | 216 |
"""return interfaces used by the given object by searching for implements |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
217 |
selectors |
1132 | 218 |
""" |
776 | 219 |
from cubicweb.selectors import implements |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
220 |
impl = obj.__select__.search_selector(implements) |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
221 |
if impl: |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
222 |
return sorted(impl.expected_ifaces) |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
223 |
return () |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
224 |
|
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
225 |
def require_appobject(obj): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
226 |
"""return interfaces used by the given object by searching for implements |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
227 |
selectors |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
228 |
""" |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
229 |
from cubicweb.selectors import appobject_selectable |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
230 |
impl = obj.__select__.search_selector(appobject_selectable) |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
231 |
if impl: |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
232 |
return (impl.registry, impl.regids) |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
233 |
return None |
0 | 234 |
|
235 |
||
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
236 |
class CWRegistry(Registry): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
237 |
def __init__(self, vreg): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
238 |
super(CWRegistry, self).__init__(vreg.config) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
239 |
self.vreg = vreg |
2927
d249dd9000d9
use a property for schema, avoid bad schema reference
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2914
diff
changeset
|
240 |
|
d249dd9000d9
use a property for schema, avoid bad schema reference
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2914
diff
changeset
|
241 |
@property |
d249dd9000d9
use a property for schema, avoid bad schema reference
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2914
diff
changeset
|
242 |
def schema(self): |
d249dd9000d9
use a property for schema, avoid bad schema reference
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2914
diff
changeset
|
243 |
return self.vreg.schema |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
244 |
|
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
245 |
@deprecated('[3.6] select object, then use obj.render()') |
3704
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
246 |
def render(self, __oid, req, __fallback_oid=None, rset=None, initargs=None, |
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
247 |
**kwargs): |
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
248 |
"""Select object with the given id (`__oid`) then render it. If the |
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
249 |
object isn't selectable, try to select fallback object if |
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
250 |
`__fallback_oid` is specified. |
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
251 |
|
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
252 |
If specified `initargs` is expected to be a dictionnary containing |
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
253 |
arguments that should be given to selection (hence to object's __init__ |
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
254 |
as well), but not to render(). Other arbitrary keyword arguments will be |
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
255 |
given to selection *and* to render(), and so should be handled by |
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
256 |
object's call or cell_call method.. |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
257 |
""" |
3704
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
258 |
if initargs is None: |
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
259 |
initargs = kwargs |
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
260 |
else: |
3706 | 261 |
initargs.update(kwargs) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
262 |
try: |
3704
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
263 |
obj = self.select(__oid, req, rset=rset, **initargs) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
264 |
except NoSelectableObject: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
265 |
if __fallback_oid is None: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
266 |
raise |
3704
ddb10568f5f8
a way to distinguish __init__ vs render arguments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3702
diff
changeset
|
267 |
obj = self.select(__fallback_oid, req, rset=rset, **initargs) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
268 |
return obj.render(**kwargs) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
269 |
|
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
270 |
@deprecated('[3.6] use select_or_none and test for obj.cw_propval("visible")') |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
271 |
def select_vobject(self, oid, *args, **kwargs): |
2770
356e9d7c356d
R propagate registry API changes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2705
diff
changeset
|
272 |
selected = self.select_or_none(oid, *args, **kwargs) |
2818
326375561412
propagate some api changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2815
diff
changeset
|
273 |
if selected and selected.cw_propval('visible'): |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
274 |
return selected |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
275 |
return None |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
276 |
|
2805
c6d10de521bc
R deprecate CWRegistry.possible_vobjects
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2800
diff
changeset
|
277 |
def poss_visible_objects(self, *args, **kwargs): |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
278 |
"""return an ordered list of possible app objects in a given registry, |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
279 |
supposing they support the 'visible' and 'order' properties (as most |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
280 |
visualizable objects) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
281 |
""" |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
282 |
return sorted([x for x in self.possible_objects(*args, **kwargs) |
2818
326375561412
propagate some api changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2815
diff
changeset
|
283 |
if x.cw_propval('visible')], |
326375561412
propagate some api changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2815
diff
changeset
|
284 |
key=lambda x: x.cw_propval('order')) |
2968
0e3460341023
somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
285 |
possible_vobjects = deprecated('[3.6] use poss_visible_objects()')(poss_visible_objects) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
286 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
287 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
288 |
VRegistry.REGISTRY_FACTORY[None] = CWRegistry |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
289 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
290 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
291 |
class ETypeRegistry(CWRegistry): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
292 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
293 |
def initialization_completed(self): |
2658
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
294 |
"""on registration completed, clear etype_class internal cache |
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
295 |
""" |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
296 |
super(ETypeRegistry, self).initialization_completed() |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
297 |
# clear etype cache if you don't want to run into deep weirdness |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
298 |
clear_cache(self, 'etype_class') |
4291
62a315e61adb
clear vreg's parent_classes cache to fix etype cache / auto-reloading bug
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4252
diff
changeset
|
299 |
clear_cache(self, 'parent_classes') |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
300 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
301 |
def register(self, obj, **kwargs): |
2829
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2824
diff
changeset
|
302 |
oid = kwargs.get('oid') or class_regid(obj) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
303 |
if oid != 'Any' and not oid in self.schema: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
304 |
self.error('don\'t register %s, %s type not defined in the ' |
2829
054a8805da52
turn id into __id__
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2824
diff
changeset
|
305 |
'schema', obj, oid) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
306 |
return |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
307 |
kwargs['clear'] = True |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
308 |
super(ETypeRegistry, self).register(obj, **kwargs) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
309 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
310 |
@cached |
2824
3455f72010fe
better as a method of the etypes registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2818
diff
changeset
|
311 |
def parent_classes(self, etype): |
2894
4b720d82a1e4
take care in case Any is given
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2829
diff
changeset
|
312 |
if etype == 'Any': |
6046
3fd4a34c4a09
[selectors] fix is_instance bug w/ parent classes. Also slight performance enhancements by changing what's returned by vreg['etypes'].parent_classes method (dedicated for this usage...) and removing no more necessary methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6037
diff
changeset
|
313 |
return (), self.etype_class('Any') |
3fd4a34c4a09
[selectors] fix is_instance bug w/ parent classes. Also slight performance enhancements by changing what's returned by vreg['etypes'].parent_classes method (dedicated for this usage...) and removing no more necessary methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6037
diff
changeset
|
314 |
parents = tuple(self.etype_class(e.type) |
3fd4a34c4a09
[selectors] fix is_instance bug w/ parent classes. Also slight performance enhancements by changing what's returned by vreg['etypes'].parent_classes method (dedicated for this usage...) and removing no more necessary methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6037
diff
changeset
|
315 |
for e in self.schema.eschema(etype).ancestors()) |
3fd4a34c4a09
[selectors] fix is_instance bug w/ parent classes. Also slight performance enhancements by changing what's returned by vreg['etypes'].parent_classes method (dedicated for this usage...) and removing no more necessary methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6037
diff
changeset
|
316 |
return parents, self.etype_class('Any') |
2824
3455f72010fe
better as a method of the etypes registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2818
diff
changeset
|
317 |
|
3455f72010fe
better as a method of the etypes registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2818
diff
changeset
|
318 |
@cached |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
319 |
def etype_class(self, etype): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
320 |
"""return an entity class for the given entity type. |
2658
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
321 |
|
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
322 |
Try to find out a specific class for this kind of entity or default to a |
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
323 |
dump of the nearest parent class (in yams inheritance) registered. |
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
324 |
|
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
325 |
Fall back to 'Any' if not yams parent class found. |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
326 |
""" |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
327 |
etype = str(etype) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
328 |
if etype == 'Any': |
4149
ecde9f78a080
etype_class('Any') should return bare 'Any' class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3998
diff
changeset
|
329 |
objects = self['Any'] |
ecde9f78a080
etype_class('Any') should return bare 'Any' class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3998
diff
changeset
|
330 |
assert len(objects) == 1, objects |
ecde9f78a080
etype_class('Any') should return bare 'Any' class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3998
diff
changeset
|
331 |
return objects[0] |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
332 |
eschema = self.schema.eschema(etype) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
333 |
baseschemas = [eschema] + eschema.ancestors() |
2658
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
334 |
# browse ancestors from most specific to most generic and try to find an |
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
335 |
# associated custom entity class |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
336 |
for baseschema in baseschemas: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
337 |
try: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
338 |
btype = ETYPE_NAME_MAP[baseschema] |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
339 |
except KeyError: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
340 |
btype = str(baseschema) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
341 |
try: |
2658
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
342 |
objects = self[btype] |
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
343 |
assert len(objects) == 1, objects |
3137
5598bec9be7f
fix so that we ensure issubclass(etype_class('SubNote'), etype_class('Note'))
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3071
diff
changeset
|
344 |
if btype == etype: |
3172
9341ab8f1d1a
[vreg] we must ensure that parent classes are initialiazed first
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3057
diff
changeset
|
345 |
cls = objects[0] |
3137
5598bec9be7f
fix so that we ensure issubclass(etype_class('SubNote'), etype_class('Note'))
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3071
diff
changeset
|
346 |
else: |
5598bec9be7f
fix so that we ensure issubclass(etype_class('SubNote'), etype_class('Note'))
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3071
diff
changeset
|
347 |
# recurse to ensure issubclass(etype_class('Child'), |
5598bec9be7f
fix so that we ensure issubclass(etype_class('SubNote'), etype_class('Note'))
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3071
diff
changeset
|
348 |
# etype_class('Parent')) |
5598bec9be7f
fix so that we ensure issubclass(etype_class('SubNote'), etype_class('Note'))
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3071
diff
changeset
|
349 |
cls = self.etype_class(btype) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
350 |
break |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
351 |
except ObjectNotFound: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
352 |
pass |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
353 |
else: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
354 |
# no entity class for any of the ancestors, fallback to the default |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
355 |
# one |
2658
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
356 |
objects = self['Any'] |
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
357 |
assert len(objects) == 1, objects |
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
358 |
cls = objects[0] |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
359 |
# make a copy event if cls.__regid__ == etype, else we may have pb for |
3035 | 360 |
# client application using multiple connections to different |
361 |
# repositories (eg shingouz) |
|
2658
5535857eeaa5
[appobject selection process] drop the need for the .selected method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
362 |
cls = dump_class(cls, etype) |
3376
f5c69485381f
[appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
363 |
cls.__regid__ = etype |
2807
696ff03f9a58
__initialize__ needs the schema as argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2804
diff
changeset
|
364 |
cls.__initialize__(self.schema) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
365 |
return cls |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
366 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
367 |
VRegistry.REGISTRY_FACTORY['etypes'] = ETypeRegistry |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
368 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
369 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
370 |
class ViewsRegistry(CWRegistry): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
371 |
|
3655
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3451
diff
changeset
|
372 |
def main_template(self, req, oid='main-template', rset=None, **kwargs): |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
373 |
"""display query by calling the given template (default to main), |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
374 |
and returning the output as a string instead of requiring the [w]rite |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
375 |
method as argument |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
376 |
""" |
3655
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3451
diff
changeset
|
377 |
obj = self.select(oid, req, rset=rset, **kwargs) |
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3451
diff
changeset
|
378 |
res = obj.render(**kwargs) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
379 |
if isinstance(res, unicode): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
380 |
return res.encode(req.encoding) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
381 |
assert isinstance(res, str) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
382 |
return res |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
383 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
384 |
def possible_views(self, req, rset=None, **kwargs): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
385 |
"""return an iterator on possible views for this result set |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
386 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
387 |
views returned are classes, not instances |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
388 |
""" |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
389 |
for vid, views in self.items(): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
390 |
if vid[0] == '_': |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
391 |
continue |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
392 |
try: |
2770
356e9d7c356d
R propagate registry API changes
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2705
diff
changeset
|
393 |
view = self._select_best(views, req, rset=rset, **kwargs) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
394 |
if view.linkable(): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
395 |
yield view |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
396 |
except NoSelectableObject: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
397 |
continue |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
398 |
except Exception: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
399 |
self.exception('error while trying to select %s view for %s', |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
400 |
vid, rset) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
401 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
402 |
VRegistry.REGISTRY_FACTORY['views'] = ViewsRegistry |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
403 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
404 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
405 |
class ActionsRegistry(CWRegistry): |
5246
3246b1f88a18
[web] stop having actions configurable through cwproperties: this clutter site management and .po files for a useless fonctionnality (which, where and how actions are displayed is handled by code)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
406 |
def poss_visible_objects(self, *args, **kwargs): |
3246b1f88a18
[web] stop having actions configurable through cwproperties: this clutter site management and .po files for a useless fonctionnality (which, where and how actions are displayed is handled by code)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
407 |
"""return an ordered list of possible actions""" |
3246b1f88a18
[web] stop having actions configurable through cwproperties: this clutter site management and .po files for a useless fonctionnality (which, where and how actions are displayed is handled by code)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
408 |
return sorted(self.possible_objects(*args, **kwargs), |
3246b1f88a18
[web] stop having actions configurable through cwproperties: this clutter site management and .po files for a useless fonctionnality (which, where and how actions are displayed is handled by code)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
409 |
key=lambda x: x.order) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
410 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
411 |
def possible_actions(self, req, rset=None, **kwargs): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
412 |
if rset is None: |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3376
diff
changeset
|
413 |
actions = self.poss_visible_objects(req, rset=rset, **kwargs) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
414 |
else: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
415 |
actions = rset.possible_actions(**kwargs) # cached implementation |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
416 |
result = {} |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
417 |
for action in actions: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
418 |
result.setdefault(action.category, []).append(action) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
419 |
return result |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
420 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
421 |
VRegistry.REGISTRY_FACTORY['actions'] = ActionsRegistry |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
422 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
423 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
424 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
425 |
class CubicWebVRegistry(VRegistry): |
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2389
diff
changeset
|
426 |
"""Central registry for the cubicweb instance, extending the generic |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
427 |
VRegistry with some cubicweb specific stuff. |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
428 |
|
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2389
diff
changeset
|
429 |
This is one of the central object in cubicweb instance, coupling |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
430 |
dynamically loaded objects with the schema and the configuration objects. |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
431 |
|
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
432 |
It specializes the VRegistry by adding some convenience methods to access to |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
433 |
stored objects. Currently we have the following registries of objects known |
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2389
diff
changeset
|
434 |
by the web instance (library may use some others additional registries): |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
435 |
|
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
436 |
* etypes |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
437 |
* views |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
438 |
* components |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
439 |
* actions |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
440 |
* forms |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
441 |
* formrenderers |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
442 |
* controllers, which are directly plugged into the application |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
443 |
object to handle request publishing XXX to merge with views |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
444 |
* contentnavigation XXX to merge with components? to kill? |
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
445 |
""" |
1475
5c1ec97f317e
should not be necessary anymore to add entity class to __implements__
sylvain.thenault@logilab.fr
parents:
1357
diff
changeset
|
446 |
|
5442
3ed8afbbdf70
[webconfig] refactor/cleanup debug mode management on startup: simply use config.debugmode instead of debug argument everywhere...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
447 |
def __init__(self, config, initlog=True): |
169
0e031b66cb0b
don't systematically init_log, it may breaks client log configuration
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
0
diff
changeset
|
448 |
if initlog: |
0e031b66cb0b
don't systematically init_log, it may breaks client log configuration
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
0
diff
changeset
|
449 |
# first init log service |
5442
3ed8afbbdf70
[webconfig] refactor/cleanup debug mode management on startup: simply use config.debugmode instead of debug argument everywhere...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5426
diff
changeset
|
450 |
config.init_log() |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
451 |
super(CubicWebVRegistry, self).__init__(config) |
0 | 452 |
self.schema = None |
2906
677fa98659a8
fix cw properties initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2761
diff
changeset
|
453 |
self.initialized = False |
5080
cfc7c2b24f9e
[cleanup] some notes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5035
diff
changeset
|
454 |
# XXX give force_reload (or refactor [re]loading...) |
4996
45ce27d538a1
[test] don't clear rtags during tests, may cause breakage with manually import appobjects modules (see unittest_tracker for instance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4966
diff
changeset
|
455 |
if self.config.mode != 'test': |
45ce27d538a1
[test] don't clear rtags during tests, may cause breakage with manually import appobjects modules (see unittest_tracker for instance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4966
diff
changeset
|
456 |
# don't clear rtags during test, this may cause breakage with |
45ce27d538a1
[test] don't clear rtags during tests, may cause breakage with manually import appobjects modules (see unittest_tracker for instance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4966
diff
changeset
|
457 |
# manually imported appobject modules |
5035
8469d0acd949
[i18ncube] clear_rtag_objects imported when generating cube's .po file
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4996
diff
changeset
|
458 |
CW_EVENT_MANAGER.bind('before-registry-reload', clear_rtag_objects) |
1475
5c1ec97f317e
should not be necessary anymore to add entity class to __implements__
sylvain.thenault@logilab.fr
parents:
1357
diff
changeset
|
459 |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
460 |
def setdefault(self, regid): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
461 |
try: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
462 |
return self[regid] |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
463 |
except RegistryNotFound: |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
464 |
self[regid] = self.registry_class(regid)(self) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
465 |
return self[regid] |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
466 |
|
0 | 467 |
def items(self): |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
468 |
return [item for item in super(CubicWebVRegistry, self).items() |
0 | 469 |
if not item[0] in ('propertydefs', 'propertyvalues')] |
2669
cab66dfe0db6
to avoid confusions, implements iteritems/itervalues as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2659
diff
changeset
|
470 |
def iteritems(self): |
cab66dfe0db6
to avoid confusions, implements iteritems/itervalues as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2659
diff
changeset
|
471 |
return (item for item in super(CubicWebVRegistry, self).iteritems() |
cab66dfe0db6
to avoid confusions, implements iteritems/itervalues as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2659
diff
changeset
|
472 |
if not item[0] in ('propertydefs', 'propertyvalues')) |
0 | 473 |
|
474 |
def values(self): |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
475 |
return [value for key, value in self.items()] |
2669
cab66dfe0db6
to avoid confusions, implements iteritems/itervalues as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2659
diff
changeset
|
476 |
def itervalues(self): |
cab66dfe0db6
to avoid confusions, implements iteritems/itervalues as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2659
diff
changeset
|
477 |
return (value for key, value in self.items()) |
1475
5c1ec97f317e
should not be necessary anymore to add entity class to __implements__
sylvain.thenault@logilab.fr
parents:
1357
diff
changeset
|
478 |
|
5273
c4caef6f09c9
[vreg] refactor the [re]loading process so things get clearer and fix spurious errors on edge cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5147
diff
changeset
|
479 |
def reset(self): |
5880
a022dcbed0d3
[vreg] new [before|after]-registry-reset event, taking vreg as argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5753
diff
changeset
|
480 |
CW_EVENT_MANAGER.emit('before-registry-reset', self) |
5273
c4caef6f09c9
[vreg] refactor the [re]loading process so things get clearer and fix spurious errors on edge cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5147
diff
changeset
|
481 |
super(CubicWebVRegistry, self).reset() |
666
8ad9885ea45a
interface handling should be done here
sylvain.thenault@logilab.fr
parents:
631
diff
changeset
|
482 |
self._needs_iface = {} |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
483 |
self._needs_appobject = {} |
666
8ad9885ea45a
interface handling should be done here
sylvain.thenault@logilab.fr
parents:
631
diff
changeset
|
484 |
# two special registries, propertydefs which care all the property |
8ad9885ea45a
interface handling should be done here
sylvain.thenault@logilab.fr
parents:
631
diff
changeset
|
485 |
# definitions, and propertyvals which contains values for those |
8ad9885ea45a
interface handling should be done here
sylvain.thenault@logilab.fr
parents:
631
diff
changeset
|
486 |
# properties |
2906
677fa98659a8
fix cw properties initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2761
diff
changeset
|
487 |
if not self.initialized: |
677fa98659a8
fix cw properties initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2761
diff
changeset
|
488 |
self['propertydefs'] = {} |
677fa98659a8
fix cw properties initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2761
diff
changeset
|
489 |
self['propertyvalues'] = self.eprop_values = {} |
677fa98659a8
fix cw properties initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2761
diff
changeset
|
490 |
for key, propdef in self.config.eproperty_definitions(): |
677fa98659a8
fix cw properties initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2761
diff
changeset
|
491 |
self.register_property(key, **propdef) |
5880
a022dcbed0d3
[vreg] new [before|after]-registry-reset event, taking vreg as argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5753
diff
changeset
|
492 |
CW_EVENT_MANAGER.emit('after-registry-reset', self) |
1475
5c1ec97f317e
should not be necessary anymore to add entity class to __implements__
sylvain.thenault@logilab.fr
parents:
1357
diff
changeset
|
493 |
|
0 | 494 |
def set_schema(self, schema): |
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2389
diff
changeset
|
495 |
"""set instance'schema and load application objects""" |
3240
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
496 |
self._set_schema(schema) |
0 | 497 |
# now we can load application's web objects |
5275
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
498 |
self.reload(self.config.vregistry_path(), force_reload=False) |
2273
daf6e178659f
new case_insensitive_etypes resource on the cubicweb registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2223
diff
changeset
|
499 |
# map lowered entity type names to their actual name |
daf6e178659f
new case_insensitive_etypes resource on the cubicweb registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2223
diff
changeset
|
500 |
self.case_insensitive_etypes = {} |
3692
54aa8d13aab4
clear eschema caches on schema changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3641
diff
changeset
|
501 |
for eschema in self.schema.entities(): |
54aa8d13aab4
clear eschema caches on schema changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3641
diff
changeset
|
502 |
etype = str(eschema) |
2273
daf6e178659f
new case_insensitive_etypes resource on the cubicweb registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2223
diff
changeset
|
503 |
self.case_insensitive_etypes[etype.lower()] = etype |
3692
54aa8d13aab4
clear eschema caches on schema changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3641
diff
changeset
|
504 |
clear_cache(eschema, 'ordered_relations') |
54aa8d13aab4
clear eschema caches on schema changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3641
diff
changeset
|
505 |
clear_cache(eschema, 'meta_attributes') |
1475
5c1ec97f317e
should not be necessary anymore to add entity class to __implements__
sylvain.thenault@logilab.fr
parents:
1357
diff
changeset
|
506 |
|
5273
c4caef6f09c9
[vreg] refactor the [re]loading process so things get clearer and fix spurious errors on edge cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5147
diff
changeset
|
507 |
def reload_if_needed(self): |
c4caef6f09c9
[vreg] refactor the [re]loading process so things get clearer and fix spurious errors on edge cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5147
diff
changeset
|
508 |
path = self.config.vregistry_path() |
c4caef6f09c9
[vreg] refactor the [re]loading process so things get clearer and fix spurious errors on edge cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5147
diff
changeset
|
509 |
if self.is_reload_needed(path): |
c4caef6f09c9
[vreg] refactor the [re]loading process so things get clearer and fix spurious errors on edge cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5147
diff
changeset
|
510 |
self.reload(path) |
c4caef6f09c9
[vreg] refactor the [re]loading process so things get clearer and fix spurious errors on edge cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5147
diff
changeset
|
511 |
|
5275
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
512 |
def reload(self, path, force_reload=True): |
5273
c4caef6f09c9
[vreg] refactor the [re]loading process so things get clearer and fix spurious errors on edge cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5147
diff
changeset
|
513 |
"""modification detected, reset and reload the vreg""" |
4966
e968e0a7776b
[registry] trigger reload events on set_schema()
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4719
diff
changeset
|
514 |
CW_EVENT_MANAGER.emit('before-registry-reload') |
5275
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
515 |
if force_reload: |
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
516 |
cleanup_sys_modules(path) |
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
517 |
cubes = self.config.cubes() |
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
518 |
# if the fs code use some cubes not yet registered into the instance |
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
519 |
# we should cleanup sys.modules for those as well to avoid potential |
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
520 |
# bad class reference pb after reloading |
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
521 |
cfg = self.config |
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
522 |
for cube in cfg.expand_cubes(cubes, with_recommends=True): |
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
523 |
if not cube in cubes: |
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
524 |
cpath = cfg.build_vregistry_cube_path([cfg.cube_dir(cube)]) |
32fbb13c06d3
[vreg] fix bug introduced in 5273:c4caef6f09c9 : we should not force_reload in vreg reset done because of a set_schema
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5273
diff
changeset
|
525 |
cleanup_sys_modules(cpath) |
5748
487ab6ac90cc
[auto-reload] we should never call load_module with use_sys=False, that may lead to inconsistency with module interdependancy (eg module get imported by another one, then is reimported by the vreg to load its appobjects. Cleanup of sys.modules done before reloading should be enough.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5608
diff
changeset
|
526 |
self.register_objects(path) |
4966
e968e0a7776b
[registry] trigger reload events on set_schema()
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4719
diff
changeset
|
527 |
CW_EVENT_MANAGER.emit('after-registry-reload') |
e968e0a7776b
[registry] trigger reload events on set_schema()
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4719
diff
changeset
|
528 |
|
3240
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
529 |
def _set_schema(self, schema): |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
530 |
"""set instance'schema""" |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
531 |
self.schema = schema |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
532 |
clear_cache(self, 'rqlhelper') |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
533 |
|
0 | 534 |
def update_schema(self, schema): |
535 |
"""update .schema attribute on registered objects, necessary for some |
|
536 |
tests |
|
537 |
""" |
|
538 |
self.schema = schema |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
539 |
for registry, regcontent in self.items(): |
0 | 540 |
for objects in regcontent.values(): |
541 |
for obj in objects: |
|
542 |
obj.schema = schema |
|
666
8ad9885ea45a
interface handling should be done here
sylvain.thenault@logilab.fr
parents:
631
diff
changeset
|
543 |
|
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
544 |
@deprecated('[3.9] use .register instead') |
666
8ad9885ea45a
interface handling should be done here
sylvain.thenault@logilab.fr
parents:
631
diff
changeset
|
545 |
def register_if_interface_found(self, obj, ifaces, **kwargs): |
5143
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5080
diff
changeset
|
546 |
"""register `obj` but remove it if no entity class implements one of |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5080
diff
changeset
|
547 |
the given `ifaces` interfaces at the end of the registration process. |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5080
diff
changeset
|
548 |
|
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5080
diff
changeset
|
549 |
Extra keyword arguments are given to the |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5080
diff
changeset
|
550 |
:meth:`~cubicweb.cwvreg.CubicWebVRegistry.register` function. |
666
8ad9885ea45a
interface handling should be done here
sylvain.thenault@logilab.fr
parents:
631
diff
changeset
|
551 |
""" |
785 | 552 |
self.register(obj, **kwargs) |
666
8ad9885ea45a
interface handling should be done here
sylvain.thenault@logilab.fr
parents:
631
diff
changeset
|
553 |
if not isinstance(ifaces, (tuple, list)): |
785 | 554 |
self._needs_iface[obj] = (ifaces,) |
666
8ad9885ea45a
interface handling should be done here
sylvain.thenault@logilab.fr
parents:
631
diff
changeset
|
555 |
else: |
785 | 556 |
self._needs_iface[obj] = ifaces |
666
8ad9885ea45a
interface handling should be done here
sylvain.thenault@logilab.fr
parents:
631
diff
changeset
|
557 |
|
3055
06814d57514f
[vreg] keep positional arg compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2927
diff
changeset
|
558 |
def register(self, obj, *args, **kwargs): |
5143
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5080
diff
changeset
|
559 |
"""register `obj` application object into `registryname` or |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5080
diff
changeset
|
560 |
`obj.__registry__` if not specified, with identifier `oid` or |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5080
diff
changeset
|
561 |
`obj.__regid__` if not specified. |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5080
diff
changeset
|
562 |
|
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5080
diff
changeset
|
563 |
If `clear` is true, all objects with the same identifier will be |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5080
diff
changeset
|
564 |
previously unregistered. |
43afbdd5c8b4
improved doc on selectors an vregistry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5080
diff
changeset
|
565 |
""" |
3055
06814d57514f
[vreg] keep positional arg compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2927
diff
changeset
|
566 |
super(CubicWebVRegistry, self).register(obj, *args, **kwargs) |
666
8ad9885ea45a
interface handling should be done here
sylvain.thenault@logilab.fr
parents:
631
diff
changeset
|
567 |
# XXX bw compat |
777
39695e98ba35
test and fix interface based objects cleaning
sylvain.thenault@logilab.fr
parents:
776
diff
changeset
|
568 |
ifaces = use_interfaces(obj) |
666
8ad9885ea45a
interface handling should be done here
sylvain.thenault@logilab.fr
parents:
631
diff
changeset
|
569 |
if ifaces: |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
570 |
if not obj.__name__.endswith('Adapter') and \ |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
571 |
any(iface for iface in ifaces if not isinstance(iface, basestring)): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
572 |
warn('[3.9] %s: interfaces in implements selector are ' |
5723
2ae478c47089
[3.9] update warning message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5627
diff
changeset
|
573 |
'deprecated in favor of adapters / adaptable ' |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
574 |
'selector' % obj.__name__, DeprecationWarning) |
785 | 575 |
self._needs_iface[obj] = ifaces |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
576 |
depends_on = require_appobject(obj) |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
577 |
if depends_on is not None: |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
578 |
self._needs_appobject[obj] = depends_on |
1475
5c1ec97f317e
should not be necessary anymore to add entity class to __implements__
sylvain.thenault@logilab.fr
parents:
1357
diff
changeset
|
579 |
|
5748
487ab6ac90cc
[auto-reload] we should never call load_module with use_sys=False, that may lead to inconsistency with module interdependancy (eg module get imported by another one, then is reimported by the vreg to load its appobjects. Cleanup of sys.modules done before reloading should be enough.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5608
diff
changeset
|
580 |
def register_objects(self, path): |
487ab6ac90cc
[auto-reload] we should never call load_module with use_sys=False, that may lead to inconsistency with module interdependancy (eg module get imported by another one, then is reimported by the vreg to load its appobjects. Cleanup of sys.modules done before reloading should be enough.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5608
diff
changeset
|
581 |
"""overriden to give cubicweb's extrapath (eg cubes package's __path__) |
487ab6ac90cc
[auto-reload] we should never call load_module with use_sys=False, that may lead to inconsistency with module interdependancy (eg module get imported by another one, then is reimported by the vreg to load its appobjects. Cleanup of sys.modules done before reloading should be enough.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5608
diff
changeset
|
582 |
""" |
5273
c4caef6f09c9
[vreg] refactor the [re]loading process so things get clearer and fix spurious errors on edge cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5147
diff
changeset
|
583 |
super(CubicWebVRegistry, self).register_objects( |
5748
487ab6ac90cc
[auto-reload] we should never call load_module with use_sys=False, that may lead to inconsistency with module interdependancy (eg module get imported by another one, then is reimported by the vreg to load its appobjects. Cleanup of sys.modules done before reloading should be enough.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5608
diff
changeset
|
584 |
path, self.config.extrapath) |
2651
3ad936634d2a
[registry] when a source file is changed, reset and reload the whole registry
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2613
diff
changeset
|
585 |
|
4490
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
586 |
def initialization_completed(self): |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
587 |
"""cw specific code once vreg initialization is completed: |
0 | 588 |
|
4490
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
589 |
* remove objects requiring a missing interface, unless |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
590 |
config.cleanup_interface_sobjects is false |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
591 |
* init rtags |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
592 |
""" |
1638 | 593 |
# we may want to keep interface dependent objects (e.g.for i18n |
594 |
# catalog generation) |
|
595 |
if self.config.cleanup_interface_sobjects: |
|
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
596 |
# XXX deprecated with cw 3.9: remove appobjects that don't support |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
597 |
# any available interface |
1638 | 598 |
implemented_interfaces = set() |
599 |
if 'Any' in self.get('etypes', ()): |
|
600 |
for etype in self.schema.entities(): |
|
3702
29cce43d6af2
skip final type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3692
diff
changeset
|
601 |
if etype.final: |
29cce43d6af2
skip final type
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3692
diff
changeset
|
602 |
continue |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
603 |
cls = self['etypes'].etype_class(etype) |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
604 |
if cls.__implements__: |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
605 |
warn('[3.9] %s: using __implements__/interfaces are ' |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
606 |
'deprecated in favor of adapters' % cls.__name__, |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
607 |
DeprecationWarning) |
1638 | 608 |
for iface in cls.__implements__: |
609 |
implemented_interfaces.update(iface.__mro__) |
|
610 |
implemented_interfaces.update(cls.__mro__) |
|
611 |
for obj, ifaces in self._needs_iface.items(): |
|
612 |
ifaces = frozenset(isinstance(iface, basestring) |
|
613 |
and iface in self.schema |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
614 |
and self['etypes'].etype_class(iface) |
1638 | 615 |
or iface |
616 |
for iface in ifaces) |
|
617 |
if not ('Any' in ifaces or ifaces & implemented_interfaces): |
|
6014
a5e22657f6f4
[debug] improve debug messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
5890
diff
changeset
|
618 |
self.debug('unregister %s (no implemented ' |
6037
1b4ea3ebdf80
[vreg debug] use classid to get cleaner output
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6014
diff
changeset
|
619 |
'interface among %s)', classid(obj), ifaces) |
1638 | 620 |
self.unregister(obj) |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
621 |
# since 3.9: remove appobjects which depending on other, unexistant |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
622 |
# appobjects |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
623 |
for obj, (regname, regids) in self._needs_appobject.items(): |
5562
4ccd599b5cf0
[vreg] on registration completed, don't crash if an object depends on an unexistant registry, simply kick the object out
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
624 |
try: |
4ccd599b5cf0
[vreg] on registration completed, don't crash if an object depends on an unexistant registry, simply kick the object out
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
625 |
registry = self[regname] |
4ccd599b5cf0
[vreg] on registration completed, don't crash if an object depends on an unexistant registry, simply kick the object out
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
626 |
except RegistryNotFound: |
6037
1b4ea3ebdf80
[vreg debug] use classid to get cleaner output
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6014
diff
changeset
|
627 |
self.debug('unregister %s (no registry %s)', classid(obj), |
1b4ea3ebdf80
[vreg debug] use classid to get cleaner output
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6014
diff
changeset
|
628 |
regname) |
5562
4ccd599b5cf0
[vreg] on registration completed, don't crash if an object depends on an unexistant registry, simply kick the object out
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
629 |
self.unregister(obj) |
4ccd599b5cf0
[vreg] on registration completed, don't crash if an object depends on an unexistant registry, simply kick the object out
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
630 |
continue |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
631 |
for regid in regids: |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
632 |
if registry.get(regid): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
633 |
break |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
634 |
else: |
6014
a5e22657f6f4
[debug] improve debug messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
5890
diff
changeset
|
635 |
self.debug('unregister %s (no %s object in registry %s)', |
6037
1b4ea3ebdf80
[vreg debug] use classid to get cleaner output
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6014
diff
changeset
|
636 |
classid(obj), ' or '.join(regids), regname) |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5446
diff
changeset
|
637 |
self.unregister(obj) |
4490
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
638 |
super(CubicWebVRegistry, self).initialization_completed() |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
639 |
for rtag in RTAGS: |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
640 |
# don't check rtags if we don't want to cleanup_interface_sobjects |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
641 |
rtag.init(self.schema, check=self.config.cleanup_interface_sobjects) |
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
642 |
|
3240
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
643 |
# rql parsing utilities #################################################### |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
644 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
645 |
@property |
0 | 646 |
@cached |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
647 |
def rqlhelper(self): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
648 |
return RQLHelper(self.schema, |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
649 |
special_relations={'eid': 'uid', 'has_text': 'fti'}) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
650 |
|
3240
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
651 |
def solutions(self, req, rqlst, args): |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
652 |
def type_from_eid(eid, req=req): |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
653 |
return req.describe(eid)[0] |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5147
diff
changeset
|
654 |
return self.rqlhelper.compute_solutions(rqlst, {'eid': type_from_eid}, args) |
1475
5c1ec97f317e
should not be necessary anymore to add entity class to __implements__
sylvain.thenault@logilab.fr
parents:
1357
diff
changeset
|
655 |
|
3240
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
656 |
def parse(self, req, rql, args=None): |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
657 |
rqlst = self.rqlhelper.parse(rql) |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
658 |
try: |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
659 |
self.solutions(req, rqlst, args) |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
660 |
except UnknownEid: |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
661 |
for select in rqlst.children: |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
662 |
select.solutions = [] |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
663 |
return rqlst |
0 | 664 |
|
665 |
# properties handling ##################################################### |
|
666 |
||
667 |
def user_property_keys(self, withsitewide=False): |
|
668 |
if withsitewide: |
|
2223
59588e2d5cd1
close #343467, no sources sections in site properties
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
669 |
return sorted(k for k in self['propertydefs'] |
59588e2d5cd1
close #343467, no sources sections in site properties
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
670 |
if not k.startswith('sources.')) |
0 | 671 |
return sorted(k for k, kd in self['propertydefs'].iteritems() |
2223
59588e2d5cd1
close #343467, no sources sections in site properties
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
672 |
if not kd['sitewide'] and not k.startswith('sources.')) |
0 | 673 |
|
674 |
def register_property(self, key, type, help, default=None, vocabulary=None, |
|
675 |
sitewide=False): |
|
676 |
"""register a given property""" |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
677 |
properties = self['propertydefs'] |
0 | 678 |
assert type in YAMS_TO_PY |
1475
5c1ec97f317e
should not be necessary anymore to add entity class to __implements__
sylvain.thenault@logilab.fr
parents:
1357
diff
changeset
|
679 |
properties[key] = {'type': type, 'vocabulary': vocabulary, |
0 | 680 |
'default': default, 'help': help, |
681 |
'sitewide': sitewide} |
|
682 |
||
683 |
def property_info(self, key): |
|
684 |
"""return dictionary containing description associated to the given |
|
685 |
property key (including type, defaut value, help and a site wide |
|
686 |
boolean) |
|
687 |
""" |
|
688 |
try: |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
689 |
return self['propertydefs'][key] |
0 | 690 |
except KeyError: |
691 |
if key.startswith('system.version.'): |
|
692 |
soft = key.split('.')[-1] |
|
693 |
return {'type': 'String', 'sitewide': True, |
|
694 |
'default': None, 'vocabulary': None, |
|
695 |
'help': _('%s software version of the database') % soft} |
|
696 |
raise UnknownProperty('unregistered property %r' % key) |
|
1475
5c1ec97f317e
should not be necessary anymore to add entity class to __implements__
sylvain.thenault@logilab.fr
parents:
1357
diff
changeset
|
697 |
|
0 | 698 |
def property_value(self, key): |
699 |
try: |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
700 |
return self['propertyvalues'][key] |
0 | 701 |
except KeyError: |
4490
d45cde54d464
backport stable branch and some vreg cleanups:
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
702 |
return self.property_info(key)['default'] |
0 | 703 |
|
704 |
def typed_value(self, key, value): |
|
705 |
"""value is an unicode string, return it correctly typed. Let potential |
|
706 |
type error propagates. |
|
707 |
""" |
|
708 |
pdef = self.property_info(key) |
|
709 |
try: |
|
710 |
value = YAMS_TO_PY[pdef['type']](value) |
|
711 |
except (TypeError, ValueError): |
|
712 |
raise ValueError(_('bad value')) |
|
713 |
vocab = pdef['vocabulary'] |
|
714 |
if vocab is not None: |
|
715 |
if callable(vocab): |
|
716 |
vocab = vocab(key, None) # XXX need a req object |
|
717 |
if not value in vocab: |
|
718 |
raise ValueError(_('unauthorized value')) |
|
719 |
return value |
|
1475
5c1ec97f317e
should not be necessary anymore to add entity class to __implements__
sylvain.thenault@logilab.fr
parents:
1357
diff
changeset
|
720 |
|
0 | 721 |
def init_properties(self, propvalues): |
722 |
"""init the property values registry using the given set of couple (key, value) |
|
723 |
""" |
|
724 |
self.initialized = True |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
725 |
values = self['propertyvalues'] |
0 | 726 |
for key, val in propvalues: |
727 |
try: |
|
728 |
values[key] = self.typed_value(key, val) |
|
3951
b64c73bdb37b
fix name error if ValueError is raised
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3719
diff
changeset
|
729 |
except ValueError, ex: |
0 | 730 |
self.warning('%s (you should probably delete that property ' |
731 |
'from the database)', ex) |
|
732 |
except UnknownProperty, ex: |
|
733 |
self.warning('%s (you should probably delete that property ' |
|
734 |
'from the database)', ex) |
|
735 |
||
3240
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
736 |
# deprecated code #################################################### |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
737 |
|
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
738 |
@deprecated('[3.4] use vreg["etypes"].etype_class(etype)') |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
739 |
def etype_class(self, etype): |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
740 |
return self["etypes"].etype_class(etype) |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
741 |
|
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
742 |
@deprecated('[3.4] use vreg["views"].main_template(*args, **kwargs)') |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
743 |
def main_template(self, req, oid='main-template', **context): |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
744 |
return self["views"].main_template(req, oid, **context) |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
745 |
|
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
746 |
@deprecated('[3.4] use vreg[registry].possible_vobjects(*args, **kwargs)') |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
747 |
def possible_vobjects(self, registry, *args, **kwargs): |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
748 |
return self[registry].possible_vobjects(*args, **kwargs) |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
749 |
|
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
750 |
@deprecated('[3.4] use vreg["actions"].possible_actions(*args, **kwargs)') |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
751 |
def possible_actions(self, req, rset=None, **kwargs): |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
752 |
return self["actions"].possible_actions(req, rest=rset, **kwargs) |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
753 |
|
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
754 |
@deprecated('[3.4] use vreg["boxes"].select_object(...)') |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
755 |
def select_box(self, oid, *args, **kwargs): |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
756 |
return self['boxes'].select_object(oid, *args, **kwargs) |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
757 |
|
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
758 |
@deprecated('[3.4] use vreg["components"].select_object(...)') |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
759 |
def select_component(self, cid, *args, **kwargs): |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
760 |
return self['components'].select_object(cid, *args, **kwargs) |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
761 |
|
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
762 |
@deprecated('[3.4] use vreg["actions"].select_object(...)') |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
763 |
def select_action(self, oid, *args, **kwargs): |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
764 |
return self['actions'].select_object(oid, *args, **kwargs) |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
765 |
|
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
766 |
@deprecated('[3.4] use vreg["views"].select(...)') |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
767 |
def select_view(self, __vid, req, rset=None, **kwargs): |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
768 |
return self['views'].select(__vid, req, rset=rset, **kwargs) |
8604a15995d1
refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3205
diff
changeset
|
769 |
|
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2025
diff
changeset
|
770 |
|
1016
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
823
diff
changeset
|
771 |
from datetime import datetime, date, time, timedelta |
0 | 772 |
|
773 |
YAMS_TO_PY = { |
|
774 |
'Boolean': bool, |
|
775 |
'String' : unicode, |
|
776 |
'Password': str, |
|
777 |
'Bytes': Binary, |
|
778 |
'Int': int, |
|
779 |
'Float': float, |
|
1016
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
823
diff
changeset
|
780 |
'Date': date, |
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
823
diff
changeset
|
781 |
'Datetime': datetime, |
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
823
diff
changeset
|
782 |
'Time': time, |
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
823
diff
changeset
|
783 |
'Interval': timedelta, |
0 | 784 |
} |
785 |