author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Thu, 04 Feb 2010 13:17:26 +0100 | |
changeset 4458 | 6151849f41e0 |
parent 4340 | cc0fe6279181 |
child 4462 | c57c8176b8c2 |
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 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
139 |
# abstract selectors ########################################################## |
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): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
179 |
"""abstract class for selectors working on the entity classes of the result |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
180 |
set. Its __call__ method has the following behaviour: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
181 |
|
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
182 |
* if 'entity' find in kwargs, return the score returned by the score_class |
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
183 |
method for this entity's class |
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
184 |
* elif row is specified, return the score returned by the score_class method |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
185 |
called with the entity class found in the specified cell |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
186 |
* else return the sum of score returned by the score_class method for each |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
187 |
entity type found in the specified column, unless: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
188 |
- `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
|
189 |
returned |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
190 |
- `once_is_enough` is False, in which case if score_class return 0, 0 is |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
191 |
returned |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
192 |
""" |
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
|
193 |
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
|
194 |
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
|
195 |
self.accept_none = accept_none |
1474 | 196 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
197 |
@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
|
198 |
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
|
199 |
if kwargs.get('entity'): |
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
200 |
return self.score_class(kwargs['entity'].__class__, req) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
201 |
if not rset: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
202 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
203 |
score = 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
204 |
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
|
205 |
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
|
206 |
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
|
207 |
return 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
208 |
for etype in rset.column_types(col): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
209 |
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
|
210 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
211 |
escore = self.score(cls, req, etype) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
212 |
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
|
213 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
214 |
elif self.once_is_enough: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
215 |
return escore |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
216 |
score += escore |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
217 |
else: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
218 |
etype = rset.description[row][col] |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
219 |
if etype is not None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
220 |
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
|
221 |
return score |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
222 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
223 |
def score(self, cls, req, etype): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
224 |
if etype in BASE_TYPES: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
225 |
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
|
226 |
return self.score_class(req.vreg['etypes'].etype_class(etype), req) |
1474 | 227 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
228 |
def score_class(self, eclass, req): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
229 |
raise NotImplementedError() |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
230 |
|
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 |
class EntitySelector(EClassSelector): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
233 |
"""abstract class for selectors working on the entity instances of the |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
234 |
result set. Its __call__ method has the following behaviour: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
235 |
|
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
236 |
* if 'entity' find in kwargs, return the score returned by the score_entity |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
237 |
method for this entity |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
238 |
* if row is specified, return the score returned by the score_entity method |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
239 |
called with the entity instance found in the specified cell |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
240 |
* else return the sum of score returned by the score_entity method for each |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
241 |
entity found in the specified column, unless: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
242 |
- `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
|
243 |
returned |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
244 |
- `once_is_enough` is False, in which case if score_class return 0, 0 is |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
245 |
returned |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
246 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
247 |
note: None values (resulting from some outer join in the query) are not |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
248 |
considered. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
249 |
""" |
1474 | 250 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
251 |
@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
|
252 |
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
|
253 |
if not rset and not kwargs.get('entity'): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
254 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
255 |
score = 0 |
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
256 |
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
|
257 |
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
|
258 |
elif row is None: |
1994
56a235af050e
col may be None
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1987
diff
changeset
|
259 |
col = col or 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
260 |
for row, rowvalue in enumerate(rset.rows): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
261 |
if rowvalue[col] is None: # outer join |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
262 |
continue |
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
263 |
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
|
264 |
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
|
265 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
266 |
elif self.once_is_enough: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
267 |
return escore |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
268 |
score += escore |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
269 |
else: |
1994
56a235af050e
col may be None
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1987
diff
changeset
|
270 |
col = col or 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
271 |
etype = rset.description[row][col] |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
272 |
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
|
273 |
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
|
274 |
return score |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
275 |
|
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
276 |
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
|
277 |
try: |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
278 |
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
|
279 |
except NotAnEntity: |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
280 |
return 0 |
1474 | 281 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
282 |
def score_entity(self, entity): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
283 |
raise NotImplementedError() |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
284 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
285 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
286 |
# very basic selectors ######################################################## |
1138
22f634977c95
make pylint happy, fix some bugs on the way
sylvain.thenault@logilab.fr
parents:
1132
diff
changeset
|
287 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
288 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
289 |
@lltrace |
2081
7f906fe1c5b7
make rset optional
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2003
diff
changeset
|
290 |
def none_rset(cls, req, rset=None, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
291 |
"""accept no result set (e.g. given rset is None)""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
292 |
if rset is None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
293 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
294 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
295 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
296 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
297 |
@lltrace |
2081
7f906fe1c5b7
make rset optional
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2003
diff
changeset
|
298 |
def any_rset(cls, req, rset=None, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
299 |
"""accept result set, whatever the number of result it contains""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
300 |
if rset is not None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
301 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
302 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
303 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
304 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
305 |
@lltrace |
2081
7f906fe1c5b7
make rset optional
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2003
diff
changeset
|
306 |
def nonempty_rset(cls, req, rset=None, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
307 |
"""accept any non empty result set""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
308 |
if rset is not None and rset.rowcount: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
309 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
310 |
return 0 |
1474 | 311 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
312 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
313 |
@lltrace |
2081
7f906fe1c5b7
make rset optional
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2003
diff
changeset
|
314 |
def empty_rset(cls, req, rset=None, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
315 |
"""accept empty result set""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
316 |
if rset is not None and rset.rowcount == 0: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
317 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
318 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
319 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
320 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
321 |
@lltrace |
2081
7f906fe1c5b7
make rset optional
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2003
diff
changeset
|
322 |
def one_line_rset(cls, req, rset=None, row=None, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
323 |
"""if row is specified, accept result set with a single line of result, |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
324 |
else accepts anyway |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
325 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
326 |
if rset is not None and (row is not None or rset.rowcount == 1): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
327 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
328 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
329 |
|
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
|
330 |
|
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
|
331 |
class multi_lines_rset(Selector): |
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
|
332 |
def __init__(self, nb=None): |
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
|
333 |
self.expected = nb |
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
|
334 |
|
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
|
335 |
def match_expected(self, num): |
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
|
336 |
if self.expected is None: |
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
|
337 |
return num > 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
|
338 |
return num == self.expected |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
339 |
|
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
|
340 |
@lltrace |
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
|
341 |
def __call__(self, cls, req, rset=None, row=None, col=0, **kwargs): |
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
|
342 |
return rset is not None and self.match_expected(rset.rowcount) |
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
|
343 |
|
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
|
344 |
|
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
|
345 |
class multi_columns_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
|
346 |
|
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
|
347 |
@lltrace |
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
|
348 |
def __call__(self, cls, req, rset=None, row=None, col=0, **kwargs): |
4340
cc0fe6279181
a selector MUST NO return None
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4327
diff
changeset
|
349 |
return rset and self.match_expected(len(rset.rows[0])) or 0 # *must not* return None |
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
|
350 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
351 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
352 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
353 |
@lltrace |
2081
7f906fe1c5b7
make rset optional
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2003
diff
changeset
|
354 |
def paginated_rset(cls, req, rset=None, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
355 |
"""accept result set with more lines than the page size. |
1474 | 356 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
357 |
Page size is searched in (respecting order): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
358 |
* a page_size argument |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
359 |
* a page_size form parameters |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
360 |
* the navigation.page-size property |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
361 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
362 |
page_size = kwargs.get('page_size') |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
363 |
if page_size is None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
364 |
page_size = req.form.get('page_size') |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
365 |
if page_size is None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
366 |
page_size = req.property_value('navigation.page-size') |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
367 |
else: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
368 |
page_size = int(page_size) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
369 |
if rset is None or rset.rowcount <= page_size: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
370 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
371 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
372 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
373 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
374 |
@lltrace |
2081
7f906fe1c5b7
make rset optional
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2003
diff
changeset
|
375 |
def sorted_rset(cls, req, rset=None, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
376 |
"""accept sorted result set""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
377 |
rqlst = rset.syntax_tree() |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
378 |
if len(rqlst.children) > 1 or not rqlst.children[0].orderby: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
379 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
380 |
return 2 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
381 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
382 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
383 |
@lltrace |
2081
7f906fe1c5b7
make rset optional
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2003
diff
changeset
|
384 |
def one_etype_rset(cls, req, rset=None, col=0, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
385 |
"""accept result set where entities in the specified column (or 0) are all |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
386 |
of the same type |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
387 |
""" |
782
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
388 |
if rset is None: |
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
389 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
390 |
if len(rset.column_types(col)) != 1: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
391 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
392 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
393 |
|
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
|
394 |
|
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
|
395 |
class multi_etypes_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
|
396 |
|
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
|
397 |
@lltrace |
4327
e397b921c40f
fix name error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4320
diff
changeset
|
398 |
def __call__(self, cls, req, rset=None, col=0, **kwargs): |
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
|
399 |
return rset and self.match_expected(len(rset.column_types(col))) |
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
|
400 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
401 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
402 |
class non_final_entity(EClassSelector): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
403 |
"""accept if entity type found in the result set is non final. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
404 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
405 |
See `EClassSelector` documentation for behaviour when row is not specified. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
406 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
407 |
def score(self, cls, req, etype): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
408 |
if etype in BASE_TYPES: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
409 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
410 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
411 |
|
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
|
412 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
413 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
414 |
@lltrace |
828
394927376a01
two use cases for the 'not' selector
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
810
diff
changeset
|
415 |
def authenticated_user(cls, req, *args, **kwargs): |
1492 | 416 |
"""accept if user is authenticated""" |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
417 |
if req.cnx.anonymous_connection: |
828
394927376a01
two use cases for the 'not' selector
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
810
diff
changeset
|
418 |
return 0 |
394927376a01
two use cases for the 'not' selector
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
810
diff
changeset
|
419 |
return 1 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
420 |
|
828
394927376a01
two use cases for the 'not' selector
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
810
diff
changeset
|
421 |
def anonymous_user(): |
394927376a01
two use cases for the 'not' selector
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
810
diff
changeset
|
422 |
return ~ authenticated_user() |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
423 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
424 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
425 |
@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
|
426 |
def primary_view(cls, req, rset=None, row=None, col=0, view=None, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
427 |
"""accept if view given as named argument is a primary view, or if no view |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
428 |
is given |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
429 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
430 |
if view is not None and not view.is_primary(): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
431 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
432 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
433 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
434 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
435 |
@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
|
436 |
def match_context_prop(cls, req, rset=None, row=None, col=0, context=None, |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
437 |
**kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
438 |
"""accept if: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
439 |
* no context given |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
440 |
* context (`basestring`) is matching the context property value for the |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
441 |
given cls |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
442 |
""" |
3399
2b84f4adb6f8
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3396
diff
changeset
|
443 |
propval = req.property_value('%s.%s.context' % (cls.__registry__, |
2b84f4adb6f8
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3396
diff
changeset
|
444 |
cls.__regid__)) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
445 |
if not propval: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
446 |
propval = cls.context |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
447 |
if context is not None and propval and context != propval: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
448 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
449 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
450 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
451 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
452 |
class match_search_state(Selector): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
453 |
"""accept if the current request search state is in one of the expected |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
454 |
states given to the initializer |
1474 | 455 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
456 |
:param expected: either 'normal' or 'linksearch' (eg searching for an |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
457 |
object to create a relation with another) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
458 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
459 |
def __init__(self, *expected): |
774
48cb1f42e79c
tell on which class the assertion's failed
sylvain.thenault@logilab.fr
parents:
770
diff
changeset
|
460 |
assert expected, self |
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
461 |
self.expected = frozenset(expected) |
779
8510e14335e1
implements some str, fix implements selector, test and fixes
sylvain.thenault@logilab.fr
parents:
774
diff
changeset
|
462 |
|
8510e14335e1
implements some str, fix implements selector, test and fixes
sylvain.thenault@logilab.fr
parents:
774
diff
changeset
|
463 |
def __str__(self): |
8510e14335e1
implements some str, fix implements selector, test and fixes
sylvain.thenault@logilab.fr
parents:
774
diff
changeset
|
464 |
return '%s(%s)' % (self.__class__.__name__, |
8510e14335e1
implements some str, fix implements selector, test and fixes
sylvain.thenault@logilab.fr
parents:
774
diff
changeset
|
465 |
','.join(sorted(str(s) for s in self.expected))) |
1474 | 466 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
467 |
@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
|
468 |
def __call__(self, cls, req, rset=None, row=None, col=0, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
469 |
try: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
470 |
if not req.search_state[0] in self.expected: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
471 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
472 |
except AttributeError: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
473 |
return 1 # class doesn't care about search state, accept it |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
474 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
475 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
476 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
477 |
class match_form_params(match_search_state): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
478 |
"""accept if parameters specified as initializer arguments are specified |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
479 |
in request's form parameters |
1474 | 480 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
481 |
:param *expected: parameters (eg `basestring`) which are expected to be |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
482 |
found in request's form parameters |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
483 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
484 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
485 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
486 |
def __call__(self, cls, req, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
487 |
score = 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
488 |
for param in self.expected: |
2254
f632b06058c4
fix match_form_params according to docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2161
diff
changeset
|
489 |
if not param in req.form: |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
490 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
491 |
score += 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
492 |
return len(self.expected) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
493 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
494 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
495 |
class match_kwargs(match_search_state): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
496 |
"""accept if parameters specified as initializer arguments are specified |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
497 |
in named arguments given to the selector |
1474 | 498 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
499 |
:param *expected: parameters (eg `basestring`) which are expected to be |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
500 |
found in named arguments (kwargs) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
501 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
502 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
503 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
504 |
def __call__(self, cls, req, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
505 |
for arg in self.expected: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
506 |
if not arg in kwargs: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
507 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
508 |
return len(self.expected) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
509 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
510 |
|
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
511 |
class match_user_groups(match_search_state): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
512 |
"""accept if logged users is in at least one of the given groups. Returned |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
513 |
score is the number of groups in which the user is. |
1474 | 514 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
515 |
If the special 'owners' group is given: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
516 |
* if row is specified check the entity at the given row/col is owned by the |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
517 |
logged user |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
518 |
* if row is not specified check all entities in col are owned by the logged |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
519 |
user |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
520 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
521 |
:param *required_groups: name of groups (`basestring`) in which the logged |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
522 |
user should be |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
523 |
""" |
1474 | 524 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
525 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
526 |
def __call__(self, cls, req, rset=None, row=None, col=0, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
527 |
user = req.user |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
528 |
if user is None: |
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
529 |
return int('guests' in self.expected) |
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
530 |
score = user.matching_groups(self.expected) |
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
531 |
if not score and 'owners' in self.expected and rset: |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
532 |
if row is not None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
533 |
if not user.owns(rset[row][col]): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
534 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
535 |
score = 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
536 |
else: |
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
537 |
score = all(user.owns(r[col]) for r in rset) |
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
538 |
return score |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
539 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
540 |
|
1503 | 541 |
class match_transition(match_search_state): |
542 |
@lltrace |
|
543 |
def __call__(self, cls, req, rset=None, row=None, col=0, **kwargs): |
|
544 |
try: |
|
3350
fa77640a9155
since we have the transition entity, give it directly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3346
diff
changeset
|
545 |
# XXX check this is a transition that apply to the object? |
fa77640a9155
since we have the transition entity, give it directly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3346
diff
changeset
|
546 |
if not kwargs['transition'].name in self.expected: |
fa77640a9155
since we have the transition entity, give it directly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3346
diff
changeset
|
547 |
return 0 |
fa77640a9155
since we have the transition entity, give it directly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3346
diff
changeset
|
548 |
except KeyError: |
1503 | 549 |
return 0 |
550 |
return 1 |
|
551 |
||
552 |
||
1263 | 553 |
class match_view(match_search_state): |
554 |
"""accept if the current view is in one of the expected vid given to the |
|
555 |
initializer |
|
556 |
""" |
|
557 |
@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
|
558 |
def __call__(self, cls, req, rset=None, row=None, col=0, view=None, **kwargs): |
3399
2b84f4adb6f8
use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3396
diff
changeset
|
559 |
if view is None or not view.__regid__ in self.expected: |
1263 | 560 |
return 0 |
561 |
return 1 |
|
562 |
||
563 |
||
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
564 |
class appobject_selectable(Selector): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
565 |
"""accept with another appobject is selectable using selector's input |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
566 |
context. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
567 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
568 |
:param registry: a registry name (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
569 |
:param oid: an object identifier (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
570 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
571 |
def __init__(self, registry, oid): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
572 |
self.registry = registry |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
573 |
self.oid = oid |
1474 | 574 |
|
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
|
575 |
def __call__(self, cls, req, **kwargs): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
576 |
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
|
577 |
req.vreg[self.registry].select(self.oid, req, **kwargs) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
578 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
579 |
except NoSelectableObject: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
580 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
581 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
582 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
583 |
# not so basic selectors ###################################################### |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
584 |
|
1301
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
585 |
class implements(ImplementsMixIn, EClassSelector): |
4596ce9bb4dc
EntitySelector base class now understand 'entity' in kwargs, new entity_implements selector
sylvain.thenault@logilab.fr
parents:
1263
diff
changeset
|
586 |
"""accept if entity classes found in the result set implements at least one |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
587 |
of the interfaces given as argument. Returned score is the number of |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
588 |
implemented interfaces. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
589 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
590 |
See `EClassSelector` documentation for behaviour when row is not specified. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
591 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
592 |
:param *expected_ifaces: expected interfaces. An interface may be a class |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
593 |
or an entity type (e.g. `basestring`) in which case |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
594 |
the associated class will be searched in the |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
595 |
registry (at selection time) |
1474 | 596 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
597 |
note: when interface is an entity class, the score will reflect class |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
598 |
proximity so the most specific object'll be selected |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
599 |
""" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
600 |
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
|
601 |
return self.score_interfaces(req, eclass, eclass) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
602 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
603 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
604 |
class specified_etype_implements(implements): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
605 |
"""accept if entity class specified using an 'etype' parameters in name |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
606 |
argument or request form implements at least one of the interfaces given as |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
607 |
argument. Returned score is the number of implemented interfaces. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
608 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
609 |
:param *expected_ifaces: expected interfaces. An interface may be a class |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
610 |
or an entity type (e.g. `basestring`) in which case |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
611 |
the associated class will be searched in the |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
612 |
registry (at selection time) |
1474 | 613 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
614 |
note: when interface is an entity class, the score will reflect class |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
615 |
proximity so the most specific object'll be selected |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
616 |
""" |
1474 | 617 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
618 |
@lltrace |
789 | 619 |
def __call__(self, cls, req, *args, **kwargs): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
620 |
try: |
2514
c745dfb2734e
[selectors] change specified_etype_implements: kwargs prevails on req.form
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2381
diff
changeset
|
621 |
etype = kwargs['etype'] |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
622 |
except KeyError: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
623 |
try: |
2514
c745dfb2734e
[selectors] change specified_etype_implements: kwargs prevails on req.form
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2381
diff
changeset
|
624 |
etype = req.form['etype'] |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
625 |
except KeyError: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
626 |
return 0 |
3346
b1fd9d4ef579
fix case insensitive selector for entity creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3345
diff
changeset
|
627 |
else: |
b1fd9d4ef579
fix case insensitive selector for entity creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3345
diff
changeset
|
628 |
# only check this is a known type if etype comes from req.form, |
b1fd9d4ef579
fix case insensitive selector for entity creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3345
diff
changeset
|
629 |
# else we want the error to propagate |
b1fd9d4ef579
fix case insensitive selector for entity creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3345
diff
changeset
|
630 |
try: |
3393
58a62864bae4
[selectors] cls.vreg is not usable anymore, use req.vreg instead
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
631 |
etype = req.vreg.case_insensitive_etypes[etype.lower()] |
3346
b1fd9d4ef579
fix case insensitive selector for entity creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3345
diff
changeset
|
632 |
req.form['etype'] = etype |
b1fd9d4ef579
fix case insensitive selector for entity creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3345
diff
changeset
|
633 |
except KeyError: |
b1fd9d4ef579
fix case insensitive selector for entity creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3345
diff
changeset
|
634 |
return 0 |
4181 | 635 |
score = self.score_class(req.vreg['etypes'].etype_class(etype), req) |
4148
748454627176
cubicweb security #36257: les urls /add/EntityName sont accessibles en anonyme
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
636 |
if score: |
748454627176
cubicweb security #36257: les urls /add/EntityName sont accessibles en anonyme
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
637 |
eschema = req.vreg.schema.eschema(etype) |
748454627176
cubicweb security #36257: les urls /add/EntityName sont accessibles en anonyme
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
638 |
if eschema.has_local_role('add') or eschema.has_perm(req, 'add'): |
748454627176
cubicweb security #36257: les urls /add/EntityName sont accessibles en anonyme
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
639 |
return score |
748454627176
cubicweb security #36257: les urls /add/EntityName sont accessibles en anonyme
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
640 |
return 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
641 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
642 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
643 |
class relation_possible(EClassSelector): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
644 |
"""accept if entity class found in the result set support the relation. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
645 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
646 |
See `EClassSelector` documentation for behaviour when row is not specified. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
647 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
648 |
:param rtype: a relation type (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
649 |
:param role: the role of the result set entity in the relation. 'subject' or |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
650 |
'object', default to 'subject'. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
651 |
:param target_type: if specified, check the relation's end may be of this |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
652 |
target type (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
653 |
:param action: a relation schema action (one of 'read', 'add', 'delete') |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
654 |
which must be granted to the logged user, else a 0 score will |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
655 |
be returned |
634
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 __init__(self, rtype, role='subject', target_etype=None, |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
658 |
action='read', once_is_enough=False): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
659 |
super(relation_possible, self).__init__(once_is_enough) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
660 |
self.rtype = rtype |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
661 |
self.role = role |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
662 |
self.target_etype = target_etype |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
663 |
self.action = action |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
664 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
665 |
def score_class(self, eclass, req): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
666 |
eschema = eclass.e_schema |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
667 |
try: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
668 |
if self.role == 'object': |
3689
deb13e88e037
follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3650
diff
changeset
|
669 |
rschema = eschema.objrels[self.rtype] |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
670 |
else: |
3689
deb13e88e037
follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3650
diff
changeset
|
671 |
rschema = eschema.subjrels[self.rtype] |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
672 |
except KeyError: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
673 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
674 |
if self.target_etype is not None: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
675 |
try: |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
676 |
rdef = rschema.role_rdef(eschema, self.target_etype, self.role) |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
677 |
if not rdef.may_have_permission(self.action, req): |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
678 |
return 0 |
1132 | 679 |
except KeyError: |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
680 |
return 0 |
3877
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
681 |
else: |
7ca53fc72a0a
reldefsecurity branch :
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3757
diff
changeset
|
682 |
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
|
683 |
return 1 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
684 |
|
876
f652660ae9a6
use relation_possible from within has_relation, fix another bug
sylvain.thenault@logilab.fr
parents:
839
diff
changeset
|
685 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
686 |
class partial_relation_possible(PartialSelectorMixIn, relation_possible): |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
687 |
"""partial version of the relation_possible selector |
835
7dcb11dd443e
fix relation_possible, ensure we return int
sylvain.thenault@logilab.fr
parents:
833
diff
changeset
|
688 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
689 |
The selector will look for class attributes to find its missing |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
690 |
information. The list of attributes required on the class |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
691 |
for this selector are: |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
692 |
|
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
693 |
- `rtype`: same as `rtype` parameter of the `relation_possible` selector |
1474 | 694 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
695 |
- `role`: this attribute will be passed to the `cubicweb.role` function |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
696 |
to determine the role of class in the relation |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
697 |
|
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
698 |
- `etype` (optional): the entity type on the other side of the relation |
1474 | 699 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
700 |
:param action: a relation schema action (one of 'read', 'add', 'delete') |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
701 |
which must be granted to the logged user, else a 0 score will |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
702 |
be returned |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
703 |
""" |
782
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
704 |
def __init__(self, action='read', once_is_enough=False): |
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
705 |
super(partial_relation_possible, self).__init__(None, None, None, |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
706 |
action, once_is_enough) |
782
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
707 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
708 |
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
|
709 |
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
|
710 |
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
|
711 |
self.target_etype = getattr(cls, 'etype', None) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
712 |
|
835
7dcb11dd443e
fix relation_possible, ensure we return int
sylvain.thenault@logilab.fr
parents:
833
diff
changeset
|
713 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
714 |
class may_add_relation(EntitySelector): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
715 |
"""accept if the relation can be added to an entity found in the result set |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
716 |
by the logged user. |
1474 | 717 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
718 |
See `EntitySelector` documentation for behaviour when row is not specified. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
719 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
720 |
:param rtype: a relation type (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
721 |
:param role: the role of the result set entity in the relation. 'subject' or |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
722 |
'object', default to 'subject'. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
723 |
""" |
1474 | 724 |
|
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
|
725 |
def __init__(self, rtype, role='subject', target_etype=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
|
726 |
once_is_enough=False): |
770
193b7e981ea9
each subclass of EntitySelector should call its __init__ method
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
769
diff
changeset
|
727 |
super(may_add_relation, self).__init__(once_is_enough) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
728 |
self.rtype = rtype |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
729 |
self.role = role |
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
|
730 |
self.target_etype = target_etype |
1474 | 731 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
732 |
def score_entity(self, entity): |
4264
273307c54b4d
update selectors.py: change entity.schema with entity._cw.vreg.schema
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents:
4252
diff
changeset
|
733 |
rschema = entity._cw.vreg.schema.rschema(self.rtype) |
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
|
734 |
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
|
735 |
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
|
736 |
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
|
737 |
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
|
738 |
return 0 |
3378
2f25f701301d
use ._cw instead of req on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3369
diff
changeset
|
739 |
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
|
740 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
741 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
742 |
|
876
f652660ae9a6
use relation_possible from within has_relation, fix another bug
sylvain.thenault@logilab.fr
parents:
839
diff
changeset
|
743 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
744 |
class partial_may_add_relation(PartialSelectorMixIn, may_add_relation): |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
745 |
"""partial version of the may_add_relation selector |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
746 |
|
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
747 |
The selector will look for class attributes to find its missing |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
748 |
information. The list of attributes required on the class |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
749 |
for this selector are: |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
750 |
|
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
751 |
- `rtype`: same as `rtype` parameter of the `relation_possible` selector |
1474 | 752 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
753 |
- `role`: this attribute will be passed to the `cubicweb.role` function |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
754 |
to determine the role of class in the relation. |
1474 | 755 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
756 |
:param action: a relation schema action (one of 'read', 'add', 'delete') |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
757 |
which must be granted to the logged user, else a 0 score will |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
758 |
be returned |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
759 |
""" |
782
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
760 |
def __init__(self, once_is_enough=False): |
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
|
761 |
super(partial_may_add_relation, self).__init__(None, once_is_enough=once_is_enough) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
762 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
763 |
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
|
764 |
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
|
765 |
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
|
766 |
self.target_etype = getattr(cls, '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
|
767 |
|
1474 | 768 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
769 |
class has_related_entities(EntitySelector): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
770 |
"""accept if entity found in the result set has some linked entities using |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
771 |
the specified relation (optionaly filtered according to the specified target |
876
f652660ae9a6
use relation_possible from within has_relation, fix another bug
sylvain.thenault@logilab.fr
parents:
839
diff
changeset
|
772 |
type). Checks first if the relation is possible. |
1474 | 773 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
774 |
See `EntitySelector` documentation for behaviour when row is not specified. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
775 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
776 |
:param rtype: a relation type (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
777 |
:param role: the role of the result set entity in the relation. 'subject' or |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
778 |
'object', default to 'subject'. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
779 |
:param target_type: if specified, check the relation's end may be of this |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
780 |
target type (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
781 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
782 |
def __init__(self, rtype, role='subject', target_etype=None, |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
783 |
once_is_enough=False): |
770
193b7e981ea9
each subclass of EntitySelector should call its __init__ method
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
769
diff
changeset
|
784 |
super(has_related_entities, self).__init__(once_is_enough) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
785 |
self.rtype = rtype |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
786 |
self.role = role |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
787 |
self.target_etype = target_etype |
1474 | 788 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
789 |
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
|
790 |
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
|
791 |
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
|
792 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
793 |
rset = entity.related(self.rtype, self.role) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
794 |
if self.target_etype: |
1011
22812cfe36b4
fix w/ rset with more than one column
sylvain.thenault@logilab.fr
parents:
876
diff
changeset
|
795 |
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
|
796 |
return rset and 1 or 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
797 |
|
833
8c6bfd9158fb
bw compat for selection for creation forms
sylvain.thenault@logilab.fr
parents:
828
diff
changeset
|
798 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
799 |
class partial_has_related_entities(PartialSelectorMixIn, has_related_entities): |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
800 |
"""partial version of the has_related_entities selector |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
801 |
|
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
802 |
The selector will look for class attributes to find its missing |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
803 |
information. The list of attributes required on the class |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
804 |
for this selector are: |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
805 |
|
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
806 |
- `rtype`: same as `rtype` parameter of the `relation_possible` selector |
1474 | 807 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
808 |
- `role`: this attribute will be passed to the `cubicweb.role` function |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
809 |
to determine the role of class in the relation. |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
810 |
|
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
811 |
- `etype` (optional): the entity type on the other side of the relation |
1474 | 812 |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
813 |
:param action: a relation schema action (one of 'read', 'add', 'delete') |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
814 |
which must be granted to the logged user, else a 0 score will |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
815 |
be returned |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
816 |
""" |
782
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
817 |
def __init__(self, once_is_enough=False): |
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
818 |
super(partial_has_related_entities, self).__init__(None, None, |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
819 |
None, once_is_enough) |
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
835
diff
changeset
|
820 |
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
|
821 |
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
|
822 |
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
|
823 |
self.target_etype = getattr(cls, 'etype', None) |
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
824 |
|
01801a10c567
introduce abstract selectors to get rid of the my_selector() contagion
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
774
diff
changeset
|
825 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
826 |
class has_permission(EntitySelector): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
827 |
"""accept if user has the permission to do the requested action on a result |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
828 |
set entity. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
829 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
830 |
* if row is specified, return 1 if user has the permission on the entity |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
831 |
instance found in the specified cell |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
832 |
* else return a positive score if user has the permission for every entity |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
833 |
in the found in the specified column |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
834 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
835 |
note: None values (resulting from some outer join in the query) are not |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
836 |
considered. |
1474 | 837 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
838 |
:param action: an entity schema action (eg 'read'/'add'/'delete'/'update') |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
839 |
""" |
770
193b7e981ea9
each subclass of EntitySelector should call its __init__ method
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
769
diff
changeset
|
840 |
def __init__(self, action, once_is_enough=False): |
193b7e981ea9
each subclass of EntitySelector should call its __init__ method
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
769
diff
changeset
|
841 |
super(has_permission, self).__init__(once_is_enough) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
842 |
self.action = action |
1474 | 843 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
844 |
@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
|
845 |
def __call__(self, cls, req, rset=None, row=None, col=0, **kwargs): |
788 | 846 |
if rset is None: |
847 |
return 0 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
848 |
user = req.user |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
849 |
action = self.action |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
850 |
if row is None: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
851 |
score = 0 |
1474 | 852 |
need_local_check = [] |
2816
85f7502d32be
access schema through req.vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2797
diff
changeset
|
853 |
geteschema = req.vreg.schema.eschema |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
854 |
for etype in rset.column_types(0): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
855 |
if etype in BASE_TYPES: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
856 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
857 |
eschema = geteschema(etype) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
858 |
if not user.matching_groups(eschema.get_groups(action)): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
859 |
if eschema.has_local_role(action): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
860 |
# have to ckeck local roles |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
861 |
need_local_check.append(eschema) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
862 |
continue |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
863 |
else: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
864 |
# even a local role won't be enough |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
865 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
866 |
score += 1 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
867 |
if need_local_check: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
868 |
# check local role for entities of necessary types |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
869 |
for i, row in enumerate(rset): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
870 |
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
|
871 |
continue |
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
872 |
if not self.score(req, rset, i, col): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
873 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
874 |
score += 1 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
875 |
return score |
876
f652660ae9a6
use relation_possible from within has_relation, fix another bug
sylvain.thenault@logilab.fr
parents:
839
diff
changeset
|
876 |
return self.score(req, rset, row, col) |
1474 | 877 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
878 |
def score_entity(self, entity): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
879 |
if entity.has_perm(self.action): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
880 |
return 1 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
881 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
882 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
883 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
884 |
class has_add_permission(EClassSelector): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
885 |
"""accept if logged user has the add permission on entity class found in the |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
886 |
result set, and class is not a strict subobject. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
887 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
888 |
See `EClassSelector` documentation for behaviour when row is not specified. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
889 |
""" |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
890 |
def score(self, cls, req, etype): |
2816
85f7502d32be
access schema through req.vreg
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2797
diff
changeset
|
891 |
eschema = req.vreg.schema.eschema(etype) |
3689
deb13e88e037
follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3650
diff
changeset
|
892 |
if not (eschema.final or eschema.is_subobject(strict=True)) \ |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
893 |
and eschema.has_perm(req, 'add'): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
894 |
return 1 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
895 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
896 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
897 |
|
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
898 |
class rql_condition(EntitySelector): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
899 |
"""accept if an arbitrary rql return some results for an eid found in the |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
900 |
result set. Returned score is the number of items returned by the rql |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
901 |
condition. |
1474 | 902 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
903 |
See `EntitySelector` documentation for behaviour when row is not specified. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
904 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
905 |
:param expression: basestring containing an rql expression, which should use |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
906 |
X variable to represent the context entity and may use U |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
907 |
to represent the logged user |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
908 |
|
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
909 |
return the sum of the number of items returned by the rql condition as score |
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
910 |
or 0 at the first entity scoring to zero. |
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
911 |
""" |
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
912 |
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
|
913 |
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
|
914 |
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
|
915 |
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
|
916 |
else: |
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
917 |
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
|
918 |
self.rql = rql |
1474 | 919 |
|
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
920 |
def score(self, req, rset, row, col): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
921 |
try: |
764 | 922 |
return len(req.execute(self.rql, {'x': rset[row][col], |
923 |
'u': req.user.eid}, 'x')) |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
924 |
except Unauthorized: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
925 |
return 0 |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
926 |
|
1887
7e19c94ce0d7
[selectors] provide a nicer representation of rql_condition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1784
diff
changeset
|
927 |
def __repr__(self): |
7e19c94ce0d7
[selectors] provide a nicer representation of rql_condition
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1784
diff
changeset
|
928 |
return u'<rql_condition "%s" at %x>' % (self.rql, id(self)) |
1474 | 929 |
|
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
|
930 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
931 |
class score_entity(EntitySelector): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
932 |
"""accept if some arbitrary function return a positive score for an entity |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
933 |
found in the result set. |
1474 | 934 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
935 |
See `EntitySelector` documentation for behaviour when row is not specified. |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
936 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
937 |
:param scorefunc: callable expected to take an entity as argument and to |
1474 | 938 |
return a score >= 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
939 |
""" |
764 | 940 |
def __init__(self, scorefunc, once_is_enough=False): |
1138
22f634977c95
make pylint happy, fix some bugs on the way
sylvain.thenault@logilab.fr
parents:
1132
diff
changeset
|
941 |
super(score_entity, self).__init__(once_is_enough) |
3276
4480887772a3
[selectors] score_entity selector now ensures an int score is returned
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2972
diff
changeset
|
942 |
def intscore(*args, **kwargs): |
4480887772a3
[selectors] score_entity selector now ensures an int score is returned
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2972
diff
changeset
|
943 |
score = scorefunc(*args, **kwargs) |
4480887772a3
[selectors] score_entity selector now ensures an int score is returned
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2972
diff
changeset
|
944 |
if not score: |
4480887772a3
[selectors] score_entity selector now ensures an int score is returned
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2972
diff
changeset
|
945 |
return 0 |
4480887772a3
[selectors] score_entity selector now ensures an int score is returned
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2972
diff
changeset
|
946 |
if isinstance(score, (int, long)): |
4480887772a3
[selectors] score_entity selector now ensures an int score is returned
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2972
diff
changeset
|
947 |
return score |
4480887772a3
[selectors] score_entity selector now ensures an int score is returned
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2972
diff
changeset
|
948 |
return 1 |
4480887772a3
[selectors] score_entity selector now ensures an int score is returned
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2972
diff
changeset
|
949 |
self.score_entity = intscore |
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
950 |
|
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
951 |
## deprecated stuff ############################################################ |
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
952 |
|
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
953 |
entity_implements = class_renamed('entity_implements', implements) |
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
954 |
|
4081
64548076add4
avoid infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4071
diff
changeset
|
955 |
class _but_etype(EntitySelector): |
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
956 |
"""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
|
957 |
|
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
958 |
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
|
959 |
|
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
960 |
: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
|
961 |
""" |
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
962 |
def __init__(self, *etypes): |
4102
5ba6df5fcb07
missing underscore leads to infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4081
diff
changeset
|
963 |
super(_but_etype, self).__init__() |
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
964 |
self.but_etypes = etypes |
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
965 |
|
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
966 |
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
|
967 |
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
|
968 |
return 0 |
4071
e19e586cc74e
deprecates entity_implements / but_etype selectors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4026
diff
changeset
|
969 |
return 1 |
2972
23418c13e024
Backed out changeset d83f5d96e1d7
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2970
diff
changeset
|
970 |
|
4081
64548076add4
avoid infinite recursion error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4071
diff
changeset
|
971 |
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
|
972 |
|
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
|
973 |
|
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
|
974 |
# 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
|
975 |
# 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
|
976 |
# 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
|
977 |
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
|
978 |
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
|
979 |
two_etypes_rset = class_renamed('two_etypes_rset', multi_etypes_rset) |