cubicweb/hooks/metadata.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Fri, 30 Sep 2016 18:25:08 +0200
changeset 11767 432f87a63057
parent 11763 39df042f4ab4
child 11773 054a947b5415
permissions -rw-r--r--
flake8 and all * update some copyright * drop most __docformat__ declaration * fix some flake8 warnings / errors
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11767
432f87a63057 flake8 and all
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11763
diff changeset
     1
# copyright 2003-2016 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5066
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: 5066
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: 5066
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: 5066
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: 5066
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: 5066
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: 5066
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: 5066
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: 5066
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: 5066
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: 5066
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: 5066
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: 5066
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: 5066
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: 5066
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5782
8ff48d1a319f [rql2sql] when using HAVING to by-pass rql limitation (not to filter on result of an aggregat function), we should emit SQL that doesn't use HAVING to avoid potential backend error because variables are not grouped. Closes #1061603.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5514
diff changeset
    18
"""Core hooks: set generic metadata"""
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    19
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    20
from datetime import datetime
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    21
11034
75d752e6daf7 [server] improve TZDatetime support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11033
diff changeset
    22
from pytz import utc
75d752e6daf7 [server] improve TZDatetime support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11033
diff changeset
    23
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7879
diff changeset
    24
from cubicweb.predicates import is_instance
2841
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
    25
from cubicweb.server import hook
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    26
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    27
2841
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
    28
class MetaDataHook(hook.Hook):
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
    29
    __abstract__ = True
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
    30
    category = 'metadata'
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
    31
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
    32
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
    33
class InitMetaAttrsHook(MetaDataHook):
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    34
    """before create a new entity -> set creation and modification date
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    35
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    36
    this is a conveniency hook, you shouldn't have to disable it
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    37
    """
3376
f5c69485381f [appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2968
diff changeset
    38
    __regid__ = 'metaattrsinit'
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    39
    events = ('before_add_entity',)
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    40
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    41
    def __call__(self):
11034
75d752e6daf7 [server] improve TZDatetime support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11033
diff changeset
    42
        timestamp = datetime.now(utc)
6142
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
    43
        edited = self.entity.cw_edited
7708
45be3a9debe6 [datafeed] for datafeed source, we don't want commit in extid2eid but explicitly handled by the source. Also, we should use 'safe' internal session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7683
diff changeset
    44
        if not edited.get('creation_date'):
45be3a9debe6 [datafeed] for datafeed source, we don't want commit in extid2eid but explicitly handled by the source. Also, we should use 'safe' internal session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7683
diff changeset
    45
            edited['creation_date'] = timestamp
45be3a9debe6 [datafeed] for datafeed source, we don't want commit in extid2eid but explicitly handled by the source. Also, we should use 'safe' internal session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7683
diff changeset
    46
        if not edited.get('modification_date'):
45be3a9debe6 [datafeed] for datafeed source, we don't want commit in extid2eid but explicitly handled by the source. Also, we should use 'safe' internal session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7683
diff changeset
    47
            edited['modification_date'] = timestamp
9774
b7b71be569cf deprecate get/set_shared_data API
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9617
diff changeset
    48
        if not self._cw.transaction_data.get('do-not-insert-cwuri'):
6955
a6c32edabc8d [entity, metadata] huuum, use resolvable url as cwuri... And fix existing ones.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6427
diff changeset
    49
            cwuri = u'%s%s' % (self._cw.base_url(), self.entity.eid)
6142
8bc6eac1fac1 [session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
    50
            edited.setdefault('cwuri', cwuri)
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    51
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    52
2841
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
    53
class UpdateMetaAttrsHook(MetaDataHook):
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    54
    """update an entity -> set modification date"""
3376
f5c69485381f [appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2968
diff changeset
    55
    __regid__ = 'metaattrsupdate'
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    56
    events = ('before_update_entity',)
2841
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
    57
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    58
    def __call__(self):
4578
060c91ced72f don't update modification_date in repairing_mode (eg upgrade or shell)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4307
diff changeset
    59
        # repairing is true during c-c upgrade/shell and similar commands. We
060c91ced72f don't update modification_date in repairing_mode (eg upgrade or shell)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4307
diff changeset
    60
        # usually don't want to update modification date in such cases.
060c91ced72f don't update modification_date in repairing_mode (eg upgrade or shell)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4307
diff changeset
    61
        #
060c91ced72f don't update modification_date in repairing_mode (eg upgrade or shell)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4307
diff changeset
    62
        # XXX to be really clean, we should turn off modification_date update
060c91ced72f don't update modification_date in repairing_mode (eg upgrade or shell)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4307
diff changeset
    63
        # explicitly on each command where we do not want that behaviour.
060c91ced72f don't update modification_date in repairing_mode (eg upgrade or shell)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4307
diff changeset
    64
        if not self._cw.vreg.config.repairing:
11034
75d752e6daf7 [server] improve TZDatetime support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11033
diff changeset
    65
            self.entity.cw_edited.setdefault('modification_date', datetime.now(utc))
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    66
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    67
6426
541659c39f6a [hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    68
class SetCreatorOp(hook.DataOperationMixIn, hook.Operation):
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    69
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    70
    def precommit_event(self):
9617
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
    71
        cnx = self.cnx
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
    72
        relations = [(eid, cnx.user.eid) for eid in self.get_data()
7336
0c8c386d653b enhanced comment
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    73
                # don't consider entities that have been created and deleted in
0c8c386d653b enhanced comment
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    74
                # the same transaction, nor ones where created_by has been
0c8c386d653b enhanced comment
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    75
                # explicitly set
9617
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
    76
                if not cnx.deleted_in_transaction(eid) and \
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
    77
                   not cnx.entity_from_eid(eid).created_by]
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
    78
        cnx.add_relations([('created_by', relations)])
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    79
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    80
2841
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
    81
class SetOwnershipHook(MetaDataHook):
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    82
    """create a new entity -> set owner and creator metadata"""
3376
f5c69485381f [appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2968
diff changeset
    83
    __regid__ = 'setowner'
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    84
    events = ('after_add_entity',)
2841
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
    85
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    86
    def __call__(self):
4835
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4813
diff changeset
    87
        if not self._cw.is_internal_session:
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4813
diff changeset
    88
            self._cw.add_relation(self.entity.eid, 'owned_by', self._cw.user.eid)
6426
541659c39f6a [hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    89
            SetCreatorOp.get_instance(self._cw).add_data(self.entity.eid)
541659c39f6a [hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    90
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    91
6426
541659c39f6a [hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    92
class SyncOwnersOp(hook.DataOperationMixIn, hook.Operation):
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    93
    def precommit_event(self):
6426
541659c39f6a [hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    94
        for compositeeid, composedeid in self.get_data():
10182
116b24efad0e [hooks] don't insert an owned_by relation for deleted entities
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
    95
            if self.cnx.deleted_in_transaction(compositeeid):
116b24efad0e [hooks] don't insert an owned_by relation for deleted entities
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
    96
                continue
116b24efad0e [hooks] don't insert an owned_by relation for deleted entities
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
    97
            if self.cnx.deleted_in_transaction(composedeid):
116b24efad0e [hooks] don't insert an owned_by relation for deleted entities
Julien Cristau <julien.cristau@logilab.fr>
parents: 9774
diff changeset
    98
                continue
9617
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
    99
            self.cnx.execute('SET X owned_by U WHERE C owned_by U, C eid %(c)s,'
5448
9bf648d678cd [hooks/operations] use set_operations for three ops (huge gains for massive imports)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5426
diff changeset
   100
                                 'NOT EXISTS(X owned_by U, X eid %(x)s)',
9bf648d678cd [hooks/operations] use set_operations for three ops (huge gains for massive imports)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5426
diff changeset
   101
                                 {'c': compositeeid, 'x': composedeid})
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   102
2841
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
   103
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
   104
class SyncCompositeOwner(MetaDataHook):
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   105
    """when adding composite relation, the composed should have the same owners
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   106
    has the composite
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   107
    """
3376
f5c69485381f [appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2968
diff changeset
   108
    __regid__ = 'synccompositeowner'
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   109
    events = ('after_add_relation',)
2841
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
   110
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   111
    def __call__(self):
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   112
        if self.rtype == 'wf_info_for':
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   113
            # skip this special composite relation # XXX (syt) why?
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   114
            return
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   115
        eidfrom, eidto = self.eidfrom, self.eidto
7502
e7190f7e850e [session] deprecates schema_rproperty in favor of more optimized rtype_eids_rdef which return the rdef (so reusable to gather other data)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
   116
        composite = self._cw.rtype_eids_rdef(self.rtype, eidfrom, eidto).composite
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   117
        if composite == 'subject':
6426
541659c39f6a [hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
   118
            SyncOwnersOp.get_instance(self._cw).add_data( (eidfrom, eidto) )
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   119
        elif composite == 'object':
6426
541659c39f6a [hook/operation] nicer api to achieve same result as set_operation, as described in #1253630
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
   120
            SyncOwnersOp.get_instance(self._cw).add_data( (eidto, eidfrom) )
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   121
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   122
2841
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
   123
class FixUserOwnershipHook(MetaDataHook):
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   124
    """when a user has been created, add owned_by relation on itself"""
3376
f5c69485381f [appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2968
diff changeset
   125
    __regid__ = 'fixuserowner'
5877
0c7b7b76a84f [selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5782
diff changeset
   126
    __select__ = MetaDataHook.__select__ & is_instance('CWUser')
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   127
    events = ('after_add_entity',)
2841
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
   128
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   129
    def __call__(self):
2847
c2ee28f4d4b1 use ._cw instead of .cw_req
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2841
diff changeset
   130
        self._cw.add_relation(self.entity.eid, 'owned_by', self.entity.eid)
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   131
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   132
2841
107ba1c45227 rewrite hooks in sobjects as new Hook style into hooks sub-package
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2835
diff changeset
   133
class UpdateFTIHook(MetaDataHook):
4806
4f12f59b1a13 [fti] refactor and fix full text indexation handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4578
diff changeset
   134
    """sync fulltext index text index container when a relation with
4f12f59b1a13 [fti] refactor and fix full text indexation handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4578
diff changeset
   135
    fulltext_container set is added / removed
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   136
    """
3376
f5c69485381f [appobjects] use __regid__ instead of __id__, more explicit
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2968
diff changeset
   137
    __regid__ = 'updateftirel'
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   138
    events = ('after_add_relation', 'after_delete_relation')
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   139
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   140
    def __call__(self):
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   141
        rtype = self.rtype
9617
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
   142
        cnx = self._cw
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
   143
        ftcontainer = cnx.vreg.schema.rschema(rtype).fulltext_container
5514
3679015c0a50 [fti] simplify UpdateFTIHook code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5449
diff changeset
   144
        if ftcontainer == 'subject':
9617
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
   145
            cnx.repo.system_source.index_entity(
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
   146
                cnx, cnx.entity_from_eid(self.eidfrom))
4806
4f12f59b1a13 [fti] refactor and fix full text indexation handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4578
diff changeset
   147
        elif ftcontainer == 'object':
9617
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
   148
            cnx.repo.system_source.index_entity(
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
   149
                cnx, cnx.entity_from_eid(self.eidto))
2835
04034421b072 [hooks] major refactoring:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   150
7399
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   151
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   152
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   153
# entity source handling #######################################################
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   154
9296
8a4175557426 [metadata hook] rename an operation for the sake of readability
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8900
diff changeset
   155
class ChangeEntitySourceUpdateCaches(hook.Operation):
11763
39df042f4ab4 [repository] Drop type_and_source_from_eid and rename related cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11757
diff changeset
   156
    oldsource = entity = None # make pylint happy
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7708
diff changeset
   157
7399
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   158
    def postcommit_event(self):
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   159
        self.oldsource.reset_caches()
9617
498ee8ef79e1 [hooks/metadata] use a cnx not a session
Julien Cristau <julien.cristau@logilab.fr>
parents: 9469
diff changeset
   160
        repo = self.cnx.repo
7399
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   161
        entity = self.entity
11763
39df042f4ab4 [repository] Drop type_and_source_from_eid and rename related cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11757
diff changeset
   162
        repo._type_extid_cache[entity.eid] = (entity.cw_etype, None)
9448
3e7cad3967c5 [multi-sources-removal] Drop the "true" multi-sources planner
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9296
diff changeset
   163
7399
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   164
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   165
class ChangeEntitySourceDeleteHook(MetaDataHook):
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   166
    """support for moving an entity from an external source by watching 'Any
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   167
    cw_source CWSource' relation
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   168
    """
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   169
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   170
    __regid__ = 'cw.metadata.source-change'
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   171
    __select__ = MetaDataHook.__select__ & hook.match_rtype('cw_source')
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   172
    events = ('before_delete_relation',)
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   173
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   174
    def __call__(self):
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   175
        if (self._cw.deleted_in_transaction(self.eidfrom)
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   176
            or self._cw.deleted_in_transaction(self.eidto)):
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   177
            return
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   178
        schange = self._cw.transaction_data.setdefault('cw_source_change', {})
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   179
        schange[self.eidfrom] = self.eidto
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   180
7543
570522300e22 [ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7514
diff changeset
   181
7399
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   182
class ChangeEntitySourceAddHook(MetaDataHook):
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   183
    __regid__ = 'cw.metadata.source-change'
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   184
    __select__ = MetaDataHook.__select__ & hook.match_rtype('cw_source')
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   185
    events = ('before_add_relation',)
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   186
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   187
    def __call__(self):
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   188
        schange = self._cw.transaction_data.get('cw_source_change')
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   189
        if schange is not None and self.eidfrom in schange:
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   190
            newsource = self._cw.entity_from_eid(self.eidto)
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   191
            if newsource.name != 'system':
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   192
                raise Exception('changing source to something else than the '
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   193
                                'system source is unsupported')
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   194
            syssource = newsource.repo_source
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   195
            oldsource = self._cw.entity_from_eid(schange[self.eidfrom])
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   196
            entity = self._cw.entity_from_eid(self.eidfrom)
8900
010a59e12d89 use cw_etype instead of __regid__
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8544
diff changeset
   197
            attrs = {'type': entity.cw_etype, 'eid': entity.eid, 'extid': None,
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9450
diff changeset
   198
                     'asource': 'system'}
10209
4c64a41c0a1d Use a moved_entities table to record external entities moved to the system source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10182
diff changeset
   199
            self._cw.system_sql(syssource.sqlgen.update('entities', attrs, ['eid']), attrs)
7399
972ed1843bd8 [multi-sources] support for moving an entity from an external source (closes #343818)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7336
diff changeset
   200
            # register an operation to update repository/sources caches
9296
8a4175557426 [metadata hook] rename an operation for the sake of readability
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8900
diff changeset
   201
            ChangeEntitySourceUpdateCaches(self._cw, entity=entity,
11763
39df042f4ab4 [repository] Drop type_and_source_from_eid and rename related cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11757
diff changeset
   202
                                           oldsource=oldsource.repo_source)