cubicweb/rtags.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Fri, 05 Apr 2019 17:58:19 +0200
changeset 12567 26744ad37953
parent 12212 f2e6fb5ddf68
permissions -rw-r--r--
Drop python2 support This mostly consists in removing the dependency on "six" and updating the code to use only Python3 idioms. Notice that we previously used TemporaryDirectory from cubicweb.devtools.testlib for compatibility with Python2. We now directly import it from tempfile.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
     1
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5314
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
4931
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    18
"""
5314
86e5abbebfaf [doc/book] refresh the autoform section with uicfg content (moved there)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4931
diff changeset
    19
A RelationTag object is an object which allows to link a configuration
86e5abbebfaf [doc/book] refresh the autoform section with uicfg content (moved there)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4931
diff changeset
    20
information to a relation definition. For instance, the standard
86e5abbebfaf [doc/book] refresh the autoform section with uicfg content (moved there)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4931
diff changeset
    21
primary view uses a RelationTag object (uicfg.primaryview_section) to
86e5abbebfaf [doc/book] refresh the autoform section with uicfg content (moved there)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4931
diff changeset
    22
get the section to display relations.
4931
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    23
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    24
.. sourcecode:: python
1152
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    25
4931
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    26
   # display ``entry_of`` relations in the ``relations`` section in the ``BlogEntry`` primary view
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    27
   uicfg.primaryview_section.tag_subject_of(('BlogEntry', 'entry_of', '*'),
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    28
                                             'relations')
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    29
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    30
   # hide every relation ``entry_of`` in the ``Blog`` primary view
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    31
   uicfg.primaryview_section.tag_object_of(('*', 'entry_of', 'Blog'), 'hidden')
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    32
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    33
Three primitives are defined:
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    34
   * ``tag_subject_of`` tag a relation in the subject's context
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    35
   * ``tag_object_of`` tag a relation in the object's context
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    36
   * ``tag_attribute`` shortcut for tag_subject_of
1152
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    37
"""
11767
432f87a63057 flake8 and all
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
    38
1148
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
    39
1740
2292ae32c98f warn and drop rtags not in schema, this may be intentional; drop possibility to not specify value for bool rtags
sylvain.thenault@logilab.fr
parents: 1739
diff changeset
    40
import logging
2292ae32c98f warn and drop rtags not in schema, this may be intentional; drop possibility to not specify value for bool rtags
sylvain.thenault@logilab.fr
parents: 1739
diff changeset
    41
2292ae32c98f warn and drop rtags not in schema, this may be intentional; drop possibility to not specify value for bool rtags
sylvain.thenault@logilab.fr
parents: 1739
diff changeset
    42
from logilab.common.logging_ext import set_log_methods
8666
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    43
from logilab.common.registry import RegistrableInstance, yes
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    44
11870
3a84a79c4ed5 Flake8 bits with some copyright updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11767
diff changeset
    45
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
    46
def _ensure_str_key(key):
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
    47
    return tuple(str(k) for k in key)
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
    48
11870
3a84a79c4ed5 Flake8 bits with some copyright updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11767
diff changeset
    49
11888
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    50
def rtags_chain(rtag):
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    51
    """Return the rtags chain, starting from the given one, and going back through each parent rtag
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    52
    up to the root (i.e. which as no parent).
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    53
    """
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    54
    while rtag is not None:
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    55
        yield rtag
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    56
        rtag = rtag._parent
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    57
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    58
8666
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    59
class RegistrableRtags(RegistrableInstance):
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    60
    __registry__ = 'uicfg'
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    61
    __select__ = yes()
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    62
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    63
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    64
class RelationTags(RegistrableRtags):
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    65
    """a tag store for full relation definitions :
1148
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
    66
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    67
         (subject type, relation type, object type, tagged)
1152
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    68
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    69
    allowing to set tags using wildcard (eg '*') as subject type / object type
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    70
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    71
    This class associates a single tag to each key.
1152
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    72
    """
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
    73
    _allowed_values = None
8666
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    74
    # _init expected to be a method (introduced in 3.17), while _initfunc a
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    75
    # function given as __init__ argument and kept for bw compat
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    76
    _init = _initfunc = None
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    77
11932
7b2247098f58 [rtags] pass module name to RegistrableInstance
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11888
diff changeset
    78
    def __init__(self, parent=None, __module__=None):
7b2247098f58 [rtags] pass module name to RegistrableInstance
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11888
diff changeset
    79
        super(RelationTags, self).__init__(__module__)
1148
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
    80
        self._tagdefs = {}
11888
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    81
        self._parent = parent
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    82
        if parent is not None:
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    83
            assert parent.__class__ is self.__class__, \
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
    84
                'inconsistent class for parent rtag {0}'.format(parent)
1769
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
    85
1528
864ae7c15ef5 other fixlets
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1451
diff changeset
    86
    def __repr__(self):
8666
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    87
        # find a way to have more infos but keep it readable
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
    88
        # (in error messages in case of an ambiguity for instance)
12212
f2e6fb5ddf68 [rtags] Enhance repr of rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11932
diff changeset
    89
        return '<%s %s>' % (self.__regid__, self._short_repr())
f2e6fb5ddf68 [rtags] Enhance repr of rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11932
diff changeset
    90
f2e6fb5ddf68 [rtags] Enhance repr of rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11932
diff changeset
    91
    def _short_repr(self):
f2e6fb5ddf68 [rtags] Enhance repr of rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11932
diff changeset
    92
        # find a way to have more infos but keep it readable
f2e6fb5ddf68 [rtags] Enhance repr of rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11932
diff changeset
    93
        # (in error messages in case of an ambiguity for instance)
f2e6fb5ddf68 [rtags] Enhance repr of rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11932
diff changeset
    94
        return '%s@0x%x%s' % (
f2e6fb5ddf68 [rtags] Enhance repr of rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11932
diff changeset
    95
            self.__module__, id(self),
f2e6fb5ddf68 [rtags] Enhance repr of rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11932
diff changeset
    96
            ' derived from %s' % self._parent._short_repr() if self._parent else '')
1528
864ae7c15ef5 other fixlets
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1451
diff changeset
    97
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    98
    # dict compat
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    99
    def __getitem__(self, key):
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   100
        return self.get(*key)
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   101
    __contains__ = __getitem__
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1356
diff changeset
   102
2689
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2369
diff changeset
   103
    def clear(self):
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2369
diff changeset
   104
        self._tagdefs.clear()
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2369
diff changeset
   105
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   106
    def _get_keys(self, stype, rtype, otype, tagged):
5843
85c4d5334f2c [refactor] refactor rtag keys generations.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5424
diff changeset
   107
        keys = []
85c4d5334f2c [refactor] refactor rtag keys generations.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5424
diff changeset
   108
        if '*' not in (stype, otype):
85c4d5334f2c [refactor] refactor rtag keys generations.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5424
diff changeset
   109
            keys.append(('*', rtype, '*', tagged))
85c4d5334f2c [refactor] refactor rtag keys generations.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5424
diff changeset
   110
        if '*' != stype:
85c4d5334f2c [refactor] refactor rtag keys generations.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5424
diff changeset
   111
            keys.append(('*', rtype, otype, tagged))
85c4d5334f2c [refactor] refactor rtag keys generations.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5424
diff changeset
   112
        if '*' != otype:
85c4d5334f2c [refactor] refactor rtag keys generations.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5424
diff changeset
   113
            keys.append((stype, rtype, '*', tagged))
85c4d5334f2c [refactor] refactor rtag keys generations.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5424
diff changeset
   114
        keys.append((stype, rtype, otype, tagged))
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   115
        return keys
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1356
diff changeset
   116
1769
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
   117
    def init(self, schema, check=True):
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   118
        # XXX check existing keys against schema
1769
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
   119
        if check:
10686
a08d5a657836 [py3k] add list() around dict methods
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10612
diff changeset
   120
            for (stype, rtype, otype, tagged), value in list(self._tagdefs.items()):
1769
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
   121
                for ertype in (stype, rtype, otype):
11885
e93a01a69035 [cleanup] flake8 rtags.py
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11870
diff changeset
   122
                    if ertype != '*' and ertype not in schema:
1769
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
   123
                        self.warning('removing rtag %s: %s, %s undefined in schema',
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
   124
                                     (stype, rtype, otype, tagged), value, ertype)
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
   125
                        self.del_rtag(stype, rtype, otype, tagged)
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
   126
                        break
11888
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   127
        if self._parent is None and self._init is not None:
8666
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
   128
            self.apply(schema, self._init)
4364
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   129
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   130
    def apply(self, schema, func):
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   131
        for eschema in schema.entities():
6899
e592fb8ee27b [rtags] speepup initialization by avoiding to get file entity types relations (useless)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6246
diff changeset
   132
            if eschema.final:
e592fb8ee27b [rtags] speepup initialization by avoiding to get file entity types relations (useless)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6246
diff changeset
   133
                continue
4364
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   134
            for rschema, tschemas, role in eschema.relation_definitions(True):
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   135
                for tschema in tschemas:
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   136
                    if role == 'subject':
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   137
                        sschema, oschema = eschema, tschema
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   138
                    else:
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   139
                        sschema, oschema = tschema, eschema
8666
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
   140
                    func(sschema, rschema, oschema, role)
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   141
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   142
    # rtag declaration api ####################################################
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   143
11888
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   144
    def derive(self, module, select):
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   145
        """Return a derivated of this relation tag, associated to given module and selector.
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   146
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   147
        This derivated will hold a set of specific rules but delegate to its "parent" relation tags
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   148
        for unfound keys.
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   149
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   150
        >>> class_afs = uicfg.autoform_section.derive(__name__, is_instance('Class'))
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   151
        """
11932
7b2247098f58 [rtags] pass module name to RegistrableInstance
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11888
diff changeset
   152
        copied = self.__class__(self, __module__=__name__)
11888
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   153
        copied.__module__ = module
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   154
        copied.__select__ = select
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   155
        return copied
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   156
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   157
    def tag_attribute(self, key, *args, **kwargs):
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   158
        key = list(key)
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   159
        key.append('*')
4339
fe93b670343d some fixes so that deprecation warning are properly localized
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   160
        key.append('subject')
fe93b670343d some fixes so that deprecation warning are properly localized
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   161
        self.tag_relation(key, *args, **kwargs)
1548
bd225e776739 new tag_attribute convenience method
sylvain.thenault@logilab.fr
parents: 1533
diff changeset
   162
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   163
    def tag_subject_of(self, key, *args, **kwargs):
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   164
        key = list(key)
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   165
        key.append('subject')
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   166
        self.tag_relation(key, *args, **kwargs)
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   167
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   168
    def tag_object_of(self, key, *args, **kwargs):
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   169
        key = list(key)
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   170
        key.append('object')
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   171
        self.tag_relation(key, *args, **kwargs)
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   172
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   173
    def tag_relation(self, key, tag):
4391
bd8480824e0b ensure we get a correct key
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4364
diff changeset
   174
        assert len(key) == 4, 'bad key: %s' % list(key)
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   175
        if self._allowed_values is not None:
1859
b068abd45a1c nicer error message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1849
diff changeset
   176
            assert tag in self._allowed_values, \
11885
e93a01a69035 [cleanup] flake8 rtags.py
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11870
diff changeset
   177
                '%r is not an allowed tag (should be in %s)' % (
e93a01a69035 [cleanup] flake8 rtags.py
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11870
diff changeset
   178
                    tag, self._allowed_values)
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   179
        self._tagdefs[_ensure_str_key(key)] = tag
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   180
        return tag
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   181
8667
5a394fc419b4 [web/uihelper,uicfg] transform uihelper functions into uicfg objects methods (closes #2543949)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8666
diff changeset
   182
    def _tag_etype_attr(self, etype, attr, desttype='*', *args, **kwargs):
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12212
diff changeset
   183
        if isinstance(attr, str):
8667
5a394fc419b4 [web/uihelper,uicfg] transform uihelper functions into uicfg objects methods (closes #2543949)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8666
diff changeset
   184
            attr, role = attr, 'subject'
5a394fc419b4 [web/uihelper,uicfg] transform uihelper functions into uicfg objects methods (closes #2543949)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8666
diff changeset
   185
        else:
5a394fc419b4 [web/uihelper,uicfg] transform uihelper functions into uicfg objects methods (closes #2543949)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8666
diff changeset
   186
            attr, role = attr
5a394fc419b4 [web/uihelper,uicfg] transform uihelper functions into uicfg objects methods (closes #2543949)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8666
diff changeset
   187
        if role == 'subject':
5a394fc419b4 [web/uihelper,uicfg] transform uihelper functions into uicfg objects methods (closes #2543949)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8666
diff changeset
   188
            self.tag_subject_of((etype, attr, desttype), *args, **kwargs)
5a394fc419b4 [web/uihelper,uicfg] transform uihelper functions into uicfg objects methods (closes #2543949)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8666
diff changeset
   189
        else:
5a394fc419b4 [web/uihelper,uicfg] transform uihelper functions into uicfg objects methods (closes #2543949)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8666
diff changeset
   190
            self.tag_object_of((desttype, attr, etype), *args, **kwargs)
5a394fc419b4 [web/uihelper,uicfg] transform uihelper functions into uicfg objects methods (closes #2543949)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8666
diff changeset
   191
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   192
    # rtag runtime api ########################################################
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   193
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   194
    def del_rtag(self, *key):
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   195
        del self._tagdefs[key]
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   196
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   197
    def get(self, *key):
11888
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   198
        """Return value for the given key, by looking from the most specific key to the more
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   199
        generic (using '*' wildcards). For each key, look into this rtag and its parent rtags.
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   200
        """
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   201
        for key in reversed(self._get_keys(*key)):
11888
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   202
            for rtag in rtags_chain(self):
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   203
                try:
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   204
                    return rtag._tagdefs[key]
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   205
                except KeyError:
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   206
                    continue
1148
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   207
        return None
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1356
diff changeset
   208
1721
694f6a50e138 final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents: 1548
diff changeset
   209
    def etype_get(self, etype, rtype, role, ttype='*'):
694f6a50e138 final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents: 1548
diff changeset
   210
        if role == 'subject':
694f6a50e138 final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents: 1548
diff changeset
   211
            return self.get(etype, rtype, ttype, role)
694f6a50e138 final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents: 1548
diff changeset
   212
        return self.get(ttype, rtype, etype, role)
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   213
7083
b8e35cde46e9 help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6900
diff changeset
   214
    # these are overridden by set_log_methods below
b8e35cde46e9 help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6900
diff changeset
   215
    # only defining here to prevent pylint from complaining
11885
e93a01a69035 [cleanup] flake8 rtags.py
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11870
diff changeset
   216
    info = warning = error = critical = exception = debug = lambda msg, *a, **kw: None
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   217
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1356
diff changeset
   218
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   219
class RelationTagsSet(RelationTags):
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   220
    """This class associates a set of tags to each key.
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   221
    """
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   222
    tag_container_cls = set
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   223
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   224
    def tag_relation(self, key, tag):
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   225
        rtags = self._tagdefs.setdefault(_ensure_str_key(key),
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   226
                                         self.tag_container_cls())
1148
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   227
        rtags.add(tag)
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   228
        return rtags
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1356
diff changeset
   229
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   230
    def get(self, stype, rtype, otype, tagged):
11888
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   231
        """Return value for the given key, which is an union of the values found from the most
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   232
        specific key to the more generic (using '*' wildcards). For each key, look into this rtag
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   233
        and its parent rtags.
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   234
        """
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   235
        rtags = self.tag_container_cls()
1721
694f6a50e138 final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents: 1548
diff changeset
   236
        for key in self._get_keys(stype, rtype, otype, tagged):
11888
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   237
            for rtag in rtags_chain(self):
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   238
                try:
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   239
                    rtags.update(rtag._tagdefs[key])
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   240
                    break
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   241
                except KeyError:
0849a5eb57b8 [rtags] Allow to 'derive' rtags
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11886
diff changeset
   242
                    continue
1148
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   243
        return rtags
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   244
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   245
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   246
class RelationTagsDict(RelationTagsSet):
11886
c5c041ba35b8 [rtags] Docstring fix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11885
diff changeset
   247
    """This class associates a dictionary to each key."""
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   248
    tag_container_cls = dict
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   249
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   250
    def tag_relation(self, key, tag):
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   251
        key = _ensure_str_key(key)
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   252
        try:
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   253
            rtags = self._tagdefs[key]
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   254
            rtags.update(tag)
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   255
            return rtags
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   256
        except KeyError:
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   257
            self._tagdefs[key] = tag
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   258
            return tag
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   259
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   260
    def setdefault(self, key, tagkey, tagvalue):
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   261
        key = _ensure_str_key(key)
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   262
        try:
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   263
            rtags = self._tagdefs[key]
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   264
            rtags.setdefault(tagkey, tagvalue)
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   265
            return rtags
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   266
        except KeyError:
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   267
            self._tagdefs[key] = {tagkey: tagvalue}
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   268
            return self._tagdefs[key]
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   269
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   270
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   271
class RelationTagsBool(RelationTags):
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   272
    _allowed_values = frozenset((True, False))
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   273
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   274
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   275
class NoTargetRelationTagsDict(RelationTagsDict):
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   276
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   277
    @property
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   278
    def name(self):
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   279
        return self.__class__.name
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   280
6900
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   281
    # tag_subject_of / tag_object_of issue warning if '*' is not given as target
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   282
    # type, while tag_relation handle it silently since it may be used during
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   283
    # initialization
6246
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   284
    def tag_subject_of(self, key, tag):
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   285
        subj, rtype, obj = key
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   286
        if obj != '*':
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   287
            self.warning('using explict target type in %s.tag_subject_of() '
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   288
                         'has no effect, use (%s, %s, "*") instead of (%s, %s, %s)',
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   289
                         self.name, subj, rtype, subj, rtype, obj)
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   290
        super(NoTargetRelationTagsDict, self).tag_subject_of((subj, rtype, '*'), tag)
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   291
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   292
    def tag_object_of(self, key, tag):
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   293
        subj, rtype, obj = key
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   294
        if subj != '*':
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   295
            self.warning('using explict subject type in %s.tag_object_of() '
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   296
                         'has no effect, use ("*", %s, %s) instead of (%s, %s, %s)',
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   297
                         self.name, rtype, obj, subj, rtype, obj)
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   298
        super(NoTargetRelationTagsDict, self).tag_object_of(('*', rtype, obj), tag)
62e25fac41cd [views/reledit] refactor composite handling
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6240
diff changeset
   299
6900
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   300
    def tag_relation(self, key, tag):
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   301
        if key[-1] == 'subject' and key[-2] != '*':
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   302
            if isinstance(key, tuple):
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   303
                key = list(key)
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   304
            key[-2] = '*'
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   305
        elif key[-1] == 'object' and key[0] != '*':
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   306
            if isinstance(key, tuple):
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   307
                key = list(key)
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   308
            key[0] = '*'
fcd4e6beec09 [rtags] fix NoTargetRelationTagsDict to ensure relation are tagged using '*' during initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6899
diff changeset
   309
        super(NoTargetRelationTagsDict, self).tag_relation(key, tag)
8666
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
   310
1dd655788ece make ui configurations selectable (closes #2406609)
Florent Cayré <florent.cayre@logilab.fr>
parents: 7083
diff changeset
   311
1740
2292ae32c98f warn and drop rtags not in schema, this may be intentional; drop possibility to not specify value for bool rtags
sylvain.thenault@logilab.fr
parents: 1739
diff changeset
   312
set_log_methods(RelationTags, logging.getLogger('cubicweb.rtags'))