author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Wed, 24 Feb 2010 11:20:13 +0100 | |
branch | stable |
changeset 4686 | c55606a5c4b0 |
parent 4664 | bd5ecd5b9494 |
child 4719 | aaed3f813ef8 |
permissions | -rw-r--r-- |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
1 |
"""This file contains some basic selectors required by application objects. |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
2 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
3 |
A selector is responsible to score how well an object may be used with a |
718
f7011679437a
doc update, move yes_registerer here
sylvain.thenault@logilab.fr
parents:
697
diff
changeset
|
4 |
given context by returning a score. |
f7011679437a
doc update, move yes_registerer here
sylvain.thenault@logilab.fr
parents:
697
diff
changeset
|
5 |
|
f7011679437a
doc update, move yes_registerer here
sylvain.thenault@logilab.fr
parents:
697
diff
changeset
|
6 |
In CubicWeb Usually the context consists for a request object, a result set |
f7011679437a
doc update, move yes_registerer here
sylvain.thenault@logilab.fr
parents:
697
diff
changeset
|
7 |
or None, a specific row/col in the result set, etc... |
f7011679437a
doc update, move yes_registerer here
sylvain.thenault@logilab.fr
parents:
697
diff
changeset
|
8 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
9 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
10 |
If you have trouble with selectors, especially if the objet (typically |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
11 |
a view or a component) you want to use is not selected and you want to |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
12 |
know which one(s) of its selectors fail (e.g. returns 0), you can use |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
13 |
`traced_selection` or even direclty `TRACED_OIDS`. |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
14 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
15 |
`TRACED_OIDS` is a tuple of traced object ids. The special value |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
16 |
'all' may be used to log selectors for all objects. |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
17 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
18 |
For instance, say that the following code yields a `NoSelectableObject` |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
19 |
exception:: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
20 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
21 |
self.view('calendar', myrset) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
22 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
23 |
You can log the selectors involved for *calendar* by replacing the line |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
24 |
above by:: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
25 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
26 |
# in Python2.5 |
692
800592b8d39b
replace deprecated cubicweb.common.selectors by its new module path (cubicweb.selectors)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
660
diff
changeset
|
27 |
from cubicweb.selectors import traced_selection |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
28 |
with traced_selection(): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
29 |
self.view('calendar', myrset) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
30 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
31 |
# in Python2.4 |
692
800592b8d39b
replace deprecated cubicweb.common.selectors by its new module path (cubicweb.selectors)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
660
diff
changeset
|
32 |
from cubicweb import selectors |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
33 |
selectors.TRACED_OIDS = ('calendar',) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
34 |
self.view('calendar', myrset) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
35 |
selectors.TRACED_OIDS = () |
1474 | 36 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
37 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
38 |
:organization: Logilab |
4212
ab6573088b4a
update copyright: welcome 2010
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
4148
diff
changeset
|
39 |
:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
40 |
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
1977
606923dff11b
big bunch of copyright / docstring update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1909
diff
changeset
|
41 |
:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
42 |
""" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
43 |
__docformat__ = "restructuredtext en" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
44 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
45 |
import logging |
3650
012da21e43fe
ignore some internal warnings
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
3638
diff
changeset
|
46 |
from warnings import warn, filterwarnings |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
47 |
|
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
48 |
from logilab.common.deprecation import class_renamed |
3757 | 49 |
from logilab.common.compat import all, any |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
50 |
from logilab.common.interface import implements as implements_iface |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
51 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
52 |
from yams import BASE_TYPES |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
53 |
|
1503 | 54 |
from cubicweb import (Unauthorized, NoSelectableObject, NotAnEntity, |
55 |
role, typed_eid) |
|
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2650
diff
changeset
|
56 |
# even if not used, let yes here so it's importable through this module |
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2650
diff
changeset
|
57 |
from cubicweb.appobject import Selector, objectify_selector, yes |
2834
7df3494ae657
[vreg appobject] use class_regid
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2822
diff
changeset
|
58 |
from cubicweb.vregistry import class_regid |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
59 |
from cubicweb.cwconfig import CubicWebConfiguration |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
60 |
from cubicweb.schema import split_expression |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
61 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
62 |
# helpers for debugging selectors |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
63 |
SELECTOR_LOGGER = logging.getLogger('cubicweb.selectors') |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
64 |
TRACED_OIDS = () |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
65 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
66 |
def lltrace(selector): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
67 |
# don't wrap selectors if not in development mode |
3638
648d6dbec630
system/user modes + CWDEV instead of installed/dev mixed modes. Fix behaviour when setting CW_MODE explicitly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3522
diff
changeset
|
68 |
if CubicWebConfiguration.mode == 'system': # XXX config.debug |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
69 |
return selector |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
70 |
def traced(cls, *args, **kwargs): |
752
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
71 |
# /!\ lltrace decorates pure function or __call__ method, this |
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
72 |
# means argument order may be different |
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
73 |
if isinstance(cls, Selector): |
779
8510e14335e1
implements some str, fix implements selector, test and fixes
sylvain.thenault@logilab.fr
parents:
774
diff
changeset
|
74 |
selname = str(cls) |
752
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
75 |
vobj = args[0] |
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
76 |
else: |
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
77 |
selname = selector.__name__ |
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
78 |
vobj = cls |
2834
7df3494ae657
[vreg appobject] use class_regid
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2822
diff
changeset
|
79 |
oid = class_regid(vobj) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
80 |
ret = selector(cls, *args, **kwargs) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
81 |
if TRACED_OIDS == 'all' or oid in TRACED_OIDS: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
82 |
#SELECTOR_LOGGER.warning('selector %s returned %s for %s', selname, ret, cls) |
4026
d80a55a024d8
add regid when tracing selection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3890
diff
changeset
|
83 |
print '%s -> %s for %s(%s)' % (selname, ret, vobj, vobj.__regid__) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
84 |
return ret |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
85 |
traced.__name__ = selector.__name__ |
4458
6151849f41e0
copy back __doc__ for proper sphinx doc generation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4340
diff
changeset
|
86 |
traced.__doc__ = selector.__doc__ |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
87 |
return traced |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
88 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
89 |
class traced_selection(object): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
90 |
"""selector debugging helper. |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
91 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
92 |
Typical usage is : |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
93 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
94 |
>>> with traced_selection(): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
95 |
... # some code in which you want to debug selectors |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
96 |
... # for all objects |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
97 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
98 |
or |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
99 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
100 |
>>> with traced_selection( ('oid1', 'oid2') ): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
101 |
... # some code in which you want to debug selectors |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
102 |
... # for objects with id 'oid1' and 'oid2' |
1474 | 103 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
104 |
""" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
105 |
def __init__(self, traced='all'): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
106 |
self.traced = traced |
1474 | 107 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
108 |
def __enter__(self): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
109 |
global TRACED_OIDS |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
110 |
TRACED_OIDS = self.traced |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
111 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
112 |
def __exit__(self, exctype, exc, traceback): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
113 |
global TRACED_OIDS |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
114 |
TRACED_OIDS = () |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
115 |
return traceback is None |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
116 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
117 |
|
2822
f26578339214
deprecate appobject.vreg and rename appobject instance attributes using cw_ prefix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2819
diff
changeset
|
118 |
def score_interface(etypesreg, cls_or_inst, cls, iface): |
1907
0f3363d24239
dubious docstring; hard-to-understand function
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1784
diff
changeset
|
119 |
"""Return XXX if the give object (maybe an instance or class) implements |
1472
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
120 |
the interface. |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
121 |
""" |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
122 |
if getattr(iface, '__registry__', None) == 'etypes': |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
123 |
# adjust score if the interface is an entity class |
3399
2b84f4adb6f8
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3396
diff
changeset
|
124 |
parents = etypesreg.parent_classes(cls_or_inst.__regid__) |
1472
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
125 |
if iface is cls: |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
126 |
return len(parents) + 4 |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
127 |
if iface is parents[-1]: # Any |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
128 |
return 1 |
1784 | 129 |
for index, basecls in enumerate(reversed(parents[:-1])): |
1472
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
130 |
if iface is basecls: |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
131 |
return index + 3 |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
132 |
return 0 |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
133 |
if implements_iface(cls_or_inst, iface): |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
134 |
# implenting an interface takes precedence other special Any interface |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
135 |
return 2 |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
136 |
return 0 |
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
137 |
|
96e06e623494
fix implements selector to avoid returning false positive due to entity class inheritance
sylvain.thenault@logilab.fr
parents:
1301
diff
changeset
|
138 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
139 |
# abstract selectors / mixin helpers ########################################### |
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
140 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
141 |
class PartialSelectorMixIn(object): |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
142 |
"""convenience mix-in for selectors that will look into the containing |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
143 |
class to find missing information. |
1474 | 144 |
|
782
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
145 |
cf. `cubicweb.web.action.LinkToEntityAction` for instance |
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
146 |
""" |
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
147 |
def __call__(self, cls, *args, **kwargs): |
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
148 |
self.complete(cls) |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
149 |
return super(PartialSelectorMixIn, self).__call__(cls, *args, **kwargs) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
150 |
|
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
151 |
|
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
152 |
class ImplementsMixIn(object): |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
153 |
"""mix-in class for selectors checking implemented interfaces of something |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
154 |
""" |
3522
cde0ff4f7a8c
[selectors] add accept_none to EClassSelector so we can specify to not ignore None from outer join in some cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3350
diff
changeset
|
155 |
def __init__(self, *expected_ifaces, **kwargs): |
cde0ff4f7a8c
[selectors] add accept_none to EClassSelector so we can specify to not ignore None from outer join in some cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3350
diff
changeset
|
156 |
super(ImplementsMixIn, self).__init__(**kwargs) |
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
157 |
self.expected_ifaces = expected_ifaces |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
158 |
|
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
159 |
def __str__(self): |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
160 |
return '%s(%s)' % (self.__class__.__name__, |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
161 |
','.join(str(s) for s in self.expected_ifaces)) |
1474 | 162 |
|
2822
f26578339214
deprecate appobject.vreg and rename appobject instance attributes using cw_ prefix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2819
diff
changeset
|
163 |
def score_interfaces(self, req, cls_or_inst, cls): |
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
164 |
score = 0 |
2822
f26578339214
deprecate appobject.vreg and rename appobject instance attributes using cw_ prefix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2819
diff
changeset
|
165 |
etypesreg = req.vreg['etypes'] |
f26578339214
deprecate appobject.vreg and rename appobject instance attributes using cw_ prefix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2819
diff
changeset
|
166 |
eschema = cls_or_inst.e_schema |
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
167 |
for iface in self.expected_ifaces: |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
168 |
if isinstance(iface, basestring): |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
169 |
# entity type |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
170 |
try: |
2822
f26578339214
deprecate appobject.vreg and rename appobject instance attributes using cw_ prefix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2819
diff
changeset
|
171 |
iface = etypesreg.etype_class(iface) |
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
172 |
except KeyError: |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
173 |
continue # entity type not in the schema |
2822
f26578339214
deprecate appobject.vreg and rename appobject instance attributes using cw_ prefix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2819
diff
changeset
|
174 |
score += score_interface(etypesreg, cls_or_inst, cls, iface) |
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
175 |
return score |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
176 |
|
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
177 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
178 |
class EClassSelector(Selector): |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
179 |
"""abstract class for selectors working on *entity class(es)* specified |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
180 |
explicitly or found of the result set. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
181 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
182 |
Here are entity lookup / scoring rules: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
183 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
184 |
* if `entity` is specified, return score for this entity's class |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
185 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
186 |
* elif `row` is specified, return score for the class of the entity |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
187 |
found in the specified cell, using column specified by `col` or 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
188 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
189 |
* else return the sum of scores for each entity class found in the column |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
190 |
specified specified by the `col` argument or in column 0 if not specified, |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
191 |
unless: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
192 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
193 |
- `once_is_enough` is False (the default) and some entity class is scored |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
194 |
to 0, in which case 0 is returned |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
195 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
196 |
- `once_is_enough` is True, in which case the first non-zero score is |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
197 |
returned |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
198 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
199 |
- `accept_none` is False and some cell in the column has a None value |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
200 |
(this may occurs with outer join) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
201 |
""" |
3522
cde0ff4f7a8c
[selectors] add accept_none to EClassSelector so we can specify to not ignore None from outer join in some cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3350
diff
changeset
|
202 |
def __init__(self, once_is_enough=False, accept_none=True): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
203 |
self.once_is_enough = once_is_enough |
3522
cde0ff4f7a8c
[selectors] add accept_none to EClassSelector so we can specify to not ignore None from outer join in some cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3350
diff
changeset
|
204 |
self.accept_none = accept_none |
1474 | 205 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
206 |
@lltrace |
2161
200481e7b156
prepare time where it won't be mandatory to give rset to select()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2003
diff
changeset
|
207 |
def __call__(self, cls, req, rset=None, row=None, col=0, **kwargs): |
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
208 |
if kwargs.get('entity'): |
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
209 |
return self.score_class(kwargs['entity'].__class__, req) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
210 |
if not rset: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
211 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
212 |
score = 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
213 |
if row is None: |
3522
cde0ff4f7a8c
[selectors] add accept_none to EClassSelector so we can specify to not ignore None from outer join in some cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3350
diff
changeset
|
214 |
if not self.accept_none: |
cde0ff4f7a8c
[selectors] add accept_none to EClassSelector so we can specify to not ignore None from outer join in some cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3350
diff
changeset
|
215 |
if any(rset[i][col] is None for i in xrange(len(rset))): |
cde0ff4f7a8c
[selectors] add accept_none to EClassSelector so we can specify to not ignore None from outer join in some cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3350
diff
changeset
|
216 |
return 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
217 |
for etype in rset.column_types(col): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
218 |
if etype is None: # outer join |
3522
cde0ff4f7a8c
[selectors] add accept_none to EClassSelector so we can specify to not ignore None from outer join in some cases
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3350
diff
changeset
|
219 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
220 |
escore = self.score(cls, req, etype) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
221 |
if not escore and not self.once_is_enough: |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
222 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
223 |
elif self.once_is_enough: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
224 |
return escore |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
225 |
score += escore |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
226 |
else: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
227 |
etype = rset.description[row][col] |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
228 |
if etype is not None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
229 |
score = self.score(cls, req, etype) |
779
8510e14335e1
implements some str, fix implements selector, test and fixes
sylvain.thenault@logilab.fr
parents:
774
diff
changeset
|
230 |
return score |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
231 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
232 |
def score(self, cls, req, etype): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
233 |
if etype in BASE_TYPES: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
234 |
return 0 |
2822
f26578339214
deprecate appobject.vreg and rename appobject instance attributes using cw_ prefix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2819
diff
changeset
|
235 |
return self.score_class(req.vreg['etypes'].etype_class(etype), req) |
1474 | 236 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
237 |
def score_class(self, eclass, req): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
238 |
raise NotImplementedError() |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
239 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
240 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
241 |
class EntitySelector(EClassSelector): |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
242 |
"""abstract class for selectors working on *entity instance(s)* specified |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
243 |
explicitly or found of the result set. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
244 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
245 |
Here are entity lookup / scoring rules: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
246 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
247 |
* if `entity` is specified, return score for this entity |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
248 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
249 |
* elif `row` is specified, return score for the entity found in the |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
250 |
specified cell, using column specified by `col` or 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
251 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
252 |
* else return the sum of scores for each entity found in the column |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
253 |
specified specified by the `col` argument or in column 0 if not specified, |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
254 |
unless: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
255 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
256 |
- `once_is_enough` is False (the default) and some entity is scored |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
257 |
to 0, in which case 0 is returned |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
258 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
259 |
- `once_is_enough` is True, in which case the first non-zero score is |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
260 |
returned |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
261 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
262 |
- `accept_none` is False and some cell in the column has a None value |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
263 |
(this may occurs with outer join) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
264 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
265 |
.. note:: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
266 |
using EntitySelector or EClassSelector as base selector class impacts |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
267 |
performance, since when no entity or row is specified the later works on |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
268 |
every different *entity class* found in the result set, while the former |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
269 |
works on each *entity* (eg each row of the result set), which may be much |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
270 |
more costly. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
271 |
""" |
1474 | 272 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
273 |
@lltrace |
2161
200481e7b156
prepare time where it won't be mandatory to give rset to select()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2003
diff
changeset
|
274 |
def __call__(self, cls, req, rset=None, row=None, col=0, **kwargs): |
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
275 |
if not rset and not kwargs.get('entity'): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
276 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
277 |
score = 0 |
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
278 |
if kwargs.get('entity'): |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
279 |
score = self.score_entity(kwargs['entity']) |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
280 |
elif row is None: |
1994
56a235af050e
col may be None
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1987
diff
changeset
|
281 |
col = col or 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
282 |
for row, rowvalue in enumerate(rset.rows): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
283 |
if rowvalue[col] is None: # outer join |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
284 |
if not self.accept_none: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
285 |
return 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
286 |
continue |
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
287 |
escore = self.score(req, rset, row, col) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
288 |
if not escore and not self.once_is_enough: |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
289 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
290 |
elif self.once_is_enough: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
291 |
return escore |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
292 |
score += escore |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
293 |
else: |
1994
56a235af050e
col may be None
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1987
diff
changeset
|
294 |
col = col or 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
295 |
etype = rset.description[row][col] |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
296 |
if etype is not None: # outer join |
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
297 |
score = self.score(req, rset, row, col) |
779
8510e14335e1
implements some str, fix implements selector, test and fixes
sylvain.thenault@logilab.fr
parents:
774
diff
changeset
|
298 |
return score |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
299 |
|
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
300 |
def score(self, req, rset, row, col): |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
301 |
try: |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
302 |
return self.score_entity(rset.get_entity(row, col)) |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
303 |
except NotAnEntity: |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
304 |
return 0 |
1474 | 305 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
306 |
def score_entity(self, entity): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
307 |
raise NotImplementedError() |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
308 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
309 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
310 |
class ExpectedValueSelector(Selector): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
311 |
"""Take a list of expected values as initializer argument, check |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
312 |
_get_value method return one of these expected values. |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
313 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
314 |
def __init__(self, *expected): |
774
48cb1f42e79c
tell on which class the assertion's failed
sylvain.thenault@logilab.fr
parents:
770
diff
changeset
|
315 |
assert expected, self |
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
316 |
self.expected = frozenset(expected) |
779
8510e14335e1
implements some str, fix implements selector, test and fixes
sylvain.thenault@logilab.fr
parents:
774
diff
changeset
|
317 |
|
8510e14335e1
implements some str, fix implements selector, test and fixes
sylvain.thenault@logilab.fr
parents:
774
diff
changeset
|
318 |
def __str__(self): |
8510e14335e1
implements some str, fix implements selector, test and fixes
sylvain.thenault@logilab.fr
parents:
774
diff
changeset
|
319 |
return '%s(%s)' % (self.__class__.__name__, |
8510e14335e1
implements some str, fix implements selector, test and fixes
sylvain.thenault@logilab.fr
parents:
774
diff
changeset
|
320 |
','.join(sorted(str(s) for s in self.expected))) |
1474 | 321 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
322 |
@lltrace |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
323 |
def __call__(self, cls, req, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
324 |
if self._get_value(cls, req, **kwargs) in self.expected: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
325 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
326 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
327 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
328 |
def _get_value(self, cls, req, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
329 |
raise NotImplementedError() |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
330 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
331 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
332 |
# bare selectors ############################################################## |
1474 | 333 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
334 |
class match_kwargs(ExpectedValueSelector): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
335 |
"""Return non-zero score if parameter names specified as initializer |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
336 |
arguments are specified in the input context. When multiple parameters are |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
337 |
specified, all of them should be specified in the input context. Return a |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
338 |
score corresponding to the number of expected parameters. |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
339 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
340 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
341 |
@lltrace |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
342 |
def __call__(self, cls, req, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
343 |
for arg in self.expected: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
344 |
if not arg in kwargs: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
345 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
346 |
return len(self.expected) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
347 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
348 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
349 |
class appobject_selectable(Selector): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
350 |
"""return 1 if another appobject is selectable using the same input context. |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
351 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
352 |
Initializer arguments: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
353 |
* `registry`, a registry name |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
354 |
* `regid`, an object identifier in this registry |
1263 | 355 |
""" |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
356 |
def __init__(self, registry, regid): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
357 |
self.registry = registry |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
358 |
self.regid = regid |
1474 | 359 |
|
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
|
360 |
def __call__(self, cls, req, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
361 |
try: |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
362 |
req.vreg[self.registry].select(self.regid, req, **kwargs) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
363 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
364 |
except NoSelectableObject: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
365 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
366 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
367 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
368 |
# rset selectors ############################################################## |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
369 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
370 |
@objectify_selector |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
371 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
372 |
def none_rset(cls, req, rset=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
373 |
"""Return 1 if the result set is None (eg usually not specified).""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
374 |
if rset is None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
375 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
376 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
377 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
378 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
379 |
# XXX == ~ none_rset |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
380 |
@objectify_selector |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
381 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
382 |
def any_rset(cls, req, rset=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
383 |
"""Return 1 for any result set, whatever the number of rows in it, even 0.""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
384 |
if rset is not None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
385 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
386 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
387 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
388 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
389 |
@objectify_selector |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
390 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
391 |
def nonempty_rset(cls, req, rset=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
392 |
"""Return 1 for result set containing one ore more rows.""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
393 |
if rset is not None and rset.rowcount: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
394 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
395 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
396 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
397 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
398 |
# XXX == ~ nonempty_rset |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
399 |
@objectify_selector |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
400 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
401 |
def empty_rset(cls, req, rset=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
402 |
"""Return 1 for result set which doesn't contain any row.""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
403 |
if rset is not None and rset.rowcount == 0: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
404 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
405 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
406 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
407 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
408 |
# XXX == multi_lines_rset(1) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
409 |
@objectify_selector |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
410 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
411 |
def one_line_rset(cls, req, rset=None, row=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
412 |
"""Return 1 if the result set is of size 1 or if a specific row in the |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
413 |
result set is specified ('row' argument). |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
414 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
415 |
if rset is not None and (row is not None or rset.rowcount == 1): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
416 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
417 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
418 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
419 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
420 |
class multi_lines_rset(Selector): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
421 |
"""If `nb`is specified, return 1 if the result set has exactly `nb` row of |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
422 |
result. Else (`nb` is None), return 1 if the result set contains *at least* |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
423 |
two rows. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
424 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
425 |
def __init__(self, nb=None): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
426 |
self.expected = nb |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
427 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
428 |
def match_expected(self, num): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
429 |
if self.expected is None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
430 |
return num > 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
431 |
return num == self.expected |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
432 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
433 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
434 |
def __call__(self, cls, req, rset=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
435 |
return rset is not None and self.match_expected(rset.rowcount) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
436 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
437 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
438 |
class multi_columns_rset(multi_lines_rset): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
439 |
"""If `nb`is specified, return 1 if the result set has exactly `nb` column |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
440 |
per row. Else (`nb` is None), return 1 if the result set contains *at least* |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
441 |
two columns per row. Return 0 for empty result set. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
442 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
443 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
444 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
445 |
def __call__(self, cls, req, rset=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
446 |
# 'or 0' since we *must not* return None |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
447 |
return rset and self.match_expected(len(rset.rows[0])) or 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
448 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
449 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
450 |
@objectify_selector |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
451 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
452 |
def paginated_rset(cls, req, rset=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
453 |
"""Return 1 for result set with more rows than a page size. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
454 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
455 |
Page size is searched in (respecting order): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
456 |
* a `page_size` argument |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
457 |
* a `page_size` form parameters |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
458 |
* the :ref:`navigation.page-size` property |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
459 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
460 |
if rset is None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
461 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
462 |
page_size = kwargs.get('page_size') |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
463 |
if page_size is None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
464 |
page_size = req.form.get('page_size') |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
465 |
if page_size is None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
466 |
page_size = req.property_value('navigation.page-size') |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
467 |
else: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
468 |
page_size = int(page_size) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
469 |
if rset.rowcount <= page_size: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
470 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
471 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
472 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
473 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
474 |
@objectify_selector |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
475 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
476 |
def sorted_rset(cls, req, rset=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
477 |
"""Return 1 for sorted result set (e.g. from an RQL query containing an |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
478 |
:ref:ORDERBY clause. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
479 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
480 |
if rset is None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
481 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
482 |
rqlst = rset.syntax_tree() |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
483 |
if len(rqlst.children) > 1 or not rqlst.children[0].orderby: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
484 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
485 |
return 2 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
486 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
487 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
488 |
# XXX == multi_etypes_rset(1) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
489 |
@objectify_selector |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
490 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
491 |
def one_etype_rset(cls, req, rset=None, col=0, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
492 |
"""Return 1 if the result set contains entities which are all of the same |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
493 |
type in the column specified by the `col` argument of the input context, or |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
494 |
in column 0. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
495 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
496 |
if rset is None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
497 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
498 |
if len(rset.column_types(col)) != 1: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
499 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
500 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
501 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
502 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
503 |
class multi_etypes_rset(multi_lines_rset): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
504 |
"""If `nb` is specified, return 1 if the result set contains `nb` different |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
505 |
types of entities in the column specified by the `col` argument of the input |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
506 |
context, or in column 0. If `nb` is None, return 1 if the result set contains |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
507 |
*at least* two different types of entities. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
508 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
509 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
510 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
511 |
def __call__(self, cls, req, rset=None, col=0, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
512 |
# 'or 0' since we *must not* return None |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
513 |
return rset and self.match_expected(len(rset.column_types(col))) or 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
514 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
515 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
516 |
# entity selectors ############################################################# |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
517 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
518 |
class non_final_entity(EClassSelector): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
519 |
"""Return 1 for entity of a non final entity type(s). Remember, "final" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
520 |
entity types are String, Int, etc... This is equivalent to |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
521 |
`implements('Any')` but more optimized. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
522 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
523 |
See :class:`~cubicweb.selectors.EClassSelector` documentation for entity |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
524 |
class lookup / score rules according to the input context. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
525 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
526 |
def score(self, cls, req, etype): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
527 |
if etype in BASE_TYPES: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
528 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
529 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
530 |
|
4664
bd5ecd5b9494
#714109: [selectors] non_final_entity should implement score_class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4545
diff
changeset
|
531 |
def score_class(self, eclass, req): |
bd5ecd5b9494
#714109: [selectors] non_final_entity should implement score_class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4545
diff
changeset
|
532 |
return 1 # necessarily true if we're there |
bd5ecd5b9494
#714109: [selectors] non_final_entity should implement score_class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4545
diff
changeset
|
533 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
534 |
|
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
535 |
class implements(ImplementsMixIn, EClassSelector): |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
536 |
"""Return non-zero score for entity that are of the given type(s) or |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
537 |
implements at least one of the given interface(s). If multiple arguments are |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
538 |
given, matching one of them is enough. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
539 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
540 |
Entity types should be given as string, the corresponding class will be |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
541 |
fetched from the entity types registry at selection time. |
1474 | 542 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
543 |
See :class:`~cubicweb.selectors.EClassSelector` documentation for entity |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
544 |
class lookup / score rules according to the input context. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
545 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
546 |
.. note:: when interface is an entity class, the score will reflect class |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
547 |
proximity so the most specific object will be selected. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
548 |
""" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
549 |
def score_class(self, eclass, req): |
2822
f26578339214
deprecate appobject.vreg and rename appobject instance attributes using cw_ prefix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2819
diff
changeset
|
550 |
return self.score_interfaces(req, eclass, eclass) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
551 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
552 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
553 |
class score_entity(EntitySelector): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
554 |
"""Return score according to an arbitrary function given as argument which |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
555 |
will be called with input content entity as argument. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
556 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
557 |
This is a very useful selector that will usually interest you since it |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
558 |
allows a lot of things without having to write a specific selector. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
559 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
560 |
See :class:`~cubicweb.selectors.EntitySelector` documentation for entity |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
561 |
lookup / score rules according to the input context. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
562 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
563 |
def __init__(self, scorefunc, once_is_enough=False): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
564 |
super(score_entity, self).__init__(once_is_enough) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
565 |
def intscore(*args, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
566 |
score = scorefunc(*args, **kwargs) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
567 |
if not score: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
568 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
569 |
if isinstance(score, (int, long)): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
570 |
return score |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
571 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
572 |
self.score_entity = intscore |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
573 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
574 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
575 |
class relation_possible(EntitySelector): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
576 |
"""Return 1 for entity that supports the relation, provided that the |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
577 |
request's user may do some `action` on it (see below). |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
578 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
579 |
The relation is specified by the following initializer arguments: |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
580 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
581 |
* `rtype`, the name of the relation |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
582 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
583 |
* `role`, the role of the entity in the relation, either 'subject' or |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
584 |
'object', default to 'subject' |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
585 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
586 |
* `target_etype`, optional name of an entity type that should be supported |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
587 |
at the other end of the relation |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
588 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
589 |
* `action`, a relation schema action (e.g. one of 'read', 'add', 'delete', |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
590 |
default to 'read') which must be granted to the user, else a 0 score will |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
591 |
be returned |
1474 | 592 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
593 |
* `strict`, boolean (default to False) telling what to do when the user has |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
594 |
not globally the permission for the action (eg the action is not granted |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
595 |
to one of the user's groups) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
596 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
597 |
- when strict is False, if there are some local role defined for this |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
598 |
action (e.g. using rql expressions), then the permission will be |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
599 |
considered as granted |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
600 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
601 |
- when strict is True, then the permission will be actually checked for |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
602 |
each entity |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
603 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
604 |
Setting `strict` to True impacts performance for large result set since |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
605 |
you'll then get the :class:`~cubicweb.selectors.EntitySelector` behaviour |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
606 |
while otherwise you get the :class:`~cubicweb.selectors.EClassSelector`'s |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
607 |
one. See those classes documentation for entity lookup / score rules |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
608 |
according to the input context. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
609 |
""" |
1474 | 610 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
611 |
def __init__(self, rtype, role='subject', target_etype=None, |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
612 |
action='read', strict=False, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
613 |
super(relation_possible, self).__init__(**kwargs) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
614 |
self.rtype = rtype |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
615 |
self.role = role |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
616 |
self.target_etype = target_etype |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
617 |
self.action = action |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
618 |
self.strict = strict |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
619 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
620 |
# hack hack hack |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
621 |
def __call__(self, cls, req, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
622 |
if self.strict: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
623 |
return EntitySelector.__call__(self, cls, req, **kwargs) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
624 |
return EClassSelector.__call__(self, cls, req, **kwargs) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
625 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
626 |
def score(self, *args): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
627 |
if self.strict: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
628 |
return EntitySelector.score(self, *args) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
629 |
return EClassSelector.score(self, *args) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
630 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
631 |
def _get_rschema(self, eclass): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
632 |
eschema = eclass.e_schema |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
633 |
try: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
634 |
if self.role == 'object': |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
635 |
return eschema.objrels[self.rtype] |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
636 |
else: |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
637 |
return eschema.subjrels[self.rtype] |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
638 |
except KeyError: |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
639 |
return None |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
640 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
641 |
def score_class(self, eclass, req): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
642 |
rschema = self._get_rschema(eclass) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
643 |
if rschema is None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
644 |
return 0 # relation not supported |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
645 |
eschema = eclass.e_schema |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
646 |
if self.target_etype is not None: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
647 |
try: |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
648 |
rdef = rschema.role_rdef(eschema, self.target_etype, self.role) |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
649 |
if not rdef.may_have_permission(self.action, req): |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
650 |
return 0 |
1132 | 651 |
except KeyError: |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
652 |
return 0 |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
653 |
else: |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
654 |
return rschema.may_have_permission(self.action, req, eschema, self.role) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
655 |
return 1 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
656 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
657 |
def score_entity(self, entity): |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
658 |
rschema = self._get_rschema(entity) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
659 |
if rschema is None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
660 |
return 0 # relation not supported |
4234
0adf45697422
if specified, benefit from target_etype information in the [partial_]add_relation selector
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
661 |
if self.target_etype is not None: |
0adf45697422
if specified, benefit from target_etype information in the [partial_]add_relation selector
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
662 |
rschema = rschema.role_rdef(entity.e_schema, self.target_etype, self.role) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
663 |
if self.role == 'subject': |
3378
2f25f701301d
use ._cw instead of req on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
664 |
if not rschema.has_perm(entity._cw, 'add', fromeid=entity.eid): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
665 |
return 0 |
3378
2f25f701301d
use ._cw instead of req on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
666 |
elif not rschema.has_perm(entity._cw, 'add', toeid=entity.eid): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
667 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
668 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
669 |
|
876
f652660ae9a6
use relation_possible from within has_relation, fix another bug
sylvain.thenault@logilab.fr
parents:
839
diff
changeset
|
670 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
671 |
class partial_relation_possible(PartialSelectorMixIn, relation_possible): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
672 |
"""Same as :class:~`cubicweb.selectors.relation_possible`, but will look for |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
673 |
attributes of the selected class to get information which is otherwise |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
674 |
expected by the initializer, except for `action` and `strict` which are kept |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
675 |
as initializer arguments. |
1474 | 676 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
677 |
This is useful to predefine selector of an abstract class designed to be |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
678 |
customized. |
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
679 |
""" |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
680 |
def __init__(self, action='read', **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
681 |
super(partial_relation_possible, self).__init__(None, None, None, |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
682 |
action, **kwargs) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
683 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
684 |
def complete(self, cls): |
782
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
685 |
self.rtype = cls.rtype |
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
686 |
self.role = role(cls) |
4234
0adf45697422
if specified, benefit from target_etype information in the [partial_]add_relation selector
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4181
diff
changeset
|
687 |
self.target_etype = getattr(cls, 'etype', None) |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
688 |
if self.target_etype is not None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
689 |
warn('[3.6] please rename etype to target_etype on %s' % cls, |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
690 |
DeprecationWarning) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
691 |
else: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
692 |
self.target_etype = getattr(cls, 'target_etype', None) |
782
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
693 |
|
1474 | 694 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
695 |
class has_related_entities(EntitySelector): |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
696 |
"""Return 1 if entity support the specified relation and has some linked |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
697 |
entities by this relation , optionaly filtered according to the specified |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
698 |
target type. |
1474 | 699 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
700 |
The relation is specified by the following initializer arguments: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
701 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
702 |
* `rtype`, the name of the relation |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
703 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
704 |
* `role`, the role of the entity in the relation, either 'subject' or |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
705 |
'object', default to 'subject'. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
706 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
707 |
* `target_etype`, optional name of an entity type that should be found |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
708 |
at the other end of the relation |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
709 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
710 |
See :class:`~cubicweb.selectors.EntitySelector` documentation for entity |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
711 |
lookup / score rules according to the input context. |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
712 |
""" |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
713 |
def __init__(self, rtype, role='subject', target_etype=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
714 |
super(has_related_entities, self).__init__(**kwargs) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
715 |
self.rtype = rtype |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
716 |
self.role = role |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
717 |
self.target_etype = target_etype |
1474 | 718 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
719 |
def score_entity(self, entity): |
876
f652660ae9a6
use relation_possible from within has_relation, fix another bug
sylvain.thenault@logilab.fr
parents:
839
diff
changeset
|
720 |
relpossel = relation_possible(self.rtype, self.role, self.target_etype) |
3378
2f25f701301d
use ._cw instead of req on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
721 |
if not relpossel.score_class(entity.__class__, entity._cw): |
876
f652660ae9a6
use relation_possible from within has_relation, fix another bug
sylvain.thenault@logilab.fr
parents:
839
diff
changeset
|
722 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
723 |
rset = entity.related(self.rtype, self.role) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
724 |
if self.target_etype: |
1011
22812cfe36b4
fix w/ rset with more than one column
sylvain.thenault@logilab.fr
parents:
876
diff
changeset
|
725 |
return any(r for r in rset.description if r[0] == self.target_etype) |
835
7dcb11dd443e
fix relation_possible, ensure we return int
sylvain.thenault@logilab.fr
parents:
833
diff
changeset
|
726 |
return rset and 1 or 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
727 |
|
833
8c6bfd9158fb
bw compat for selection for creation forms
sylvain.thenault@logilab.fr
parents:
828
diff
changeset
|
728 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
729 |
class partial_has_related_entities(PartialSelectorMixIn, has_related_entities): |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
730 |
"""Same as :class:~`cubicweb.selectors.has_related_entity`, but will look |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
731 |
for attributes of the selected class to get information which is otherwise |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
732 |
expected by the initializer. |
1474 | 733 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
734 |
This is useful to predefine selector of an abstract class designed to be |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
735 |
customized. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
736 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
737 |
def __init__(self, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
738 |
super(partial_has_related_entities, self).__init__(None, None, None, |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
739 |
**kwargs) |
1474 | 740 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
741 |
def complete(self, cls): |
782
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
742 |
self.rtype = cls.rtype |
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
743 |
self.role = role(cls) |
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
744 |
self.target_etype = getattr(cls, 'etype', None) |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
745 |
if self.target_etype is not None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
746 |
warn('[3.6] please rename etype to target_etype on %s' % cls, |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
747 |
DeprecationWarning) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
748 |
else: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
749 |
self.target_etype = getattr(cls, 'target_etype', None) |
782
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
750 |
|
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
751 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
752 |
class has_permission(EntitySelector): |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
753 |
"""Return non-zero score if request's user has the permission to do the |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
754 |
requested action on the entity. `action` is an entity schema action (eg one |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
755 |
of 'read', 'add', 'delete', 'update'). |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
756 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
757 |
Here are entity lookup / scoring rules: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
758 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
759 |
* if `entity` is specified, check permission is granted for this entity |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
760 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
761 |
* elif `row` is specified, check permission is granted for the entity found |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
762 |
in the specified cell |
1474 | 763 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
764 |
* else check permission is granted for each entity found in the column |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
765 |
specified specified by the `col` argument or in column 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
766 |
""" |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
767 |
def __init__(self, action): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
768 |
self.action = action |
1474 | 769 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
770 |
# don't use EntitySelector.__call__ but this optimized implementation to |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
771 |
# avoid considering each entity when it's not necessary |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
772 |
@lltrace |
2161
200481e7b156
prepare time where it won't be mandatory to give rset to select()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2003
diff
changeset
|
773 |
def __call__(self, cls, req, rset=None, row=None, col=0, **kwargs): |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
774 |
if kwargs.get('entity'): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
775 |
return self.score_entity(kwargs['entity']) |
788 | 776 |
if rset is None: |
777 |
return 0 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
778 |
user = req.user |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
779 |
action = self.action |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
780 |
if row is None: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
781 |
score = 0 |
1474 | 782 |
need_local_check = [] |
2816
85f7502d32be
access schema through req.vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2797
diff
changeset
|
783 |
geteschema = req.vreg.schema.eschema |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
784 |
for etype in rset.column_types(0): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
785 |
if etype in BASE_TYPES: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
786 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
787 |
eschema = geteschema(etype) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
788 |
if not user.matching_groups(eschema.get_groups(action)): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
789 |
if eschema.has_local_role(action): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
790 |
# have to ckeck local roles |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
791 |
need_local_check.append(eschema) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
792 |
continue |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
793 |
else: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
794 |
# even a local role won't be enough |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
795 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
796 |
score += 1 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
797 |
if need_local_check: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
798 |
# check local role for entities of necessary types |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
799 |
for i, row in enumerate(rset): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
800 |
if not rset.description[i][0] in need_local_check: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
801 |
continue |
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
802 |
if not self.score(req, rset, i, col): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
803 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
804 |
score += 1 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
805 |
return score |
876
f652660ae9a6
use relation_possible from within has_relation, fix another bug
sylvain.thenault@logilab.fr
parents:
839
diff
changeset
|
806 |
return self.score(req, rset, row, col) |
1474 | 807 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
808 |
def score_entity(self, entity): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
809 |
if entity.has_perm(self.action): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
810 |
return 1 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
811 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
812 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
813 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
814 |
class has_add_permission(EClassSelector): |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
815 |
"""Return 1 if request's user has the add permission on entity type |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
816 |
specified in the `etype` initializer argument, or according to entity found |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
817 |
in the input content if not specified. |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
818 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
819 |
It also check that then entity type is not a strict subobject (e.g. may only |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
820 |
be used as a composed of another entity). |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
821 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
822 |
See :class:`~cubicweb.selectors.EClassSelector` documentation for entity |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
823 |
class lookup / score rules according to the input context when `etype` is |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
824 |
not specified. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
825 |
""" |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
826 |
def __init__(self, etype=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
827 |
super(has_add_permission, self).__init__(**kwargs) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
828 |
self.etype = etype |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
829 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
830 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
831 |
def __call__(self, cls, req, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
832 |
if self.etype is None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
833 |
return super(has_add_permission, self).__call__(cls, req, **kwargs) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
834 |
return self.score(cls, req, self.etype) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
835 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
836 |
def score_class(self, eclass, req): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
837 |
eschema = eclass.e_schema |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
838 |
if eschema.final or eschema.is_subobject(strict=True) \ |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
839 |
or not eschema.has_perm(req, 'add'): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
840 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
841 |
return 1 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
842 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
843 |
|
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
844 |
class rql_condition(EntitySelector): |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
845 |
"""Return non-zero score if arbitrary rql specified in `expression` |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
846 |
initializer argument return some results for entity found in the input |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
847 |
context. Returned score is the number of items returned by the rql |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
848 |
condition. |
1474 | 849 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
850 |
`expression` is expected to be a string containing an rql expression, which |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
851 |
must use 'X' variable to represent the context entity and may use 'U' to |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
852 |
represent the request's user. |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
853 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
854 |
See :class:`~cubicweb.selectors.EntitySelector` documentation for entity |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
855 |
lookup / score rules according to the input context. |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
856 |
""" |
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
857 |
def __init__(self, expression, once_is_enough=False): |
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
858 |
super(rql_condition, self).__init__(once_is_enough) |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
859 |
if 'U' in frozenset(split_expression(expression)): |
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
860 |
rql = 'Any X WHERE X eid %%(x)s, U eid %%(u)s, %s' % expression |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
861 |
else: |
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
862 |
rql = 'Any X WHERE X eid %%(x)s, %s' % expression |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
863 |
self.rql = rql |
1474 | 864 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
865 |
def __repr__(self): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
866 |
return u'<rql_condition "%s" at %x>' % (self.rql, id(self)) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
867 |
|
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
868 |
def score(self, req, rset, row, col): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
869 |
try: |
764 | 870 |
return len(req.execute(self.rql, {'x': rset[row][col], |
871 |
'u': req.user.eid}, 'x')) |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
872 |
except Unauthorized: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
873 |
return 0 |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
874 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
875 |
# logged user selectors ######################################################## |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
876 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
877 |
@objectify_selector |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
878 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
879 |
def authenticated_user(cls, req, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
880 |
"""Return 1 if the user is authenticated (e.g. not the anonymous user). |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
881 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
882 |
May only be used on the web side, not on the data repository side. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
883 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
884 |
if req.cnx.anonymous_connection: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
885 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
886 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
887 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
888 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
889 |
# XXX == ~ authenticated_user() |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
890 |
def anonymous_user(): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
891 |
"""Return 1 if the user is not authenticated (e.g. is the anonymous user). |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
892 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
893 |
May only be used on the web side, not on the data repository side. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
894 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
895 |
return ~ authenticated_user() |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
896 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
897 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
898 |
class match_user_groups(ExpectedValueSelector): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
899 |
"""Return a non-zero score if request's user is in at least one of the |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
900 |
groups given as initializer argument. Returned score is the number of groups |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
901 |
in which the user is. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
902 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
903 |
If the special 'owners' group is given and `rset` is specified in the input |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
904 |
context: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
905 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
906 |
* if `row` is specified check the entity at the given `row`/`col` (default |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
907 |
to 0) is owned by the user |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
908 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
909 |
* else check all entities in `col` (default to 0) are owned by the user |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
910 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
911 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
912 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
913 |
def __call__(self, cls, req, rset=None, row=None, col=0, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
914 |
user = req.user |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
915 |
if user is None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
916 |
return int('guests' in self.expected) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
917 |
score = user.matching_groups(self.expected) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
918 |
if not score and 'owners' in self.expected and rset: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
919 |
if row is not None: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
920 |
if not user.owns(rset[row][col]): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
921 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
922 |
score = 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
923 |
else: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
924 |
score = all(user.owns(r[col]) for r in rset) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
925 |
return score |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
926 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
927 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
928 |
# Web request selectors ######################################################## |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
929 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
930 |
@objectify_selector |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
931 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
932 |
def primary_view(cls, req, view=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
933 |
"""Return 1 if: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
934 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
935 |
* *no view is specified* in the input context |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
936 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
937 |
* a view is specified and its `.is_primary()` method return True |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
938 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
939 |
This selector is usually used by contextual components that only want to |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
940 |
appears for the primary view of an entity. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
941 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
942 |
if view is not None and not view.is_primary(): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
943 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
944 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
945 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
946 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
947 |
class match_view(ExpectedValueSelector): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
948 |
"""Return 1 if a view is specified an as its registry id is in one of the |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
949 |
expected view id given to the initializer. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
950 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
951 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
952 |
def __call__(self, cls, req, view=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
953 |
if view is None or not view.__regid__ in self.expected: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
954 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
955 |
return 1 |
1474 | 956 |
|
2084
923788d1f9c6
optional rset, those prototype could be simplified once bw compat for non named rset will be dropped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2082
diff
changeset
|
957 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
958 |
@objectify_selector |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
959 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
960 |
def match_context_prop(cls, req, context=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
961 |
"""Return 1 if: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
962 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
963 |
* no `context` is specified in input context (take care to confusion, here |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
964 |
`context` refers to a string given as an argument to the input context...) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
965 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
966 |
* specified `context` is matching the context property value for the |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
967 |
appobject using this selector |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
968 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
969 |
* the appobject's context property value is None |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
970 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
971 |
This selector is usually used by contextual components that want to appears |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
972 |
in a configurable place. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
973 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
974 |
if context is None: |
4509
a17033cfc892
when no context specified, should return non-zero score as documented
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4462
diff
changeset
|
975 |
return 1 |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
976 |
propval = req.property_value('%s.%s.context' % (cls.__registry__, |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
977 |
cls.__regid__)) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
978 |
if not propval: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
979 |
propval = cls.context |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
980 |
if propval and context != propval: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
981 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
982 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
983 |
|
1474 | 984 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
985 |
class match_search_state(ExpectedValueSelector): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
986 |
"""Return 1 if the current request search state is in one of the expected |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
987 |
states given to the initializer. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
988 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
989 |
Known search states are either 'normal' or 'linksearch' (eg searching for an |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
990 |
object to create a relation with another). |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
991 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
992 |
This selector is usually used by action that want to appears or not according |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
993 |
to the ui search state. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
994 |
""" |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
995 |
|
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
996 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
997 |
def __call__(self, cls, req, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
998 |
try: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
999 |
if not req.search_state[0] in self.expected: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1000 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1001 |
except AttributeError: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1002 |
return 1 # class doesn't care about search state, accept it |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1003 |
return 1 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1004 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1005 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1006 |
class match_form_params(ExpectedValueSelector): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1007 |
"""Return non-zero score if parameter names specified as initializer |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1008 |
arguments are specified in request's form parameters. When multiple |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1009 |
parameters are specified, all of them should be found in req.form. Return a |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1010 |
score corresponding to the number of expected parameters. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
1011 |
""" |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1012 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1013 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1014 |
def __call__(self, cls, req, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1015 |
for param in self.expected: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1016 |
if not param in req.form: |
3276
4480887772a3
[selectors] score_entity selector now ensures an int score is returned
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2972
diff
changeset
|
1017 |
return 0 |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1018 |
return len(self.expected) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1019 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1020 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1021 |
class specified_etype_implements(implements): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1022 |
"""Return non-zero score if the entity type specified by an 'etype' key |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1023 |
searched in (by priority) input context kwargs and request form parameters |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1024 |
match a known entity type (case insensitivly), and it's associated entity |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1025 |
class is of one of the type(s) given to the initializer or implements at |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1026 |
least one of the given interfaces. If multiple arguments are given, matching |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1027 |
one of them is enough. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1028 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1029 |
Entity types should be given as string, the corresponding class will be |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1030 |
fetched from the entity types registry at selection time. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1031 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1032 |
.. note:: when interface is an entity class, the score will reflect class |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1033 |
proximity so the most specific object will be selected. |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1034 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1035 |
This selector is usually used by views holding entity creation forms (since |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1036 |
we've no result set to work on). |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1037 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1038 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1039 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1040 |
def __call__(self, cls, req, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1041 |
try: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1042 |
etype = kwargs['etype'] |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1043 |
except KeyError: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1044 |
try: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1045 |
etype = req.form['etype'] |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1046 |
except KeyError: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1047 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1048 |
else: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1049 |
# only check this is a known type if etype comes from req.form, |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1050 |
# else we want the error to propagate |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1051 |
try: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1052 |
etype = req.vreg.case_insensitive_etypes[etype.lower()] |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1053 |
req.form['etype'] = etype |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1054 |
except KeyError: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1055 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1056 |
score = self.score_class(req.vreg['etypes'].etype_class(etype), req) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1057 |
if score: |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1058 |
eschema = req.vreg.schema.eschema(etype) |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1059 |
if eschema.has_local_role('add') or eschema.has_perm(req, 'add'): |
3276
4480887772a3
[selectors] score_entity selector now ensures an int score is returned
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2972
diff
changeset
|
1060 |
return score |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1061 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1062 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1063 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1064 |
# Other selectors ############################################################## |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1065 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1066 |
|
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1067 |
class match_transition(ExpectedValueSelector): |
4545
9b7b3303c515
fix match_transition selector: for instance w/ forge version change state form overiding, we want the form with the publication_date selected by the editcontroller, whatever the transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4509
diff
changeset
|
1068 |
"""Return 1 if: |
9b7b3303c515
fix match_transition selector: for instance w/ forge version change state form overiding, we want the form with the publication_date selected by the editcontroller, whatever the transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4509
diff
changeset
|
1069 |
|
9b7b3303c515
fix match_transition selector: for instance w/ forge version change state form overiding, we want the form with the publication_date selected by the editcontroller, whatever the transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4509
diff
changeset
|
1070 |
* a `transition` argument is found in the input context which |
9b7b3303c515
fix match_transition selector: for instance w/ forge version change state form overiding, we want the form with the publication_date selected by the editcontroller, whatever the transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4509
diff
changeset
|
1071 |
has a `.name` attribute matching one of the expected names given to the |
9b7b3303c515
fix match_transition selector: for instance w/ forge version change state form overiding, we want the form with the publication_date selected by the editcontroller, whatever the transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4509
diff
changeset
|
1072 |
initializer |
9b7b3303c515
fix match_transition selector: for instance w/ forge version change state form overiding, we want the form with the publication_date selected by the editcontroller, whatever the transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4509
diff
changeset
|
1073 |
|
9b7b3303c515
fix match_transition selector: for instance w/ forge version change state form overiding, we want the form with the publication_date selected by the editcontroller, whatever the transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4509
diff
changeset
|
1074 |
* no transition specified. |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1075 |
""" |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1076 |
@lltrace |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1077 |
def __call__(self, cls, req, transition=None, **kwargs): |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1078 |
# XXX check this is a transition that apply to the object? |
4545
9b7b3303c515
fix match_transition selector: for instance w/ forge version change state form overiding, we want the form with the publication_date selected by the editcontroller, whatever the transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4509
diff
changeset
|
1079 |
if transition is None: |
9b7b3303c515
fix match_transition selector: for instance w/ forge version change state form overiding, we want the form with the publication_date selected by the editcontroller, whatever the transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4509
diff
changeset
|
1080 |
return 1 |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1081 |
if transition is not None and getattr(transition, 'name', None) in self.expected: |
3276
4480887772a3
[selectors] score_entity selector now ensures an int score is returned
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2972
diff
changeset
|
1082 |
return 1 |
4462
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1083 |
return 0 |
c57c8176b8c2
reorganize, cleanup and properly document base selectors. Kill the may_add_relation selector.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4458
diff
changeset
|
1084 |
|
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
1085 |
|
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
1086 |
## deprecated stuff ############################################################ |
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
1087 |
|
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
1088 |
entity_implements = class_renamed('entity_implements', implements) |
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
1089 |
|
4081
64548076add4
avoid infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4071
diff
changeset
|
1090 |
class _but_etype(EntitySelector): |
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
1091 |
"""accept if the given entity types are not found in the result set. |
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
1092 |
|
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
1093 |
See `EntitySelector` documentation for behaviour when row is not specified. |
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
1094 |
|
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
1095 |
:param *etypes: entity types (`basestring`) which should be refused |
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
1096 |
""" |
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
1097 |
def __init__(self, *etypes): |
4102
5ba6df5fcb07
missing underscore leads to infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4081
diff
changeset
|
1098 |
super(_but_etype, self).__init__() |
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
1099 |
self.but_etypes = etypes |
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
1100 |
|
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
1101 |
def score(self, req, rset, row, col): |
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
1102 |
if rset.description[row][col] in self.but_etypes: |
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
1103 |
return 0 |
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
1104 |
return 1 |
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
1105 |
|
4081
64548076add4
avoid infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4071
diff
changeset
|
1106 |
but_etype = class_renamed('but_etype', _but_etype, 'use ~implements(*etypes) instead') |
4320
4efd4c306746
closes #345410: two_lines_rset, two_cols_rset, two_etypes_rset are badly named
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4264
diff
changeset
|
1107 |
|
4efd4c306746
closes #345410: two_lines_rset, two_cols_rset, two_etypes_rset are badly named
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4264
diff
changeset
|
1108 |
|
4efd4c306746
closes #345410: two_lines_rset, two_cols_rset, two_etypes_rset are badly named
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4264
diff
changeset
|
1109 |
# XXX deprecated the one_* variants of selectors below w/ multi_xxx(nb=1)? |
4efd4c306746
closes #345410: two_lines_rset, two_cols_rset, two_etypes_rset are badly named
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4264
diff
changeset
|
1110 |
# take care at the implementation though (looking for the 'row' argument's |
4efd4c306746
closes #345410: two_lines_rset, two_cols_rset, two_etypes_rset are badly named
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4264
diff
changeset
|
1111 |
# value) |
4efd4c306746
closes #345410: two_lines_rset, two_cols_rset, two_etypes_rset are badly named
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4264
diff
changeset
|
1112 |
two_lines_rset = class_renamed('two_lines_rset', multi_lines_rset) |
4efd4c306746
closes #345410: two_lines_rset, two_cols_rset, two_etypes_rset are badly named
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4264
diff
changeset
|
1113 |
two_cols_rset = class_renamed('two_cols_rset', multi_columns_rset) |
4efd4c306746
closes #345410: two_lines_rset, two_cols_rset, two_etypes_rset are badly named
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4264
diff
changeset
|
1114 |
two_etypes_rset = class_renamed('two_etypes_rset', multi_etypes_rset) |