common/selectors.py
author sylvain.thenault@logilab.fr
Mon, 16 Feb 2009 19:50:10 +0100
branchtls-sprint
changeset 633 087e3f1e87c8
parent 631 99f5852f8604
child 634 0badd061ce0f
permissions -rw-r--r--
more selectors update
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
     1
"""This file contains some basic selectors required by application objects.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
     2
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
     3
A selector is responsible to score how well an object may be used with a
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
     4
given result set (publishing time selection)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
     5
333
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
     6
If you have trouble with selectors, especially if the objet (typically
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
     7
a view or a component) you want to use is not selected and you want to
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
     8
know which one(s) of its selectors fail (e.g. returns 0), you can use
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
     9
`traced_selection` or even direclty `TRACED_OIDS`.
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    10
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    11
`TRACED_OIDS` is a tuple of traced object ids. The special value
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    12
'all' may be used to log selectors for all objects.
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    13
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    14
For instance, say that the following code yields a `NoSelectableObject`
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    15
exception::
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    16
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    17
    self.view('calendar', myrset)
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    18
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    19
You can log the selectors involved for *calendar* by replacing the line
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    20
above by::
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    21
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    22
    # in Python2.5
560
005f78d21fc7 [selectors] fix inline doc
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 446
diff changeset
    23
    from cubicweb.common.selectors import traced_selection
333
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    24
    with traced_selection():
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    25
        self.view('calendar', myrset)
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    26
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    27
    # in Python2.4
560
005f78d21fc7 [selectors] fix inline doc
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 446
diff changeset
    28
    from cubicweb.common import selectors
333
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    29
    selectors.TRACED_OIDS = ('calendar',)
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    30
    self.view('calendar', myrset)
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    31
    selectors.TRACED_OIDS = ()
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    32
 
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    33
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    34
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
:organization: Logilab
402
sylvain.thenault@logilab.fr
parents: 394
diff changeset
    36
:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    37
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    39
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    40
__docformat__ = "restructuredtext en"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    41
333
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    42
import logging
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    43
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    44
from logilab.common.compat import all
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
    45
from logilab.common.deprecation import deprecated_function
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
    46
from logilab.common.interface import implements as implements_iface
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
    47
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
    48
from yams import BASE_TYPES
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    49
230
6e71adc5ccdd new has_related_entities selector
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 215
diff changeset
    50
from cubicweb import Unauthorized, NoSelectableObject, role
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
    51
from cubicweb.vregistry import NoSelectableObject, Selector, chainall, chainfirst
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    52
from cubicweb.cwvreg import DummyCursorError
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    53
from cubicweb.cwconfig import CubicWebConfiguration
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    54
from cubicweb.schema import split_expression
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    55
333
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    56
# helpers for debugging selectors
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    57
SELECTOR_LOGGER = logging.getLogger('cubicweb.selectors')
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    58
TRACED_OIDS = ()
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    59
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    60
def lltrace(selector):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    61
    # don't wrap selectors if not in development mode
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    62
    if CubicWebConfiguration.mode == 'installed':
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    63
        return selector
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    64
    def traced(cls, *args, **kwargs):
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
    65
        if isinstance(cls, Selector):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
    66
            selname = cls.__class__.__name__
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
    67
            oid = args[0].id
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
    68
        else:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
    69
            selname = selector.__name__
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
    70
            oid = cls.id
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    71
        ret = selector(cls, *args, **kwargs)
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
    72
        if TRACED_OIDS == 'all' or oid in TRACED_OIDS:
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
    73
            #SELECTOR_LOGGER.warning('selector %s returned %s for %s', selname, ret, cls)
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
    74
            print 'selector %s returned %s for %s' % (selname, ret, cls)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    75
        return ret
429
10854a2f9c03 some changes to make update to new selector names easier
sylvain.thenault@logilab.fr
parents: 402
diff changeset
    76
    traced.__name__ = selector.__name__
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    77
    return traced
333
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    78
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    79
class traced_selection(object):
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    80
    """selector debugging helper.
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    81
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    82
    Typical usage is :
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    83
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    84
    >>> with traced_selection():
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    85
    ...     # some code in which you want to debug selectors
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    86
    ...     # for all objects
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    87
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    88
    or
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    89
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    90
    >>> with traced_selection( ('oid1', 'oid2') ):
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    91
    ...     # some code in which you want to debug selectors
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    92
    ...     # for objects with id 'oid1' and 'oid2'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    93
    
333
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    94
    """
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    95
    def __init__(self, traced='all'):
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    96
        self.traced = traced
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    97
        
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    98
    def __enter__(self):
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
    99
        global TRACED_OIDS
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
   100
        TRACED_OIDS = self.traced
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
   101
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
   102
    def __exit__(self, exctype, exc, traceback):
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
   103
        global TRACED_OIDS
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
   104
        TRACED_OIDS = ()
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
   105
        return traceback is None
c65eccf85895 simplify selectors debugging
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 266
diff changeset
   106
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   107
# very basic selectors ########################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   108
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   109
def yes(cls, *args, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   110
    """accept everything"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   111
    return 1
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   112
yes_selector = deprecated_function(yes)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   113
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   114
@lltrace
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   115
def none_rset(cls, req, rset, *args, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   116
    """accept no result set"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   117
    if rset is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   118
        return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   119
    return 0
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   120
norset_selector = deprecated_function(none_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   121
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   122
@lltrace
430
6fbc0ab79a2d any_rset is a better name than rset
sylvain.thenault@logilab.fr
parents: 429
diff changeset
   123
def any_rset(cls, req, rset, *args, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   124
    """accept result set, whatever the number of result"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   125
    if rset is not None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   126
        return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   127
    return 0
430
6fbc0ab79a2d any_rset is a better name than rset
sylvain.thenault@logilab.fr
parents: 429
diff changeset
   128
rset_selector = deprecated_function(any_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   129
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   130
@lltrace
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   131
def nonempty_rset(cls, req, rset, *args, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   132
    """accept any non empty result set"""
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   133
    if rset is not None and rset.rowcount:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   134
        return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   135
    return 0
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   136
anyrset_selector = deprecated_function(nonempty_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   137
    
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   138
@lltrace
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   139
def empty_rset(cls, req, rset, *args, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   140
    """accept empty result set"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   141
    if rset is not None and rset.rowcount == 0:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   142
        return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   143
    return 0
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   144
emptyrset_selector = deprecated_function(empty_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   145
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   146
@lltrace
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   147
def one_line_rset(cls, req, rset, row=None, *args, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   148
    """accept result set with a single line of result"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   149
    if rset is not None and (row is not None or rset.rowcount == 1):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   150
        return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   151
    return 0
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   152
onelinerset_selector = deprecated_function(one_line_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   153
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   154
@lltrace
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   155
def two_lines_rset(cls, req, rset, *args, **kwargs):
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   156
    """accept result set with *at least* two lines of result"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   157
    if rset is not None and rset.rowcount > 1:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   158
        return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   159
    return 0
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   160
twolinerset_selector = deprecated_function(two_lines_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   161
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   162
@lltrace
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   163
def two_cols_rset(cls, req, rset, *args, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   164
    """accept result set with at least one line and two columns of result"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   165
    if rset is not None and rset.rowcount > 0 and len(rset.rows[0]) > 1:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   166
        return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   167
    return 0
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   168
twocolrset_selector = deprecated_function(two_cols_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   169
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   170
@lltrace
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   171
def paginated_rset(cls, req, rset, *args, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   172
    """accept result sets with more rows than the page size
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   173
    """
591
9eeb3d0a4463 get custom page_size as argument
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 560
diff changeset
   174
    page_size = kwargs.get('page_size')
9eeb3d0a4463 get custom page_size as argument
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 560
diff changeset
   175
    if page_size is None:
593
6f6549780096 page_size can be given in url attributes
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 591
diff changeset
   176
        page_size = req.form.get('page_size')
6f6549780096 page_size can be given in url attributes
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 591
diff changeset
   177
        if page_size is None:
6f6549780096 page_size can be given in url attributes
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 591
diff changeset
   178
            page_size = req.property_value('navigation.page-size')
6f6549780096 page_size can be given in url attributes
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 591
diff changeset
   179
        else:
6f6549780096 page_size can be given in url attributes
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 591
diff changeset
   180
            page_size = int(page_size)
591
9eeb3d0a4463 get custom page_size as argument
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 560
diff changeset
   181
    if rset is None or len(rset) <= page_size:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   182
        return 0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   183
    return 1
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   184
largerset_selector = deprecated_function(paginated_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   185
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   186
@lltrace
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   187
def sorted_rset(cls, req, rset, row=None, col=0, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   188
    """accept sorted result set"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   189
    rqlst = rset.syntax_tree()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   190
    if len(rqlst.children) > 1 or not rqlst.children[0].orderby:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   191
        return 0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   192
    return 2
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   193
sortedrset_selector = deprecated_function(sorted_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   194
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   195
@lltrace
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   196
def one_etype_rset(cls, req, rset, *args, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   197
    """accept result set where entities in the first columns are all of the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   198
    same type
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   199
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   200
    if len(rset.column_types(0)) != 1:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   201
        return 0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   202
    return 1
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   203
oneetyperset_selector = deprecated_function(one_etype_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   204
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   205
@lltrace
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   206
def two_etypes_rset(cls, req, rset, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   207
    """accepts resultsets containing several entity types"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   208
    if rset:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   209
        etypes = rset.column_types(0)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   210
        if len(etypes) > 1:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   211
            return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   212
    return 0
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   213
multitype_selector = deprecated_function(two_etypes_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   214
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   215
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   216
class match_search_state(Selector):
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   217
    def __init__(self, *expected):
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   218
        self.expected = expected
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   219
        
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   220
    @lltrace
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   221
    def __call__(self, cls, req, rset, row=None, col=0, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   222
        """checks if the current request search state is in one of the expected states
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   223
        the wrapped class
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   224
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   225
        search state should be either 'normal' or 'linksearch' (eg searching for an
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   226
        object to create a relation with another)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   227
        """
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   228
        try:
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   229
            if not req.search_state[0] in self.expected:
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   230
                return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   231
        except AttributeError:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   232
            return 1 # class doesn't care about search state, accept it
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   233
        return 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   234
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   235
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   236
class match_form_params(match_search_state):
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   237
    """check if parameters specified as initializer arguments are specified
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   238
    in request form parameters
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   239
    """
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   240
    @lltrace
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   241
    def __call__(self, cls, req, *args, **kwargs):
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   242
        score = 0
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   243
        for param in self.expected:
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   244
            val = req.form.get(param)
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   245
            if not val:
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   246
                return 0
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   247
            score += 1
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   248
        return len(self.expected)
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   249
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   250
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   251
class match_kwargs(match_search_state):
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   252
    """check if parameters specified as initializer arguments are specified
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   253
    in named parameters
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   254
    """
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   255
    @lltrace
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   256
    def __call__(self, cls, req, *args, **kwargs):
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   257
        for arg in self.expected:
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   258
            if not arg in kwargs:
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   259
                return 0
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   260
        return len(self.expected)
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   261
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   262
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   263
@lltrace
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   264
def anonymous_user(cls, req, *args, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   265
    """accept if user is anonymous"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   266
    if req.cnx.anonymous_connection:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   267
        return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   268
    return 0
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   269
anonymous_selector = deprecated_function(anonymous_user)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   270
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   271
@lltrace
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   272
def authenticated_user(cls, req, *args, **kwargs):
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   273
    """accept if user is authenticated"""
431
18b4dd650ef8 massive selector update
sylvain.thenault@logilab.fr
parents: 430
diff changeset
   274
    return not anonymous_user(cls, req, *args, **kwargs)
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   275
not_anonymous_selector = deprecated_function(authenticated_user)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   276
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   277
# abstract selectors ##########################################################
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   278
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   279
class EClassSelector(Selector):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   280
    """abstract class for selectors working on the entity classes of the result
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   281
    set
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   282
    """
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   283
    once_is_enough = False
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   284
    
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   285
    @lltrace
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   286
    def __call__(self, cls, req, rset, row=None, col=0, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   287
        if not rset:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   288
            return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   289
        score = 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   290
        if row is None:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   291
            for etype in rset.column_types(col):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   292
                if etype is None: # outer join
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   293
                    continue
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   294
                if etype in BASE_TYPES:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   295
                    return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   296
                escore = self.score_class(cls.vreg.etype_class(etype), req)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   297
                if not escore:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   298
                    return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   299
                elif self.once_is_enough:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   300
                    return escore
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   301
                score += escore
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   302
        else:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   303
            etype = rset.description[row][col]
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   304
            if etype is not None and not etype in BASE_TYPES:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   305
                score = self.score_class(cls.vreg.etype_class(etype), req)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   306
        return score and (score + 1)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   307
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   308
    def score_class(self, eclass, req):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   309
        raise NotImplementedError()
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   310
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   311
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   312
class EntitySelector(Selector):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   313
    """abstract class for selectors working on the entity instances of the
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   314
    result set
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   315
    """
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   316
    @lltrace
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   317
    def __call__(self, cls, req, rset, row=None, col=0, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   318
        if not rset:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   319
            return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   320
        score = 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   321
        if row is None:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   322
            for row, rowvalue in enumerate(rset.rows):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   323
                if rowvalue[col] is None: # outer join
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   324
                    continue
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   325
                try:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   326
                    escore = self.score_entity(rset.get_entity(row, col))
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   327
                except NotAnEntity:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   328
                    return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   329
                if not escore:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   330
                    return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   331
                score += escore
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   332
        else:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   333
            etype = rset.description[row][col]
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   334
            if etype is not None: # outer join
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   335
                try:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   336
                    score = self.score_entity(rset.get_entity(row, col))
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   337
                except NotAnEntity:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   338
                    return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   339
        return score and (score + 1)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   340
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   341
    def score_entity(self, entity):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   342
        raise NotImplementedError()
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   343
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   344
# not so basic selectors ######################################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   345
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   346
class implements(EClassSelector):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   347
    """initializer takes a list of interfaces or entity types as argument
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   348
    
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   349
    * if row is None, return the number of implemented interfaces for each
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   350
      entity's class in the result set at the specified column (or column 0).
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   351
      If any class has no matching interface, return 0.
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   352
    * if row is specified, return number of implemented interfaces by the
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   353
      entity's class at this row (and column)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   354
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   355
    if some interface is an entity class, the score will reflect class
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   356
    proximity so the most specific object'll be selected
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   357
    """
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   358
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   359
    def __init__(self, *expected_ifaces):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   360
        self.expected_ifaces = expected_ifaces
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   361
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   362
    def score_class(self, eclass, req):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   363
        score = 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   364
        for iface in self.expected_ifaces:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   365
            if isinstance(iface, basestring):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   366
                # entity type
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   367
                iface = eclass.vreg.etype_class(iface)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   368
            if implements_iface(eclass, iface):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   369
                score += 1
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   370
                if getattr(iface, '__registry__', None) == 'etypes':
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   371
                    score += 1
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   372
                    # adjust score if the interface is an entity class
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   373
                    if iface is eclass:
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   374
                        score += len(eclass.e_schema.ancestors())
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   375
                        print 'is majoration', len(eclass.e_schema.ancestors()) 
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   376
                    else:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   377
                        parents = [e.type for e in eclass.e_schema.ancestors()]
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   378
                        for index, etype in enumerate(reversed(parents)):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   379
                            basecls = eclass.vreg.etype_class(etype)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   380
                            if iface is basecls:
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   381
                                score += index
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   382
                                print 'etype majoration', index
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   383
                                break
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   384
        return score
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   385
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   386
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   387
class specified_etype_implements(implements):
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   388
    """return the "interface score" for class associated to 'etype' (expected in
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   389
    request form or arguments)
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   390
    """
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   391
    
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   392
    @lltrace
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   393
    def __call__(cls, req, *args, **kwargs):
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   394
        try:
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   395
            etype = req.form['etype']
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   396
        except KeyError:
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   397
            try:
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   398
                etype = kwargs['etype']
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   399
            except KeyError:
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   400
                return 0
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   401
        return self.score_class(cls.vreg.etype_class(etype), req)
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   402
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   403
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   404
class relation_possible(EClassSelector):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   405
    """initializer takes relation name as argument and an optional role (default
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   406
      as subject) and target type (default to unspecified)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   407
      
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   408
    * if row is None, return 1 if every entity's class in the result set at the
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   409
      specified column (or column 0) may have this relation (as role). If target
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   410
      type is specified, check the relation's end may be of this target type.
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   411
      
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   412
    * if row is specified, check relation is supported by the entity's class at
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   413
      this row (and column)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   414
    """
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   415
    def __init__(self, rtype, role='subject', target_etype=None,
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   416
                 permission='read', once_is_enough=False):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   417
        self.rtype = rtype
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   418
        self.role = role
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   419
        self.target_etype = target_etype
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   420
        self.permission = permission
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   421
        self.once_is_enough = once_is_enough
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   422
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   423
    @lltrace
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   424
    def __call__(self, cls, *args, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   425
        rschema = cls.schema.rschema(self.rtype)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   426
        if not (rschema.has_perm(req, self.permission)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   427
                or rschema.has_local_role(self.permission)):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   428
            return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   429
        return super(relation_possible, self)(cls, *args, **kwargs)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   430
        
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   431
    def score_class(self, eclass, req):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   432
        eschema = eclass.e_schema
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   433
        try:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   434
            if self.role == 'object':
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   435
                rschema = eschema.object_relation(self.rtype)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   436
            else:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   437
                rschema = eschema.subject_relation(self.rtype)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   438
        except KeyError:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   439
            return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   440
        if self.target_etype is not None:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   441
            try:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   442
                if self.role == 'object':
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   443
                    return self.target_etype in rschema.objects(eschema)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   444
                else:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   445
                    return self.target_etype in rschema.subjects(eschema)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   446
            except KeyError, ex:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   447
                return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   448
        return 1
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   449
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   450
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   451
class non_final_entity(EClassSelector):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   452
    """initializer takes no argument
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   453
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   454
    * if row is None, return 1 if there are only non final entity's class in the
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   455
      result set at the specified column (or column 0)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   456
    * if row is specified, return 1 if entity's class at this row (and column)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   457
      isn't final
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   458
    """
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   459
    def score_class(self, eclass, req):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   460
        return int(not eclass.e_schema.is_final())
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   461
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   462
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   463
class match_user_groups(Selector):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   464
    """initializer takes users group as argument
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   465
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   466
    * check logged user is in one of the given groups. If special 'owners' group
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   467
      given:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   468
      - if row is specified check the entity at the given row/col is owned by
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   469
        the logged user
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   470
      - if row is not specified check all entities in col are owned by the
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   471
        logged user
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   472
    """
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   473
    
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   474
    def __init__(self, *required_groups):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   475
        self.required_groups = required_groups
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   476
    
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   477
    @lltrace
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   478
    def __call__(self, cls, req, rset=None, row=None, col=0, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   479
        user = req.user
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   480
        if user is None:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   481
            return int('guests' in self.require_groups)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   482
        score = user.matching_groups(self.require_groups)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   483
        if not score and 'owners' in self.require_groups and rset:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   484
            nbowned = 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   485
            if row is not None:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   486
                if not user.owns(rset[row][col]):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   487
                    return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   488
                score = 1
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   489
            else:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   490
                score = all(user.owns(r[col or 0]) for r in rset)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   491
        return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   492
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   493
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   494
class has_editable_relation(EntitySelector):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   495
    """initializer takes no argument
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   496
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   497
    * if row is specified check the entity at the given row/col has some
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   498
      relation editable by the logged user
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   499
    * if row is not specified check all entities in col are owned have some
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   500
      relation editable by the logged userlogged user
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   501
    """
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   502
        
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   503
    def score_entity(self, entity):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   504
        # if user has no update right but it can modify some relation,
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   505
        # display action anyway
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   506
        for dummy in entity.srelations_by_category(('generic', 'metadata'),
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   507
                                                   'add'):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   508
            return 1
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   509
        for rschema, targetschemas, role in entity.relations_by_category(
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   510
            ('primary', 'secondary'), 'add'):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   511
            if not rschema.is_final():
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   512
                return 1
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   513
        return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   514
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   515
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   516
class may_add_relation(EntitySelector):
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   517
    """initializer takes a relation type and optional role (default to
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   518
    'subject') as argument
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   519
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   520
    if row is specified check the relation may be added to the entity at the
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   521
    given row/col (if row specified) or to every entities in the given col (if
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   522
    row is not specified)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   523
    """
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   524
    
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   525
    def __init__(self, rtype, role='subject'):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   526
        self.rtype = rtype
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   527
        self.role = role
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   528
        
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   529
    def score_entity(self, entity):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   530
        rschema = entity.schema.rschema(self.rtype)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   531
        if self.role == 'subject':
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   532
            if not rschema.has_perm(req, 'add', fromeid=entity.eid):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   533
                return False
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   534
        elif not rschema.has_perm(req, 'add', toeid=entity.eid):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   535
            return False
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   536
        return True
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   537
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   538
        
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   539
class has_permission(EntitySelector):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   540
    """initializer takes a schema action (eg 'read'/'add'/'delete'/'update') as
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   541
    argument
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   542
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   543
    * if row is specified check user has permission to do the requested action
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   544
      on the entity at the given row/col
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   545
    * if row is specified check user has permission to do the requested action
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   546
      on all entities in the given col
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   547
    """
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   548
    def __init__(self, schema_action):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   549
        self.schema_action = schema_action
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   550
        
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   551
    @lltrace
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   552
    def __call__(self, cls, req, rset, row=None, col=0, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   553
        user = req.user
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   554
        action = self.schema_action
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   555
        if row is None:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   556
            score = 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   557
            need_local_check = [] 
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   558
            geteschema = cls.schema.eschema
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   559
            for etype in rset.column_types(0):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   560
                if etype in BASE_TYPES:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   561
                    return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   562
                eschema = geteschema(etype)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   563
                if not user.matching_groups(eschema.get_groups(action)):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   564
                    if eschema.has_local_role(action):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   565
                        # have to ckeck local roles
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   566
                        need_local_check.append(eschema)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   567
                        continue
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   568
                    else:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   569
                        # even a local role won't be enough
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   570
                        return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   571
                score += accepted
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   572
            if need_local_check:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   573
                # check local role for entities of necessary types
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   574
                for i, row in enumerate(rset):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   575
                    if not rset.description[i][0] in need_local_check:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   576
                        continue
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   577
                    if not self.score_entity(rset.get_entity(i, col)):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   578
                        return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   579
                    score += 1
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   580
            return score
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   581
        if rset.description[row][col] in BASE_TYPES:
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   582
            return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   583
        return self.score_entity(rset.get_entity(row, col))
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   584
    
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   585
    def score_entity(self, entity):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   586
        if entity.has_perm(self.schema_action):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   587
            return 1
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   588
        return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   589
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   590
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   591
class has_add_permission(EClassSelector):
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   592
    """return 1 if the user may add some entity of the types found in the
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   593
    result set (0 else)
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   594
    """
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   595
    def score_class(self, eclass, req):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   596
        eschema = eclass.e_schema
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   597
        if not (eschema.is_final() or eschema.is_subobject(strict=True)) \
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   598
               and eschema.has_perm(req, 'add'):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   599
            return 1
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   600
        return 0
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   601
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   602
        
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   603
class score_entity(EntitySelector):
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   604
    """initializer takes a function as argument (which is expected to take an
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   605
    entity as argument)
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   606
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   607
    return the score returned by the function on the entity at the given row/col
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   608
    (if row specified) or the sum of the score for every entities in the given
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   609
    col (if row is not specified). Return 0 at the first entity scoring to zero.
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   610
    """
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   611
    def __init__(self, scorefunc):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   612
        self.score_entity = scorefunc
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   613
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   614
    
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   615
# XXX not so basic selectors ######################################################
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   616
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   617
@lltrace
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   618
def _rql_condition(cls, req, rset, row=None, col=0, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   619
    """accept single entity result set if the entity match an rql condition
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   620
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   621
    if cls.condition:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   622
        eid = rset[row or 0][col or 0]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   623
        if 'U' in frozenset(split_expression(cls.condition)):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   624
            rql = 'Any X WHERE X eid %%(x)s, U eid %%(u)s, %s' % cls.condition
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   625
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   626
            rql = 'Any X WHERE X eid %%(x)s, %s' % cls.condition
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   627
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   628
            return len(req.execute(rql, {'x': eid, 'u': req.user.eid}, 'x'))
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   629
        except Unauthorized:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   630
            return 0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   631
        
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   632
    return 1
254
b1eda3dd844a more selector renaming
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 247
diff changeset
   633
_rqlcondition_selector = deprecated_function(_rql_condition)
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   634
        
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   635
@lltrace
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   636
def but_etype(cls, req, rset, row=None, col=0, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   637
    """restrict the searchstate_accept_one_selector to exclude entity's type
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   638
    refered by the .etype attribute
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   639
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   640
    if rset.description[row or 0][col or 0] == cls.etype:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   641
        return 0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   642
    return 1
254
b1eda3dd844a more selector renaming
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 247
diff changeset
   643
but_etype_selector = deprecated_function(but_etype)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   644
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   645
@lltrace
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   646
def etype_rtype_selector(cls, req, rset, row=None, col=0, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   647
    """only check if the user has read access on the entity's type refered
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   648
    by the .etype attribute and on the relations's type refered by the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   649
    .rtype attribute if set.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   650
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   651
    schema = cls.schema
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   652
    perm = getattr(cls, 'require_permission', 'read')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   653
    if hasattr(cls, 'etype'):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   654
        eschema = schema.eschema(cls.etype)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   655
        if not (eschema.has_perm(req, perm) or eschema.has_local_role(perm)):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   656
            return 0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   657
    if hasattr(cls, 'rtype'):
394
1cc99ab21304 fix w/ local roles
sylvain.thenault@logilab.fr
parents: 367
diff changeset
   658
        rschema = schema.rschema(cls.rtype)
1cc99ab21304 fix w/ local roles
sylvain.thenault@logilab.fr
parents: 367
diff changeset
   659
        if not (rschema.has_perm(req, perm) or rschema.has_local_role(perm)):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   660
            return 0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   661
    return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   662
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   663
@lltrace
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   664
def has_related_entities(cls, req, rset, row=None, col=0, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   665
    return bool(rset.get_entity(row or 0, col or 0).related(cls.rtype, role(cls)))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   666
237
3df2e0ae2eba begin selector renaming (work in progress)
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 236
diff changeset
   667
@lltrace
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   668
def user_can_add_etype(cls, req, rset, row=None, col=0, **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   669
    """only check if the user has add access on the entity's type refered
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   670
    by the .etype attribute.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   671
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   672
    if not cls.schema.eschema(cls.etype).has_perm(req, 'add'):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   673
        return 0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   674
    return 1
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   675
add_etype_selector = deprecated_function(user_can_add_etype)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   676
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   677
@lltrace
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   678
def match_context_prop(cls, req, rset, row=None, col=0, context=None,
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   679
                       **kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   680
    propval = req.property_value('%s.%s.context' % (cls.__registry__, cls.id))
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   681
    if not propval:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   682
        propval = cls.context
446
3a3ab6bbccc5 use empty string instead of None as possible context value to avoid getting an <optgroup> tag in associated widget
sylvain.thenault@logilab.fr
parents: 431
diff changeset
   683
    if context is not None and propval and context != propval:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   684
        return 0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   685
    return 1
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   686
contextprop_selector = deprecated_function(match_context_prop)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   687
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   688
@lltrace
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   689
def primary_view(cls, req, rset, row=None, col=0, view=None,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   690
                          **kwargs):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   691
    if view is not None and not view.is_primary():
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   692
        return 0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   693
    return 1
236
8ab9e72dd8f1 begin renaming for selectors, keeping bw compat
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 230
diff changeset
   694
primaryview_selector = deprecated_function(primary_view)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   695
142
0425ee84cfa6 add selector to test if result set is an object (for rss feed component)
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 0
diff changeset
   696
def appobject_selectable(registry, oid):
161
328bc32b5701 repairing error from preceding commit
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 157
diff changeset
   697
    """return a selector that will have a positive score if an object for the
328bc32b5701 repairing error from preceding commit
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 157
diff changeset
   698
    given registry and object id is selectable for the input context
328bc32b5701 repairing error from preceding commit
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 157
diff changeset
   699
    """
142
0425ee84cfa6 add selector to test if result set is an object (for rss feed component)
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 0
diff changeset
   700
    @lltrace
0425ee84cfa6 add selector to test if result set is an object (for rss feed component)
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 0
diff changeset
   701
    def selector(cls, req, rset, *args, **kwargs):
0425ee84cfa6 add selector to test if result set is an object (for rss feed component)
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 0
diff changeset
   702
        try:
0425ee84cfa6 add selector to test if result set is an object (for rss feed component)
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 0
diff changeset
   703
            cls.vreg.select_object(registry, oid, req, rset, *args, **kwargs)
0425ee84cfa6 add selector to test if result set is an object (for rss feed component)
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 0
diff changeset
   704
            return 1
0425ee84cfa6 add selector to test if result set is an object (for rss feed component)
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 0
diff changeset
   705
        except NoSelectableObject:
0425ee84cfa6 add selector to test if result set is an object (for rss feed component)
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 0
diff changeset
   706
            return 0
0425ee84cfa6 add selector to test if result set is an object (for rss feed component)
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 0
diff changeset
   707
    return selector
0425ee84cfa6 add selector to test if result set is an object (for rss feed component)
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 0
diff changeset
   708
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   709
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   710
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   711
# XXX DEPRECATED ##############################################################
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   712
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   713
def nfentity_selector(cls, req, rset, row=None, col=0, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   714
    return non_final_entity()(cls, req, rset, row, col)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   715
nfentity_selector = deprecated_function(nfentity_selector)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   716
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   717
def implement_interface(cls, req, rset, row=None, col=0, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   718
    return implements(*cls.accepts_interfaces)(cls, req, rset, row, col)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   719
_interface_selector = deprecated_function(implement_interface)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   720
interface_selector = deprecated_function(implement_interface)
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   721
implement_interface = deprecated_function(implement_interface, 'use implements')
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   722
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   723
def accept_etype(cls, req, *args, **kwargs):
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   724
    """check etype presence in request form *and* accepts conformance"""
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   725
    return specified_etype_implements(*cls.accepts)(cls, req, *args)
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   726
etype_form_selector = deprecated_function(accept_etype)
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   727
accept_etype = deprecated_function(accept_etype, 'use specified_etype_implements')
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   728
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   729
def searchstate_selector(cls, req, rset, row=None, col=0, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   730
    return match_search_state(cls.search_states)(cls, req, rset, row, col)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   731
searchstate_selector = deprecated_function(searchstate_selector)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   732
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   733
def match_user_group(cls, req, rset=None, row=None, col=0, **kwargs):
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   734
    return match_user_groups(*cls.require_groups)(cls, req, rset, row, col, **kwargs)
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   735
in_group_selector = deprecated_function(match_user_group)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   736
match_user_group = deprecated_function(match_user_group)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   737
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   738
def has_relation(cls, req, rset, row=None, col=0, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   739
    return relation_possible(cls.rtype, role(cls), cls.etype,
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   740
                             getattr(cls, 'require_permission', 'read'))(cls, req, rset, row, col, **kwargs)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   741
has_relation = deprecated_function(has_relation)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   742
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   743
def one_has_relation(cls, req, rset, row=None, col=0, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   744
    return relation_possible(cls.rtype, role(cls), cls.etype,
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   745
                             getattr(cls, 'require_permission', 'read',
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   746
                                     once_is_enough=True))(cls, req, rset, row, col, **kwargs)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   747
one_has_relation = deprecated_function(one_has_relation, 'use relation_possible selector')
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   748
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   749
def accept_rset(cls, req, rset, row=None, col=0, **kwargs):
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   750
    """simply delegate to cls.accept_rset method"""
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   751
    return implements(*cls.accepts)(cls, req, rset, row=row, col=col)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   752
accept_rset_selector = deprecated_function(accept_rset)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   753
accept_rset = deprecated_function(accept_rset, 'use implements selector')
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   754
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   755
accept = chainall(non_final_entity(), accept_rset, name='accept')
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   756
accept_selector = deprecated_function(accept)
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   757
accept = deprecated_function(accept, 'use implements selector')
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   758
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   759
# compound selectors ##########################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   760
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   761
accept_one = deprecated_function(chainall(one_line_rset, accept,
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   762
                                          name='accept_one'))
254
b1eda3dd844a more selector renaming
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 247
diff changeset
   763
accept_one_selector = deprecated_function(accept_one)
237
3df2e0ae2eba begin selector renaming (work in progress)
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 236
diff changeset
   764
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   765
rql_condition = chainall(non_final_entity(), one_line_rset, _rql_condition,
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   766
                         name='rql_condition')
254
b1eda3dd844a more selector renaming
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 247
diff changeset
   767
rqlcondition_selector = deprecated_function(rql_condition)
b1eda3dd844a more selector renaming
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 247
diff changeset
   768
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   769
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   770
searchstate_accept = chainall(nonempty_rset, match_search_state, accept,
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   771
                              name='searchstate_accept')
254
b1eda3dd844a more selector renaming
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 247
diff changeset
   772
searchstate_accept_selector = deprecated_function(searchstate_accept)
b1eda3dd844a more selector renaming
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 247
diff changeset
   773
b1eda3dd844a more selector renaming
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 247
diff changeset
   774
searchstate_accept_one = chainall(one_line_rset, match_search_state,
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   775
                                  accept, _rql_condition,
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   776
                                  name='searchstate_accept_one')
254
b1eda3dd844a more selector renaming
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 247
diff changeset
   777
searchstate_accept_one_selector = deprecated_function(searchstate_accept_one)
b1eda3dd844a more selector renaming
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 247
diff changeset
   778
631
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   779
searchstate_accept_one_but_etype = chainall(searchstate_accept_one, but_etype,
99f5852f8604 major selector refactoring (mostly to avoid looking for select parameters on the target class), start accept / interface unification)
sylvain.thenault@logilab.fr
parents: 593
diff changeset
   780
                                            name='searchstate_accept_one_but_etype')
254
b1eda3dd844a more selector renaming
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 247
diff changeset
   781
searchstate_accept_one_but_etype_selector = deprecated_function(
b1eda3dd844a more selector renaming
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 247
diff changeset
   782
    searchstate_accept_one_but_etype)
633
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   783
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   784
#req_form_params_selector = deprecated_function(match_form_params) # form_params
087e3f1e87c8 more selectors update
sylvain.thenault@logilab.fr
parents: 631
diff changeset
   785
#kwargs_selector = deprecated_function(match_kwargs) # expected_kwargs