rtags.py
author Alexandre Fayolle <alexandre.fayolle@logilab.fr>
Mon, 26 Apr 2010 17:55:36 +0200
branchstable
changeset 5410 3cccd5e9dd7d
parent 5314 86e5abbebfaf
child 5421 8167de96c523
permissions -rw-r--r--
cubicweb-ctl create improvements * list sqlserver2005 as supported database * tell that each name must have a unique name * pass the input level to other sources that we want to configure
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4931
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
     1
#:organization: Logilab
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
     2
#:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
     3
#:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
     4
#:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
     5
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
     6
"""
5314
86e5abbebfaf [doc/book] refresh the autoform section with uicfg content (moved there)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4931
diff changeset
     7
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
     8
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
     9
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
    10
get the section to display relations.
4931
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    11
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    12
.. sourcecode:: python
1152
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    13
4931
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    14
   # 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
    15
   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
    16
                                             'relations')
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    17
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    18
   # 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
    19
   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
    20
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    21
Three primitives are defined:
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    22
   * ``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
    23
   * ``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
    24
   * ``tag_attribute`` shortcut for tag_subject_of
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    25
92c9d0a5dc11 improve documentation for uicfg and rtags
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 4391
diff changeset
    26
1152
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    27
"""
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    28
__docformat__ = "restructuredtext en"
1148
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
    29
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
    30
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
    31
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
    32
from logilab.common.logging_ext import set_log_methods
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
    33
1752
4b0b912ff5b7 fix rtags initialization: do it at the registry level to avoid multiple initialization of the same rtag
sylvain.thenault@logilab.fr
parents: 1748
diff changeset
    34
RTAGS = []
4b0b912ff5b7 fix rtags initialization: do it at the registry level to avoid multiple initialization of the same rtag
sylvain.thenault@logilab.fr
parents: 1748
diff changeset
    35
def register_rtag(rtag):
4b0b912ff5b7 fix rtags initialization: do it at the registry level to avoid multiple initialization of the same rtag
sylvain.thenault@logilab.fr
parents: 1748
diff changeset
    36
    RTAGS.append(rtag)
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    37
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
    38
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
    39
    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
    40
1148
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
    41
class RelationTags(object):
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    42
    """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
    43
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    44
         (subject type, relation type, object type, tagged)
1152
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    45
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    46
    allowing to set tags using wildcard (eg '*') as subject type / object type
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    47
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    48
    This class associates a single tag to each key.
1152
c99ef2a2535c cleanup
sylvain.thenault@logilab.fr
parents: 1148
diff changeset
    49
    """
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
    50
    _allowed_values = None
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
    51
    _initfunc = None
1849
1901fa97f521 give a name to rtags instance to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1769
diff changeset
    52
    def __init__(self, name=None, initfunc=None, allowed_values=None):
1901fa97f521 give a name to rtags instance to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1769
diff changeset
    53
        self._name = name or '<unknown>'
1148
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
    54
        self._tagdefs = {}
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
    55
        if allowed_values is not None:
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
    56
            self._allowed_values = allowed_values
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
    57
        if initfunc is not None:
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
    58
            self._initfunc = initfunc
1752
4b0b912ff5b7 fix rtags initialization: do it at the registry level to avoid multiple initialization of the same rtag
sylvain.thenault@logilab.fr
parents: 1748
diff changeset
    59
        register_rtag(self)
1769
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
    60
1528
864ae7c15ef5 other fixlets
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1451
diff changeset
    61
    def __repr__(self):
1849
1901fa97f521 give a name to rtags instance to ease debugging
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1769
diff changeset
    62
        return '%s: %s' % (self._name, repr(self._tagdefs))
1528
864ae7c15ef5 other fixlets
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1451
diff changeset
    63
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    64
    # dict compat
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    65
    def __getitem__(self, key):
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    66
        return self.get(*key)
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    67
    __contains__ = __getitem__
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1356
diff changeset
    68
2689
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2369
diff changeset
    69
    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
    70
        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
    71
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
    72
    def _get_keys(self, stype, rtype, otype, tagged):
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
    73
        keys = [('*', rtype, '*', tagged),
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
    74
                ('*', rtype, otype, tagged),
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
    75
                (stype, rtype, '*', tagged),
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
    76
                (stype, rtype, otype, tagged)]
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    77
        if stype == '*' or otype == '*':
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
    78
            keys.remove( ('*', rtype, '*', tagged) )
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    79
            if stype == '*':
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
    80
                keys.remove( ('*', rtype, otype, tagged) )
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    81
            if otype == '*':
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
    82
                keys.remove( (stype, rtype, '*', tagged) )
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
    83
        return keys
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1356
diff changeset
    84
1769
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
    85
    def init(self, schema, check=True):
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
    86
        # XXX check existing keys against schema
1769
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
    87
        if check:
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
    88
            for (stype, rtype, otype, tagged), value in self._tagdefs.items():
1769
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
    89
                for ertype in (stype, rtype, otype):
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
    90
                    if ertype != '*' and not ertype in schema:
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
    91
                        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
    92
                                     (stype, rtype, otype, tagged), value, ertype)
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
    93
                        self.del_rtag(stype, rtype, otype, tagged)
fb91d2b8a441 fix some rtags pb on i18n catalog generation
sylvain.thenault@logilab.fr
parents: 1752
diff changeset
    94
                        break
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
    95
        if self._initfunc is not None:
4364
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
    96
            self.apply(schema, self._initfunc)
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
    97
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
    98
    def apply(self, schema, func):
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
    99
        for eschema in schema.entities():
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   100
            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
   101
                for tschema in tschemas:
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   102
                    if role == 'subject':
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   103
                        sschema, oschema = eschema, tschema
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   104
                    else:
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   105
                        sschema, oschema = tschema, eschema
766359c69f2f [uicfg] fix autoform_section rtags initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4339
diff changeset
   106
                    func(self, sschema, rschema, oschema, role)
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   107
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   108
    # rtag declaration api ####################################################
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   109
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   110
    def tag_attribute(self, key, *args, **kwargs):
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   111
        key = list(key)
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   112
        key.append('*')
4339
fe93b670343d some fixes so that deprecation warning are properly localized
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   113
        key.append('subject')
fe93b670343d some fixes so that deprecation warning are properly localized
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   114
        self.tag_relation(key, *args, **kwargs)
1548
bd225e776739 new tag_attribute convenience method
sylvain.thenault@logilab.fr
parents: 1533
diff changeset
   115
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   116
    def tag_subject_of(self, key, *args, **kwargs):
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   117
        key = list(key)
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   118
        key.append('subject')
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   119
        self.tag_relation(key, *args, **kwargs)
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   120
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   121
    def tag_object_of(self, key, *args, **kwargs):
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   122
        key = list(key)
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   123
        key.append('object')
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   124
        self.tag_relation(key, *args, **kwargs)
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   125
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   126
    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
   127
        assert len(key) == 4, 'bad key: %s' % list(key)
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   128
        if self._allowed_values is not None:
1859
b068abd45a1c nicer error message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1849
diff changeset
   129
            assert tag in self._allowed_values, \
b068abd45a1c nicer error message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1849
diff changeset
   130
                   '%r is not an allowed tag (should be in %s)' % (
b068abd45a1c nicer error message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1849
diff changeset
   131
                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
   132
        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
   133
        return tag
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   134
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   135
    # rtag runtime api ########################################################
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   136
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   137
    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
   138
        del self._tagdefs[key]
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   139
3473
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   140
    def get(self, *key):
d8bc02158efc [rtags] ease overriding
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3472
diff changeset
   141
        for key in reversed(self._get_keys(*key)):
1148
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   142
            try:
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   143
                return self._tagdefs[key]
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   144
            except KeyError:
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   145
                continue
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   146
        return None
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1356
diff changeset
   147
1721
694f6a50e138 final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents: 1548
diff changeset
   148
    def etype_get(self, etype, rtype, role, ttype='*'):
694f6a50e138 final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents: 1548
diff changeset
   149
        if role == 'subject':
694f6a50e138 final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents: 1548
diff changeset
   150
            return self.get(etype, rtype, ttype, role)
694f6a50e138 final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents: 1548
diff changeset
   151
        return self.get(ttype, rtype, etype, role)
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   152
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   153
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1356
diff changeset
   154
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   155
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
   156
    """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
   157
    """
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   158
    tag_container_cls = set
1533
bcd4bfff658b update rtags api
sylvain.thenault@logilab.fr
parents: 1528
diff changeset
   159
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   160
    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
   161
        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
   162
                                         self.tag_container_cls())
1148
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   163
        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
   164
        return rtags
1451
982e8616d9a2 delete-trailing-whitespaces
sylvain.thenault@logilab.fr
parents: 1356
diff changeset
   165
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   166
    def get(self, stype, rtype, otype, tagged):
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   167
        rtags = self.tag_container_cls()
1721
694f6a50e138 final rtags api (eventually :$)
sylvain.thenault@logilab.fr
parents: 1548
diff changeset
   168
        for key in self._get_keys(stype, rtype, otype, tagged):
1148
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   169
            try:
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   170
                rtags.update(self._tagdefs[key])
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   171
            except KeyError:
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   172
                continue
55a8238f8f7c keep notion of relation tags, tough with simplier implementation and usage
sylvain.thenault@logilab.fr
parents:
diff changeset
   173
        return rtags
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   174
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   175
2369
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   176
class RelationTagsDict(RelationTagsSet):
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   177
    """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
   178
    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
   179
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   180
    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
   181
        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
   182
        try:
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   183
            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
   184
            rtags.update(tag)
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   185
            return rtags
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   186
        except KeyError:
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   187
            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
   188
            return tag
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   189
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   190
    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
   191
        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
   192
        try:
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   193
            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
   194
            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
   195
            return rtags
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   196
        except KeyError:
3472
5345570eefc6 [rtags] make internal key order consistent with api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2689
diff changeset
   197
            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
   198
            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
   199
5a2b8ed266ca new RelationTagsDict class, use it in uicfg where necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   200
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   201
class RelationTagsBool(RelationTags):
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   202
    _allowed_values = frozenset((True, False))
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   203
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   204
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
   205
set_log_methods(RelationTags, logging.getLogger('cubicweb.rtags'))