author | sylvain.thenault@logilab.fr |
Wed, 18 Feb 2009 11:46:03 +0100 | |
branch | tls-sprint |
changeset 772 | 97b2b582e7f7 |
parent 770 | 193b7e981ea9 |
child 774 | 48cb1f42e79c |
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 = () |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
36 |
|
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 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
39 |
:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
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 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
41 |
""" |
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 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
46 |
from warnings import warn |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
47 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
48 |
from logilab.common.compat import all |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
49 |
from logilab.common.deprecation import deprecated_function |
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 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
54 |
from cubicweb import Unauthorized, NoSelectableObject, role |
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
55 |
from cubicweb.vregistry import (NoSelectableObject, Selector, |
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
56 |
chainall, chainfirst, objectify_selector) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
57 |
from cubicweb.cwvreg import DummyCursorError |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
58 |
from cubicweb.cwconfig import CubicWebConfiguration |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
59 |
from cubicweb.schema import split_expression |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
60 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
61 |
# helpers for debugging selectors |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
62 |
SELECTOR_LOGGER = logging.getLogger('cubicweb.selectors') |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
63 |
TRACED_OIDS = () |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
64 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
65 |
def lltrace(selector): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
66 |
# don't wrap selectors if not in development mode |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
67 |
if CubicWebConfiguration.mode == 'installed': |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
68 |
return selector |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
69 |
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
|
70 |
# /!\ 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
|
71 |
# 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
|
72 |
if isinstance(cls, Selector): |
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
73 |
selname = cls.__class__.__name__ |
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
74 |
vobj = args[0] |
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
75 |
else: |
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
76 |
selname = selector.__name__ |
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
77 |
vobj = cls |
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
78 |
oid = vobj.id |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
79 |
ret = selector(cls, *args, **kwargs) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
80 |
if TRACED_OIDS == 'all' or oid in TRACED_OIDS: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
81 |
#SELECTOR_LOGGER.warning('selector %s returned %s for %s', selname, ret, cls) |
752
c0506c4a1e6c
fix lltrace to consider __call__ and pure functions decoration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
737
diff
changeset
|
82 |
print 'selector %s returned %s for %s' % (selname, ret, vobj) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
83 |
return ret |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
84 |
traced.__name__ = selector.__name__ |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
85 |
return traced |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
86 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
87 |
class traced_selection(object): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
88 |
"""selector debugging helper. |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
89 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
90 |
Typical usage is : |
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 |
>>> with traced_selection(): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
93 |
... # some code in which you want to debug selectors |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
94 |
... # for all objects |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
95 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
96 |
or |
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 |
>>> with traced_selection( ('oid1', 'oid2') ): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
99 |
... # some code in which you want to debug selectors |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
100 |
... # for objects with id 'oid1' and 'oid2' |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
101 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
102 |
""" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
103 |
def __init__(self, traced='all'): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
104 |
self.traced = traced |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
105 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
106 |
def __enter__(self): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
107 |
global TRACED_OIDS |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
108 |
TRACED_OIDS = self.traced |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
109 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
110 |
def __exit__(self, exctype, exc, traceback): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
111 |
global TRACED_OIDS |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
112 |
TRACED_OIDS = () |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
113 |
return traceback is None |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
114 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
115 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
116 |
# abstract selectors ########################################################## |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
117 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
118 |
class EClassSelector(Selector): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
119 |
"""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
|
120 |
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
|
121 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
122 |
* if row is specified, return the score returned by the score_class method |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
123 |
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
|
124 |
* 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
|
125 |
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
|
126 |
- `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
|
127 |
returned |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
128 |
- `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
|
129 |
returned |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
130 |
""" |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
131 |
def __init__(self, once_is_enough=False): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
132 |
self.once_is_enough = once_is_enough |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
133 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
134 |
@lltrace |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
135 |
def __call__(self, cls, req, rset, row=None, col=0, **kwargs): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
136 |
if not rset: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
137 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
138 |
score = 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
139 |
if row is None: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
140 |
for etype in rset.column_types(col): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
141 |
if etype is None: # outer join |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
142 |
continue |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
143 |
escore = self.score(cls, req, etype) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
144 |
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
|
145 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
146 |
elif self.once_is_enough: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
147 |
return escore |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
148 |
score += escore |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
149 |
else: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
150 |
etype = rset.description[row][col] |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
151 |
if etype is not None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
152 |
score = self.score(cls, req, etype) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
153 |
return score and (score + 1) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
154 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
155 |
def score(self, cls, req, etype): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
156 |
if etype in BASE_TYPES: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
157 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
158 |
return self.score_class(cls.vreg.etype_class(etype), req) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
159 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
160 |
def score_class(self, eclass, req): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
161 |
raise NotImplementedError() |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
162 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
163 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
164 |
class EntitySelector(EClassSelector): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
165 |
"""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
|
166 |
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
|
167 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
168 |
* 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
|
169 |
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
|
170 |
* 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
|
171 |
entity found in the specified column, unless: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
172 |
- `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
|
173 |
returned |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
174 |
- `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
|
175 |
returned |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
176 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
177 |
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
|
178 |
considered. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
179 |
""" |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
180 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
181 |
@lltrace |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
182 |
def __call__(self, cls, req, rset, row=None, col=0, **kwargs): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
183 |
if not rset: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
184 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
185 |
score = 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
186 |
if row is None: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
187 |
for row, rowvalue in enumerate(rset.rows): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
188 |
if rowvalue[col] is None: # outer join |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
189 |
continue |
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
190 |
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
|
191 |
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
|
192 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
193 |
elif self.once_is_enough: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
194 |
return escore |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
195 |
score += escore |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
196 |
else: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
197 |
etype = rset.description[row][col] |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
198 |
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
|
199 |
score = self.score(req, rset, row, col) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
200 |
return score and (score + 1) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
201 |
|
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
202 |
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
|
203 |
try: |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
204 |
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
|
205 |
except NotAnEntity: |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
206 |
return 0 |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
207 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
208 |
def score_entity(self, entity): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
209 |
raise NotImplementedError() |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
210 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
211 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
212 |
# very basic selectors ######################################################## |
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
213 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
214 |
def yes(cls, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
215 |
"""accept everything""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
216 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
217 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
218 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
219 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
220 |
def none_rset(cls, req, rset, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
221 |
"""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
|
222 |
if rset is None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
223 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
224 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
225 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
226 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
227 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
228 |
def any_rset(cls, req, rset, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
229 |
"""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
|
230 |
if rset is not None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
231 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
232 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
233 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
234 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
235 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
236 |
def nonempty_rset(cls, req, rset, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
237 |
"""accept any non empty result set""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
238 |
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
|
239 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
240 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
241 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
242 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
243 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
244 |
def empty_rset(cls, req, rset, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
245 |
"""accept empty result set""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
246 |
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
|
247 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
248 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
249 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
250 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
251 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
252 |
def one_line_rset(cls, req, rset, row=None, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
253 |
"""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
|
254 |
else accepts anyway |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
255 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
256 |
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
|
257 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
258 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
259 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
260 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
261 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
262 |
def two_lines_rset(cls, req, rset, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
263 |
"""accept result set with *at least* two lines of result""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
264 |
if rset is not None and rset.rowcount > 1: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
265 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
266 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
267 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
268 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
269 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
270 |
def two_cols_rset(cls, req, rset, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
271 |
"""accept result set with at least one line and two columns of result""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
272 |
if rset is not None and rset.rowcount and len(rset.rows[0]) > 1: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
273 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
274 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
275 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
276 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
277 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
278 |
def paginated_rset(cls, req, rset, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
279 |
"""accept result set with more lines than the page size. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
280 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
281 |
Page size is searched in (respecting order): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
282 |
* a page_size argument |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
283 |
* a page_size form parameters |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
284 |
* the navigation.page-size property |
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 |
page_size = kwargs.get('page_size') |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
287 |
if page_size is None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
288 |
page_size = req.form.get('page_size') |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
289 |
if page_size is None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
290 |
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
|
291 |
else: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
292 |
page_size = int(page_size) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
293 |
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
|
294 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
295 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
296 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
297 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
298 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
299 |
def sorted_rset(cls, req, rset, row=None, col=0, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
300 |
"""accept sorted result set""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
301 |
rqlst = rset.syntax_tree() |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
302 |
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
|
303 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
304 |
return 2 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
305 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
306 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
307 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
308 |
def one_etype_rset(cls, req, rset, row=None, col=0, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
309 |
"""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
|
310 |
of the same type |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
311 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
312 |
if len(rset.column_types(col)) != 1: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
313 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
314 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
315 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
316 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
317 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
318 |
def two_etypes_rset(cls, req, rset, row=None, col=0, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
319 |
"""accept result set where entities in the specified column (or 0) are not |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
320 |
of the same type |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
321 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
322 |
if rset: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
323 |
etypes = rset.column_types(col) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
324 |
if len(etypes) > 1: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
325 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
326 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
327 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
328 |
class non_final_entity(EClassSelector): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
329 |
"""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
|
330 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
331 |
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
|
332 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
333 |
def score(self, cls, req, etype): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
334 |
if etype in BASE_TYPES: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
335 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
336 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
337 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
338 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
339 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
340 |
def anonymous_user(cls, req, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
341 |
"""accept if user is anonymous""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
342 |
if req.cnx.anonymous_connection: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
343 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
344 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
345 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
346 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
347 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
348 |
def authenticated_user(cls, req, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
349 |
"""accept if user is authenticated""" |
759
e044f28372bd
chainall / chainfirst ensures selectors are instantiated
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
752
diff
changeset
|
350 |
return not anonymous_user()(cls, req, *args, **kwargs) |
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 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
354 |
def primary_view(cls, req, rset, row=None, col=0, view=None, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
355 |
"""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
|
356 |
is given |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
357 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
358 |
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
|
359 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
360 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
361 |
|
697
06807984e610
provide objectify_selector decorator for very simple selectors
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
696
diff
changeset
|
362 |
@objectify_selector |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
363 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
364 |
def match_context_prop(cls, req, rset, row=None, col=0, context=None, |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
365 |
**kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
366 |
"""accept if: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
367 |
* no context given |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
368 |
* 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
|
369 |
given cls |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
370 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
371 |
propval = req.property_value('%s.%s.context' % (cls.__registry__, cls.id)) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
372 |
if not propval: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
373 |
propval = cls.context |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
374 |
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
|
375 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
376 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
377 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
378 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
379 |
class match_search_state(Selector): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
380 |
"""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
|
381 |
states given to the initializer |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
382 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
383 |
: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
|
384 |
object to create a relation with another) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
385 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
386 |
def __init__(self, *expected): |
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
387 |
assert expected |
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
388 |
self.expected = frozenset(expected) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
389 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
390 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
391 |
def __call__(self, cls, req, rset, row=None, col=0, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
392 |
try: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
393 |
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
|
394 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
395 |
except AttributeError: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
396 |
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
|
397 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
398 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
399 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
400 |
class match_form_params(match_search_state): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
401 |
"""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
|
402 |
in request's form parameters |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
403 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
404 |
: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
|
405 |
found in request's form parameters |
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 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
408 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
409 |
def __call__(self, cls, req, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
410 |
score = 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
411 |
for param in self.expected: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
412 |
val = req.form.get(param) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
413 |
if not val: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
414 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
415 |
score += 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
416 |
return len(self.expected) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
417 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
418 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
419 |
class match_kwargs(match_search_state): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
420 |
"""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
|
421 |
in named arguments given to the selector |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
422 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
423 |
: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
|
424 |
found in named arguments (kwargs) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
425 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
426 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
427 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
428 |
def __call__(self, cls, req, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
429 |
for arg in self.expected: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
430 |
if not arg in kwargs: |
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 len(self.expected) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
433 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
434 |
|
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
435 |
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
|
436 |
"""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
|
437 |
score is the number of groups in which the user is. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
438 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
439 |
If the special 'owners' group is given: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
440 |
* 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
|
441 |
logged user |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
442 |
* 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
|
443 |
user |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
444 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
445 |
: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
|
446 |
user should be |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
447 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
448 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
449 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
450 |
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
|
451 |
user = req.user |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
452 |
if user is None: |
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
453 |
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
|
454 |
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
|
455 |
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
|
456 |
if row is not None: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
457 |
if not user.owns(rset[row][col]): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
458 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
459 |
score = 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
460 |
else: |
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
461 |
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
|
462 |
return score |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
463 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
464 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
465 |
class appobject_selectable(Selector): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
466 |
"""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
|
467 |
context. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
468 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
469 |
:param registry: a registry name (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
470 |
:param oid: an object identifier (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
471 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
472 |
def __init__(self, registry, oid): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
473 |
self.registry = registry |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
474 |
self.oid = oid |
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 |
def __call__(self, cls, req, rset, *args, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
477 |
try: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
478 |
cls.vreg.select_object(self.registry, self.oid, req, rset, *args, **kwargs) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
479 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
480 |
except NoSelectableObject: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
481 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
482 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
483 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
484 |
# not so basic selectors ###################################################### |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
485 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
486 |
class implements(EClassSelector): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
487 |
"""accept if entity class found in the result set implements at least one |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
488 |
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
|
489 |
implemented interfaces. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
490 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
491 |
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
|
492 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
493 |
: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
|
494 |
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
|
495 |
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
|
496 |
registry (at selection time) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
497 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
498 |
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
|
499 |
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
|
500 |
""" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
501 |
def __init__(self, *expected_ifaces): |
689 | 502 |
super(implements, self).__init__() |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
503 |
self.expected_ifaces = expected_ifaces |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
504 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
505 |
def score_class(self, eclass, req): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
506 |
score = 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
507 |
for iface in self.expected_ifaces: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
508 |
if isinstance(iface, basestring): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
509 |
# entity type |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
510 |
iface = eclass.vreg.etype_class(iface) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
511 |
if implements_iface(eclass, iface): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
512 |
score += 1 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
513 |
if getattr(iface, '__registry__', None) == 'etypes': |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
514 |
score += 1 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
515 |
# adjust score if the interface is an entity class |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
516 |
if iface is eclass: |
769
2b49c9932d8c
fix score computation in implements()
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
766
diff
changeset
|
517 |
score += (len(eclass.e_schema.ancestors()) + 1) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
518 |
# print 'is majoration', len(eclass.e_schema.ancestors()) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
519 |
else: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
520 |
parents = [e.type for e in eclass.e_schema.ancestors()] |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
521 |
for index, etype in enumerate(reversed(parents)): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
522 |
basecls = eclass.vreg.etype_class(etype) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
523 |
if iface is basecls: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
524 |
score += index |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
525 |
# print 'etype majoration', index |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
526 |
break |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
527 |
return score |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
528 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
529 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
530 |
class specified_etype_implements(implements): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
531 |
"""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
|
532 |
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
|
533 |
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
|
534 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
535 |
: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
|
536 |
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
|
537 |
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
|
538 |
registry (at selection time) |
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 |
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
|
541 |
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
|
542 |
""" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
543 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
544 |
@lltrace |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
545 |
def __call__(cls, req, *args, **kwargs): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
546 |
try: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
547 |
etype = req.form['etype'] |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
548 |
except KeyError: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
549 |
try: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
550 |
etype = kwargs['etype'] |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
551 |
except KeyError: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
552 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
553 |
return self.score_class(cls.vreg.etype_class(etype), req) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
554 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
555 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
556 |
class relation_possible(EClassSelector): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
557 |
"""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
|
558 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
559 |
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
|
560 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
561 |
:param rtype: a relation type (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
562 |
: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
|
563 |
'object', default to 'subject'. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
564 |
: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
|
565 |
target type (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
566 |
: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
|
567 |
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
|
568 |
be returned |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
569 |
""" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
570 |
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
|
571 |
action='read', once_is_enough=False): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
572 |
super(relation_possible, self).__init__(once_is_enough) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
573 |
self.rtype = rtype |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
574 |
self.role = role |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
575 |
self.target_etype = target_etype |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
576 |
self.action = action |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
577 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
578 |
@lltrace |
657
fd019f41aa2f
work in progress - fix deprecation of EntityAction - fix various selectors bugs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
656
diff
changeset
|
579 |
def __call__(self, cls, req, *args, **kwargs): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
580 |
rschema = cls.schema.rschema(self.rtype) |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
581 |
if not (rschema.has_perm(req, self.action) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
582 |
or rschema.has_local_role(self.action)): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
583 |
return 0 |
657
fd019f41aa2f
work in progress - fix deprecation of EntityAction - fix various selectors bugs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
656
diff
changeset
|
584 |
return super(relation_possible, self).__call__(cls, req, *args, **kwargs) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
585 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
586 |
def score_class(self, eclass, req): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
587 |
eschema = eclass.e_schema |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
588 |
try: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
589 |
if self.role == 'object': |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
590 |
rschema = eschema.object_relation(self.rtype) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
591 |
else: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
592 |
rschema = eschema.subject_relation(self.rtype) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
593 |
except KeyError: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
594 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
595 |
if self.target_etype is not None: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
596 |
try: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
597 |
if self.role == 'object': |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
598 |
return self.target_etype in rschema.objects(eschema) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
599 |
else: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
600 |
return self.target_etype in rschema.subjects(eschema) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
601 |
except KeyError, ex: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
602 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
603 |
return 1 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
604 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
605 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
606 |
class has_editable_relation(EntitySelector): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
607 |
"""accept if some relations for an entity found in the result set is |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
608 |
editable by the logged user. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
609 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
610 |
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
|
611 |
""" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
612 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
613 |
def score_entity(self, entity): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
614 |
# if user has no update right but it can modify some relation, |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
615 |
# display action anyway |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
616 |
for dummy in entity.srelations_by_category(('generic', 'metadata'), |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
617 |
'add'): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
618 |
return 1 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
619 |
for rschema, targetschemas, role in entity.relations_by_category( |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
620 |
('primary', 'secondary'), 'add'): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
621 |
if not rschema.is_final(): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
622 |
return 1 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
623 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
624 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
625 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
626 |
class may_add_relation(EntitySelector): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
627 |
"""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
|
628 |
by the logged user. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
629 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
630 |
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
|
631 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
632 |
:param rtype: a relation type (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
633 |
: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
|
634 |
'object', default to 'subject'. |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
635 |
""" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
636 |
|
770
193b7e981ea9
each subclass of EntitySelector should call its __init__ method
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
769
diff
changeset
|
637 |
def __init__(self, rtype, role='subject', 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
|
638 |
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
|
639 |
self.rtype = rtype |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
640 |
self.role = role |
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 |
def score_entity(self, entity): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
643 |
rschema = entity.schema.rschema(self.rtype) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
644 |
if self.role == 'subject': |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
645 |
if not rschema.has_perm(req, 'add', fromeid=entity.eid): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
646 |
return 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
647 |
elif not rschema.has_perm(req, 'add', toeid=entity.eid): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
648 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
649 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
650 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
651 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
652 |
class has_related_entities(EntitySelector): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
653 |
"""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
|
654 |
the specified relation (optionaly filtered according to the specified target |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
655 |
type). |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
656 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
657 |
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
|
658 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
659 |
:param rtype: a relation type (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
660 |
: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
|
661 |
'object', default to 'subject'. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
662 |
: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
|
663 |
target type (`basestring`) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
664 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
665 |
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
|
666 |
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
|
667 |
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
|
668 |
self.rtype = rtype |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
669 |
self.role = role |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
670 |
self.target_etype = target_etype |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
671 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
672 |
def score_entity(self, entity): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
673 |
rset = entity.related(self.rtype, self.role) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
674 |
if self.target_etype: |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
675 |
return any(x for x, in rset.description if x == self.target_etype) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
676 |
return bool(rset) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
677 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
678 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
679 |
class has_permission(EntitySelector): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
680 |
"""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
|
681 |
set entity. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
682 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
683 |
* 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
|
684 |
instance found in the specified cell |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
685 |
* 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
|
686 |
in the found in the specified column |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
687 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
688 |
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
|
689 |
considered. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
690 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
691 |
: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
|
692 |
""" |
770
193b7e981ea9
each subclass of EntitySelector should call its __init__ method
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
769
diff
changeset
|
693 |
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
|
694 |
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
|
695 |
self.action = action |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
696 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
697 |
@lltrace |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
698 |
def __call__(self, cls, req, rset, row=None, col=0, **kwargs): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
699 |
user = req.user |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
700 |
action = self.action |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
701 |
if row is None: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
702 |
score = 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
703 |
need_local_check = [] |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
704 |
geteschema = cls.schema.eschema |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
705 |
for etype in rset.column_types(0): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
706 |
if etype in BASE_TYPES: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
707 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
708 |
eschema = geteschema(etype) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
709 |
if not user.matching_groups(eschema.get_groups(action)): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
710 |
if eschema.has_local_role(action): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
711 |
# have to ckeck local roles |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
712 |
need_local_check.append(eschema) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
713 |
continue |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
714 |
else: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
715 |
# even a local role won't be enough |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
716 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
717 |
score += 1 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
718 |
if need_local_check: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
719 |
# check local role for entities of necessary types |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
720 |
for i, row in enumerate(rset): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
721 |
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
|
722 |
continue |
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
723 |
if not self.score(req, rset, i, col): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
724 |
return 0 |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
725 |
score += 1 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
726 |
return score |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
727 |
return self.score(req, rset, i, col) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
728 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
729 |
def score_entity(self, entity): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
730 |
if entity.has_perm(self.action): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
731 |
return 1 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
732 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
733 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
734 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
735 |
class has_add_permission(EClassSelector): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
736 |
"""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
|
737 |
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
|
738 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
739 |
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
|
740 |
""" |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
741 |
def score(self, cls, req, etype): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
742 |
eschema = cls.schema.eschema(etype) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
743 |
if not (eschema.is_final() or eschema.is_subobject(strict=True)) \ |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
744 |
and eschema.has_perm(req, 'add'): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
745 |
return 1 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
746 |
return 0 |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
747 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
748 |
|
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
749 |
class rql_condition(EntitySelector): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
750 |
"""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
|
751 |
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
|
752 |
condition. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
753 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
754 |
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
|
755 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
756 |
: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
|
757 |
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
|
758 |
to represent the logged user |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
759 |
|
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
760 |
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
|
761 |
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
|
762 |
""" |
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
763 |
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
|
764 |
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
|
765 |
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
|
766 |
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
|
767 |
else: |
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
768 |
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
|
769 |
self.rql = rql |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
770 |
|
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
771 |
def score(self, req, rset, row, col): |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
772 |
try: |
764 | 773 |
return len(req.execute(self.rql, {'x': rset[row][col], |
774 |
'u': req.user.eid}, 'x')) |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
775 |
except Unauthorized: |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
776 |
return 0 |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
777 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
778 |
|
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
779 |
class but_etype(EntitySelector): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
780 |
"""accept if the given entity types are not found in the result set. |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
781 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
782 |
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
|
783 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
784 |
:param *etypes: entity types (`basestring`) which should be refused |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
785 |
""" |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
786 |
def __init__(self, *etypes): |
770
193b7e981ea9
each subclass of EntitySelector should call its __init__ method
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
769
diff
changeset
|
787 |
super(but_etype, self).__init__() |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
788 |
self.but_etypes = etypes |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
789 |
|
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
790 |
def score(self, req, rset, row, col): |
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
791 |
if rset.description[row][col] in self.but_etypes: |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
792 |
return 0 |
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
793 |
return 1 |
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
794 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
795 |
|
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
796 |
class score_entity(EntitySelector): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
797 |
"""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
|
798 |
found in the result set. |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
799 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
800 |
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
|
801 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
802 |
:param scorefunc: callable expected to take an entity as argument and to |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
803 |
return a score >= 0 |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
804 |
""" |
764 | 805 |
def __init__(self, scorefunc, once_is_enough=False): |
806 |
super(EntitySelector, self).__init__(once_is_enough) |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
807 |
self.score_entity = scorefunc |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
808 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
809 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
810 |
# XXX DEPRECATED ############################################################## |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
811 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
812 |
yes_selector = deprecated_function(yes) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
813 |
norset_selector = deprecated_function(none_rset) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
814 |
rset_selector = deprecated_function(any_rset) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
815 |
anyrset_selector = deprecated_function(nonempty_rset) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
816 |
emptyrset_selector = deprecated_function(empty_rset) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
817 |
onelinerset_selector = deprecated_function(one_line_rset) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
818 |
twolinerset_selector = deprecated_function(two_lines_rset) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
819 |
twocolrset_selector = deprecated_function(two_cols_rset) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
820 |
largerset_selector = deprecated_function(paginated_rset) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
821 |
sortedrset_selector = deprecated_function(sorted_rset) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
822 |
oneetyperset_selector = deprecated_function(one_etype_rset) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
823 |
multitype_selector = deprecated_function(two_etypes_rset) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
824 |
anonymous_selector = deprecated_function(anonymous_user) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
825 |
not_anonymous_selector = deprecated_function(authenticated_user) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
826 |
primaryview_selector = deprecated_function(primary_view) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
827 |
contextprop_selector = deprecated_function(match_context_prop) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
828 |
|
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
829 |
def nfentity_selector(cls, req, rset, row=None, col=0, **kwargs): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
830 |
return non_final_entity()(cls, req, rset, row, col) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
831 |
nfentity_selector = deprecated_function(nfentity_selector) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
832 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
833 |
def implement_interface(cls, req, rset, row=None, col=0, **kwargs): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
834 |
return implements(*cls.accepts_interfaces)(cls, req, rset, row, col) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
835 |
_interface_selector = deprecated_function(implement_interface) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
836 |
interface_selector = deprecated_function(implement_interface) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
837 |
implement_interface = deprecated_function(implement_interface, 'use implements') |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
838 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
839 |
def accept_etype(cls, req, *args, **kwargs): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
840 |
"""check etype presence in request form *and* accepts conformance""" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
841 |
return specified_etype_implements(*cls.accepts)(cls, req, *args) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
842 |
etype_form_selector = deprecated_function(accept_etype) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
843 |
accept_etype = deprecated_function(accept_etype, 'use specified_etype_implements') |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
844 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
845 |
def searchstate_selector(cls, req, rset, row=None, col=0, **kwargs): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
846 |
return match_search_state(cls.search_states)(cls, req, rset, row, col) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
847 |
searchstate_selector = deprecated_function(searchstate_selector) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
848 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
849 |
def match_user_group(cls, req, rset=None, row=None, col=0, **kwargs): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
850 |
return match_user_groups(*cls.require_groups)(cls, req, rset, row, col, **kwargs) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
851 |
in_group_selector = deprecated_function(match_user_group) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
852 |
match_user_group = deprecated_function(match_user_group) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
853 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
854 |
def has_relation(cls, req, rset, row=None, col=0, **kwargs): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
855 |
return relation_possible(cls.rtype, role(cls), cls.etype, |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
856 |
getattr(cls, 'require_permission', 'read'))(cls, req, rset, row, col, **kwargs) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
857 |
has_relation = deprecated_function(has_relation) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
858 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
859 |
def one_has_relation(cls, req, rset, row=None, col=0, **kwargs): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
860 |
return relation_possible(cls.rtype, role(cls), cls.etype, |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
861 |
getattr(cls, 'require_permission', 'read', |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
862 |
once_is_enough=True))(cls, req, rset, row, col, **kwargs) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
863 |
one_has_relation = deprecated_function(one_has_relation, 'use relation_possible selector') |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
864 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
865 |
def accept_rset(cls, req, rset, row=None, col=0, **kwargs): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
866 |
"""simply delegate to cls.accept_rset method""" |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
867 |
return implements(*cls.accepts)(cls, req, rset, row=row, col=col) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
868 |
accept_rset_selector = deprecated_function(accept_rset) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
869 |
accept_rset = deprecated_function(accept_rset, 'use implements selector') |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
870 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
871 |
accept = chainall(non_final_entity(), accept_rset, name='accept') |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
872 |
accept_selector = deprecated_function(accept) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
873 |
accept = deprecated_function(accept, 'use implements selector') |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
874 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
875 |
accept_one = deprecated_function(chainall(one_line_rset, accept, |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
876 |
name='accept_one')) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
877 |
accept_one_selector = deprecated_function(accept_one) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
878 |
|
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
879 |
|
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
880 |
def _rql_condition(cls, req, rset, row=None, col=0, **kwargs): |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
881 |
if cls.condition: |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
882 |
return rql_condition(cls.condition)(cls, req, rset, row, col) |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
883 |
return 1 |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
884 |
_rqlcondition_selector = deprecated_function(_rql_condition) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
885 |
|
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
886 |
rqlcondition_selector = deprecated_function(chainall(non_final_entity(), one_line_rset, _rql_condition, |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
887 |
name='rql_condition')) |
649
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
888 |
|
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
889 |
def but_etype_selector(cls, req, rset, row=None, col=0, **kwargs): |
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
890 |
return but_etype(cls.etype)(cls, req, rset, row, col) |
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
891 |
but_etype_selector = deprecated_function(but_etype_selector) |
e5956e9ebef1
more doc, upgrade but_etype and appobject_selectable selectors
sylvain.thenault@logilab.fr
parents:
640
diff
changeset
|
892 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
893 |
@lltrace |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
894 |
def etype_rtype_selector(cls, req, rset, row=None, col=0, **kwargs): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
895 |
"""only check if the user has read access on the entity's type refered |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
896 |
by the .etype attribute and on the relations's type refered by the |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
897 |
.rtype attribute if set. |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
898 |
""" |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
899 |
schema = cls.schema |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
900 |
perm = getattr(cls, 'require_permission', 'read') |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
901 |
if hasattr(cls, 'etype'): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
902 |
eschema = schema.eschema(cls.etype) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
903 |
if not (eschema.has_perm(req, perm) or eschema.has_local_role(perm)): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
904 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
905 |
if hasattr(cls, 'rtype'): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
906 |
rschema = schema.rschema(cls.rtype) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
907 |
if not (rschema.has_perm(req, perm) or rschema.has_local_role(perm)): |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
908 |
return 0 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
909 |
return 1 |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
910 |
etype_rtype_selector = deprecated_function(etype_rtype_selector) |
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
911 |
|
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
912 |
#req_form_params_selector = deprecated_function(match_form_params) # form_params |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
913 |
#kwargs_selector = deprecated_function(match_kwargs) # expected_kwargs |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
914 |
|
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
915 |
# compound selectors ########################################################## |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
916 |
|
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
917 |
searchstate_accept = chainall(nonempty_rset(), accept, |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
918 |
name='searchstate_accept') |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
919 |
searchstate_accept_selector = deprecated_function(searchstate_accept) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
920 |
|
766
33ede72b22b8
fix match_user_groups, appobject_selectable, searchstate_accept* compat selectors
sylvain.thenault@logilab.fr
parents:
764
diff
changeset
|
921 |
searchstate_accept_one = chainall(one_line_rset, accept, _rql_condition, |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
922 |
name='searchstate_accept_one') |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
923 |
searchstate_accept_one_selector = deprecated_function(searchstate_accept_one) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
924 |
|
650
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
925 |
searchstate_accept = deprecated_function(searchstate_accept) |
75b4c661f71b
proper documentation, some bug fixes, upgrade some selectors
sylvain.thenault@logilab.fr
parents:
649
diff
changeset
|
926 |
searchstate_accept_one = deprecated_function(searchstate_accept_one) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
927 |
|
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
928 |
|
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
929 |
def unbind_method(selector): |
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
930 |
def new_selector(registered): |
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
931 |
# get the unbound method |
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
932 |
if hasattr(registered, 'im_func'): |
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
933 |
registered = registered.im_func |
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
934 |
# don't rebind since it will be done automatically during |
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
935 |
# the assignment, inside the destination class body |
657
fd019f41aa2f
work in progress - fix deprecation of EntityAction - fix various selectors bugs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
656
diff
changeset
|
936 |
return selector(registered) |
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
937 |
new_selector.__name__ = selector.__name__ |
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
938 |
return new_selector |
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
939 |
|
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
940 |
|
657
fd019f41aa2f
work in progress - fix deprecation of EntityAction - fix various selectors bugs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
656
diff
changeset
|
941 |
def deprecate(registered, msg): |
fd019f41aa2f
work in progress - fix deprecation of EntityAction - fix various selectors bugs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
656
diff
changeset
|
942 |
# get the unbound method |
fd019f41aa2f
work in progress - fix deprecation of EntityAction - fix various selectors bugs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
656
diff
changeset
|
943 |
if hasattr(registered, 'im_func'): |
fd019f41aa2f
work in progress - fix deprecation of EntityAction - fix various selectors bugs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
656
diff
changeset
|
944 |
registered = registered.im_func |
fd019f41aa2f
work in progress - fix deprecation of EntityAction - fix various selectors bugs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
656
diff
changeset
|
945 |
def _deprecate(cls, vreg): |
fd019f41aa2f
work in progress - fix deprecation of EntityAction - fix various selectors bugs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
656
diff
changeset
|
946 |
warn(msg, DeprecationWarning) |
fd019f41aa2f
work in progress - fix deprecation of EntityAction - fix various selectors bugs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
656
diff
changeset
|
947 |
return registered(cls, vreg) |
fd019f41aa2f
work in progress - fix deprecation of EntityAction - fix various selectors bugs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
656
diff
changeset
|
948 |
return _deprecate |
fd019f41aa2f
work in progress - fix deprecation of EntityAction - fix various selectors bugs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
656
diff
changeset
|
949 |
|
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
950 |
@unbind_method |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
951 |
def require_group_compat(registered): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
952 |
def plug_selector(cls, vreg): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
953 |
cls = registered(cls, vreg) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
954 |
if getattr(cls, 'require_groups', None): |
654
36e87179e91d
has_relation selector compat, fix some deprecation msg
sylvain.thenault@logilab.fr
parents:
652
diff
changeset
|
955 |
warn('use "match_user_groups(group1, group2)" instead of using require_groups', |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
956 |
DeprecationWarning) |
731
ac4a94e50b60
some more s/__selectors__/__select__ but still more to come
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
723
diff
changeset
|
957 |
cls.__select__ &= match_user_groups(cls.require_groups) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
958 |
return cls |
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
959 |
return plug_selector |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
960 |
|
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
961 |
@unbind_method |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
962 |
def accepts_compat(registered): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
963 |
def plug_selector(cls, vreg): |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
964 |
cls = registered(cls, vreg) |
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
965 |
if getattr(cls, 'accepts', None): |
654
36e87179e91d
has_relation selector compat, fix some deprecation msg
sylvain.thenault@logilab.fr
parents:
652
diff
changeset
|
966 |
warn('use "match_user_groups(group1, group2)" instead of using require_groups', |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
967 |
DeprecationWarning) |
731
ac4a94e50b60
some more s/__selectors__/__select__ but still more to come
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
723
diff
changeset
|
968 |
cls.__select__ &= implements(*cls.accepts) |
634
0badd061ce0f
move cubicweb.common.selectors to cubicweb.selectors
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
969 |
return cls |
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
970 |
return plug_selector |
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
971 |
|
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
972 |
@unbind_method |
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
973 |
def condition_compat(registered): |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
974 |
def plug_selector(cls, vreg): |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
975 |
cls = registered(cls, vreg) |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
976 |
if getattr(cls, 'condition', None): |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
977 |
warn('use "use rql_condition(expression)" instead of using condition', |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
978 |
DeprecationWarning) |
731
ac4a94e50b60
some more s/__selectors__/__select__ but still more to come
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
723
diff
changeset
|
979 |
cls.__select__ &= rql_condition(cls.condition) |
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
634
diff
changeset
|
980 |
return cls |
652
603c782dc092
various SyntaxErrors / missing import fixes + reorganization of the `registered` classmethod
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
650
diff
changeset
|
981 |
return plug_selector |
654
36e87179e91d
has_relation selector compat, fix some deprecation msg
sylvain.thenault@logilab.fr
parents:
652
diff
changeset
|
982 |
|
36e87179e91d
has_relation selector compat, fix some deprecation msg
sylvain.thenault@logilab.fr
parents:
652
diff
changeset
|
983 |
@unbind_method |
36e87179e91d
has_relation selector compat, fix some deprecation msg
sylvain.thenault@logilab.fr
parents:
652
diff
changeset
|
984 |
def has_relation_compat(registered): |
36e87179e91d
has_relation selector compat, fix some deprecation msg
sylvain.thenault@logilab.fr
parents:
652
diff
changeset
|
985 |
def plug_selector(cls, vreg): |
36e87179e91d
has_relation selector compat, fix some deprecation msg
sylvain.thenault@logilab.fr
parents:
652
diff
changeset
|
986 |
cls = registered(cls, vreg) |
36e87179e91d
has_relation selector compat, fix some deprecation msg
sylvain.thenault@logilab.fr
parents:
652
diff
changeset
|
987 |
if getattr(cls, 'type', None): |
36e87179e91d
has_relation selector compat, fix some deprecation msg
sylvain.thenault@logilab.fr
parents:
652
diff
changeset
|
988 |
warn('use relation_possible selector instead of using etype_rtype', |
36e87179e91d
has_relation selector compat, fix some deprecation msg
sylvain.thenault@logilab.fr
parents:
652
diff
changeset
|
989 |
DeprecationWarning) |
731
ac4a94e50b60
some more s/__selectors__/__select__ but still more to come
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
723
diff
changeset
|
990 |
cls.__select__ &= relation_possible(cls.rtype, role(cls), |
ac4a94e50b60
some more s/__selectors__/__select__ but still more to come
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
723
diff
changeset
|
991 |
getattr(cls, 'etype', None), |
ac4a94e50b60
some more s/__selectors__/__select__ but still more to come
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
723
diff
changeset
|
992 |
action=getattr(cls, 'require_permission', 'read')) |
654
36e87179e91d
has_relation selector compat, fix some deprecation msg
sylvain.thenault@logilab.fr
parents:
652
diff
changeset
|
993 |
return cls |
36e87179e91d
has_relation selector compat, fix some deprecation msg
sylvain.thenault@logilab.fr
parents:
652
diff
changeset
|
994 |
return plug_selector |