cubicweb/server/session.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Fri, 05 Apr 2019 17:58:19 +0200
changeset 12567 26744ad37953
parent 12542 85194bd49119
child 12740 6e98699d3a9a
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:
11919
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
     1
# copyright 2003-2017 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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
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: 5226
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5701
41119f034735 [querier] fix rset description bug with some union queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    18
"""Repository users' and internal' sessions."""
11767
432f87a63057 flake8 and all
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11765
diff changeset
    19
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    20
import functools
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
import sys
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    22
from uuid import uuid4
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
    23
from contextlib import contextmanager
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    24
from logging import getLogger
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    25
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    26
from logilab.common.registry import objectify_predicate
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    27
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    28
from cubicweb import QueryError, ProgrammingError, schema, server
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    29
from cubicweb import set_log_methods
2792
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
    30
from cubicweb.req import RequestSessionBase
3240
8604a15995d1 refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3198
diff changeset
    31
from cubicweb.rqlrewrite import RQLRewriter
7119
8b29c4c2ffc6 [repository] fix crash in optimized [add|remove]_relation w/ inlined relation (broken by cw 3.10 refactoring)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7118
diff changeset
    32
from cubicweb.server.edition import EditedEntity
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    33
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    34
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    35
NO_UNDO_TYPES = schema.SCHEMA_TYPES.copy()
11901
afd7657a6d65 Never record undo information for session or data import
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11824
diff changeset
    36
NO_UNDO_TYPES.add('CWSession')
afd7657a6d65 Never record undo information for session or data import
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11824
diff changeset
    37
NO_UNDO_TYPES.add('CWDataImport')
5074
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    38
# is / is_instance_of are usually added by sql hooks except when using
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    39
# dataimport.NoHookRQLObjectStore, and we don't want to record them
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    40
# anyway in the later case
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    41
NO_UNDO_TYPES.add('is')
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    42
NO_UNDO_TYPES.add('is_instance_of')
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6401
diff changeset
    43
NO_UNDO_TYPES.add('cw_source')
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    44
# XXX rememberme,forgotpwd,apycot,vcsfile
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    45
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    46
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    47
@objectify_predicate
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    48
def is_user_session(cls, req, **kwargs):
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    49
    """return 1 when session is not internal.
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    50
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    51
    This predicate can only be used repository side only. """
7330
584907154ce3 [session selector] missing not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7329
diff changeset
    52
    return not req.is_internal_session
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    53
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    54
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    55
@objectify_predicate
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    56
def is_internal_session(cls, req, **kwargs):
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    57
    """return 1 when session is not internal.
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    58
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    59
    This predicate can only be used repository side only. """
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    60
    return req.is_internal_session
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    61
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    62
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    63
@objectify_predicate
7500
cb0f4da64e86 [repository] new hook selector according to configuration's repairing flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7451
diff changeset
    64
def repairing(cls, req, **kwargs):
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    65
    """return 1 when repository is running in repair mode"""
7500
cb0f4da64e86 [repository] new hook selector according to configuration's repairing flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7451
diff changeset
    66
    return req.vreg.config.repairing
cb0f4da64e86 [repository] new hook selector according to configuration's repairing flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7451
diff changeset
    67
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    68
10362
ec8c233ce54b [session] remove session-related bw compat code
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10361
diff changeset
    69
class _hooks_control(object):
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    70
    """context manager to control activated hooks categories.
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    71
9557
a3c075fe9385 [server/session] fix a couple typos in doc strings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9543
diff changeset
    72
    If mode is `HOOKS_DENY_ALL`, given hooks categories will
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    73
    be enabled.
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    74
9025
768eb9a6a2db [session] update _hook_control docstring
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9024
diff changeset
    75
    If mode is `HOOKS_ALLOW_ALL`, given hooks categories will
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    76
    be disabled.
6147
95c604ec89bf update documentation to follow 6142:8bc6eac1fac1 changes. Try to make it better and move most doc with code on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    77
95c604ec89bf update documentation to follow 6142:8bc6eac1fac1 changes. Try to make it better and move most doc with code on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    78
    .. sourcecode:: python
95c604ec89bf update documentation to follow 6142:8bc6eac1fac1 changes. Try to make it better and move most doc with code on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    79
9025
768eb9a6a2db [session] update _hook_control docstring
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9024
diff changeset
    80
       with _hooks_control(cnx, HOOKS_ALLOW_ALL, 'integrity'):
6147
95c604ec89bf update documentation to follow 6142:8bc6eac1fac1 changes. Try to make it better and move most doc with code on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    81
           # ... do stuff with all but 'integrity' hooks activated
95c604ec89bf update documentation to follow 6142:8bc6eac1fac1 changes. Try to make it better and move most doc with code on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    82
9025
768eb9a6a2db [session] update _hook_control docstring
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9024
diff changeset
    83
       with _hooks_control(cnx, HOOKS_DENY_ALL, 'integrity'):
6147
95c604ec89bf update documentation to follow 6142:8bc6eac1fac1 changes. Try to make it better and move most doc with code on the way
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6142
diff changeset
    84
           # ... do stuff with none but 'integrity' hooks activated
8561
77ea3eed9946 [session] promote usage of [deny|all]_all_hooks_but session methods rather than hooks_control context manager directly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8554
diff changeset
    85
9557
a3c075fe9385 [server/session] fix a couple typos in doc strings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9543
diff changeset
    86
    This is an internal API, you should rather use
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
    87
    :meth:`~cubicweb.server.session.Connection.deny_all_hooks_but` or
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
    88
    :meth:`~cubicweb.server.session.Connection.allow_all_hooks_but`
9557
a3c075fe9385 [server/session] fix a couple typos in doc strings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9543
diff changeset
    89
    Connection methods.
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    90
    """
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
    91
    def __init__(self, cnx, mode, *categories):
8814
37fd037c0526 [session] move context manager logic in the hook controls context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8813
diff changeset
    92
        assert mode in (HOOKS_ALLOW_ALL, HOOKS_DENY_ALL)
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
    93
        self.cnx = cnx
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    94
        self.mode = mode
11919
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
    95
        self.categories = set(categories)
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
    96
        self.old_mode = None
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
    97
        self.old_categories = None
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    98
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
    99
    def __enter__(self):
11919
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   100
        self.old_mode = self.cnx._hooks_mode
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   101
        self.old_categories = self.cnx._hooks_categories
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   102
        self.cnx._hooks_mode = self.mode
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   103
        self.cnx._hooks_categories = self.categories
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   104
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   105
    def __exit__(self, exctype, exc, traceback):
11919
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   106
        self.cnx._hooks_mode = self.old_mode
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   107
        self.cnx._hooks_categories = self.old_categories
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   108
7350
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7349
diff changeset
   109
8841
f62fb831cfe6 [session] make security_enabled API private
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8840
diff changeset
   110
class _security_enabled(object):
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
   111
    """context manager to control security w/ session.execute,
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
   112
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
   113
    By default security is disabled on queries executed on the repository
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: 4834
diff changeset
   114
    side.
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: 4834
diff changeset
   115
    """
9027
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   116
    def __init__(self, cnx, read=None, write=None):
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   117
        self.cnx = cnx
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: 4834
diff changeset
   118
        self.read = read
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: 4834
diff changeset
   119
        self.write = write
8816
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   120
        self.oldread = None
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   121
        self.oldwrite = None
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: 4834
diff changeset
   122
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: 4834
diff changeset
   123
    def __enter__(self):
8816
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   124
        if self.read is None:
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   125
            self.oldread = None
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   126
        else:
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   127
            self.oldread = self.cnx.read_security
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   128
            self.cnx.read_security = self.read
8816
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   129
        if self.write is None:
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   130
            self.oldwrite = None
fe321c0f6d13 [session] move context manager logic in the security context manager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8815
diff changeset
   131
        else:
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   132
            self.oldwrite = self.cnx.write_security
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   133
            self.cnx.write_security = self.write
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: 4834
diff changeset
   134
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: 4834
diff changeset
   135
    def __exit__(self, exctype, exc, traceback):
9027
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   136
        if self.oldread is not None:
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   137
            self.cnx.read_security = self.oldread
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   138
        if self.oldwrite is not None:
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   139
            self.cnx.write_security = self.oldwrite
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   140
11821
7534b32c45e3 Fix (new) flake8 errors
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11774
diff changeset
   141
8765
9e9029ba2d4e [session] Move hook control constants out of the class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8764
diff changeset
   142
HOOKS_ALLOW_ALL = object()
9e9029ba2d4e [session] Move hook control constants out of the class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8764
diff changeset
   143
HOOKS_DENY_ALL = object()
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   144
DEFAULT_SECURITY = object()  # evaluated to true by design
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   145
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   146
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   147
def _open_only(func):
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   148
    """decorator for Connection method that check it is open"""
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   149
    @functools.wraps(func)
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   150
    def check_open(cnx, *args, **kwargs):
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   151
        if not cnx._open:
12029
3d9883a6068f [session] Drop no more necessary Session.sessionid and Connection.connectionid
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12028
diff changeset
   152
            raise ProgrammingError('Closed Connection: %s' % cnx)
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   153
        return func(cnx, *args, **kwargs)
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   154
    return check_open
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
   155
9630
e7dbc4f06a48 minor cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9629
diff changeset
   156
9073
9574df1cd054 [Connection] inherit from RequestSessionBase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9052
diff changeset
   157
class Connection(RequestSessionBase):
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   158
    """Repository Connection
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   159
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   160
    Holds all connection related data
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   161
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   162
    Database connection resources:
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   163
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   164
      :attr:`hooks_in_progress`, boolean flag telling if the executing
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   165
      query is coming from a repoapi connection or is a query from
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   166
      within the repository (e.g. started by hooks)
8805
d91285fe7242 [transaction] initialize dbapi_request in __init__
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8790
diff changeset
   167
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   168
      :attr:`cnxset`, the connections set to use to execute queries on sources.
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   169
      If the transaction is read only, the connection set may be freed between
9402
2c48c091b6a2 merge 3.18.0 in 3.19 branch
Julien Cristau <julien.cristau@logilab.fr>
parents: 9123 9396
diff changeset
   170
      actual queries. This allows multiple connections with a reasonably low
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   171
      connection set pool size.  Control mechanism is detailed below.
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   172
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   173
    .. automethod:: cubicweb.server.session.Connection.set_cnxset
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   174
    .. automethod:: cubicweb.server.session.Connection.free_cnxset
8843
ea05b8545dd8 [session/transaction] handle cnxset repository logic in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8842
diff changeset
   175
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   176
      :attr:`mode`, string telling the connections set handling mode, may be one
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   177
      of 'read' (connections set may be freed), 'write' (some write was done in
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   178
      the connections set, it can't be freed before end of the transaction),
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   179
      'transaction' (we want to keep the connections set during all the
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   180
      transaction, with or without writing)
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   181
10347
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   182
    Shared data:
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   183
10347
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   184
      :attr:`data` is a dictionary bound to the underlying session,
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   185
      who will be present for the life time of the session. This may
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   186
      be useful for web clients that rely on the server for managing
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   187
      bits of session-scoped data.
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   188
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   189
      :attr:`transaction_data` is a dictionary cleared at the end of
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   190
      the transaction. Hooks and operations may put arbitrary data in
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   191
      there.
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   192
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   193
    Internal state:
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   194
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   195
      :attr:`pending_operations`, ordered list of operations to be processed on
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   196
      commit/rollback
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   197
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   198
      :attr:`commit_state`, describing the transaction commit state, may be one
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   199
      of None (not yet committing), 'precommit' (calling precommit event on
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   200
      operations), 'postcommit' (calling postcommit event on operations),
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   201
      'uncommitable' (some :exc:`ValidationError` or :exc:`Unauthorized` error
9267
24d9b86dfa54 spelling: rollbacked -> rolled back
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9240
diff changeset
   202
      has been raised during the transaction and so it must be rolled back).
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   203
8766
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   204
    Hooks controls:
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   205
11919
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   206
    .. automethod:: cubicweb.server.session.Connection.deny_all_hooks_but
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   207
    .. automethod:: cubicweb.server.session.Connection.allow_all_hooks_but
8766
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   208
8768
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   209
    Security level Management:
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   210
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   211
      :attr:`read_security` and :attr:`write_security`, boolean flags telling if
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   212
      read/write security is currently activated.
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   213
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   214
    """
9085
af6085c9ac69 [connection] mark Connection as "not a request"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9084
diff changeset
   215
    is_request = False
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   216
    hooks_in_progress = False
9085
af6085c9ac69 [connection] mark Connection as "not a request"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9084
diff changeset
   217
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   218
    def __init__(self, repo, user):
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   219
        super(Connection, self).__init__(repo.vreg)
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   220
        #: connection unique id
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   221
        self._open = None
7350
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7349
diff changeset
   222
8842
63fa6b02b241 [transaction] keep a reference to the repo object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8841
diff changeset
   223
        #: server.Repository object
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   224
        self.repo = repo
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   225
        self.vreg = self.repo.vreg
9086
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   226
        self._execute = self.repo.querier.execute
8842
63fa6b02b241 [transaction] keep a reference to the repo object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8841
diff changeset
   227
9023
67f242261dd3 [connection] give access to is_internal_session boolean
pierre-yves
parents: 9022
diff changeset
   228
        # internal (root) session
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   229
        self.is_internal_session = isinstance(user, InternalManager)
4834
b718626a0e60 move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4767
diff changeset
   230
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   231
        #: dict containing arbitrary data cleared at the end of the transaction
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   232
        self.transaction_data = {}
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   233
        #: ordered list of operations to be processed on commit/rollback
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   234
        self.pending_operations = []
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   235
        #: (None, 'precommit', 'postcommit', 'uncommitable')
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   236
        self.commit_state = None
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   237
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   238
        # hook control attribute
11919
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   239
        # `_hooks_mode`, may be either `HOOKS_ALLOW_ALL` or `HOOKS_DENY_ALL`.
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   240
        self._hooks_mode = HOOKS_ALLOW_ALL
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   241
        # `_hooks_categories`, when :attr:`_hooks_mode` is `HOOKS_DENY_ALL`,
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   242
        # this set contains hooks categories that are enabled ;
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   243
        # when :attr:`_hooks_mode` is `HOOKS_ALLOW_ALL`, it contains hooks
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   244
        # categories that are disabled.
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   245
        self._hooks_categories = set()
8766
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   246
        self.pruned_hooks_cache = {}
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   247
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   248
        # security control attributes
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   249
        self._read_security = DEFAULT_SECURITY  # handled by a property
8768
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   250
        self.write_security = DEFAULT_SECURITY
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   251
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   252
        # undo control
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   253
        config = repo.config
10345
ef54ea75a642 [server] drop repo.internal_session and InternalSession
Julien Cristau <julien.cristau@logilab.fr>
parents: 10301
diff changeset
   254
        if config.creating or config.repairing or self.is_internal_session:
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   255
            self.undo_actions = False
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   256
        else:
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   257
            self.undo_actions = config['undo-enabled']
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   258
8769
1672502ac204 [transaction] move RQLRewriter in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8768
diff changeset
   259
        # RQLRewriter are not thread safe
9090
e33ff287f082 [connection] pass a Connection object to RQLRewriter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9089
diff changeset
   260
        self._rewriter = RQLRewriter(self)
8769
1672502ac204 [transaction] move RQLRewriter in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8768
diff changeset
   261
9088
04ceb4268b3b [connection] Connection now call _set_user to CWUser object linked to itseld
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9087
diff changeset
   262
        # other session utility
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   263
        if user.login == '__internal_manager__':
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   264
            self.user = user
9088
04ceb4268b3b [connection] Connection now call _set_user to CWUser object linked to itseld
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9087
diff changeset
   265
        else:
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   266
            self._set_user(user)
9078
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   267
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   268
    @_open_only
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   269
    def get_schema(self):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   270
        """Return the schema currently used by the repository."""
12039
7514626e1dc5 [session+test] Stop storing / accessing session when it's not necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12033
diff changeset
   271
        return self.repo.source_defs()
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   272
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   273
    @_open_only
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   274
    def get_option_value(self, option):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   275
        """Return the value for `option` in the configuration."""
12039
7514626e1dc5 [session+test] Stop storing / accessing session when it's not necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12033
diff changeset
   276
        return self.repo.get_option_value(option)
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   277
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   278
    # transaction api
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   279
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   280
    @_open_only
10360
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   281
    def undoable_transactions(self, ueid=None, **actionfilters):
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   282
        """Return a list of undoable transaction objects by the connection's
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   283
        user, ordered by descendant transaction time.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   284
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   285
        Managers may filter according to user (eid) who has done the transaction
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   286
        using the `ueid` argument. Others will only see their own transactions.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   287
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   288
        Additional filtering capabilities is provided by using the following
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   289
        named arguments:
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   290
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   291
        * `etype` to get only transactions creating/updating/deleting entities
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   292
          of the given type
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   293
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   294
        * `eid` to get only transactions applied to entity of the given eid
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   295
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   296
        * `action` to get only transactions doing the given action (action in
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   297
          'C', 'U', 'D', 'A', 'R'). If `etype`, action can only be 'C', 'U' or
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   298
          'D'.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   299
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   300
        * `public`: when additional filtering is provided, they are by default
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   301
          only searched in 'public' actions, unless a `public` argument is given
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   302
          and set to false.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   303
        """
10360
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   304
        return self.repo.system_source.undoable_transactions(self, ueid,
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   305
                                                             **actionfilters)
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   306
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   307
    @_open_only
10360
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   308
    def transaction_info(self, txuuid):
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   309
        """Return transaction object for the given uid.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   310
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   311
        raise `NoSuchTransaction` if not found or if session's user is
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   312
        not allowed (eg not in managers group and the transaction
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   313
        doesn't belong to him).
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   314
        """
10360
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   315
        return self.repo.system_source.tx_info(self, txuuid)
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   316
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   317
    @_open_only
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   318
    def transaction_actions(self, txuuid, public=True):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   319
        """Return an ordered list of actions effectued during that transaction.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   320
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   321
        If public is true, return only 'public' actions, i.e. not ones
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   322
        triggered under the cover by hooks, else return all actions.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   323
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   324
        raise `NoSuchTransaction` if the transaction is not found or
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   325
        if the user is not allowed (eg not in managers group).
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   326
        """
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   327
        return self.repo.system_source.tx_actions(self, txuuid, public)
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   328
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   329
    @_open_only
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   330
    def undo_transaction(self, txuuid):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   331
        """Undo the given transaction. Return potential restoration errors.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   332
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   333
        raise `NoSuchTransaction` if not found or if user is not
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   334
        allowed (eg not in managers group).
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   335
        """
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   336
        return self.repo.system_source.undo_transaction(self, txuuid)
9089
b4c12d2873f6 [connection] Connection.execute touch Session timestamp
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9088
diff changeset
   337
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   338
    # life cycle handling ####################################################
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   339
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   340
    def __enter__(self):
11738
dc081e31501e [session] Allow self._open to be False in __enter__
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11699
diff changeset
   341
        assert not self._open
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   342
        self._open = True
11931
ad7796dabeaa [repository] move cnxset pool handling to a helper class
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11929
diff changeset
   343
        self.cnxset = self.repo.cnxsets.get()
11824
d7ecf6dab085 Fix AttributeError for "lang" on repo/client connections
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11821
diff changeset
   344
        if self.lang is None:
d7ecf6dab085 Fix AttributeError for "lang" on repo/client connections
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11821
diff changeset
   345
            self.set_language(self.user.prefered_language())
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   346
        return self
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   347
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   348
    def __exit__(self, exctype=None, excvalue=None, tb=None):
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   349
        assert self._open  # actually already open
10435
5b33ca2c61e0 [server/session] Roll back in connection exit
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10366
diff changeset
   350
        self.rollback()
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   351
        self._open = False
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   352
        self.cnxset.cnxset_freed()
11931
ad7796dabeaa [repository] move cnxset pool handling to a helper class
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11929
diff changeset
   353
        self.repo.cnxsets.release(self.cnxset)
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   354
        self.cnxset = None
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   355
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   356
    @contextmanager
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   357
    def running_hooks_ops(self):
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   358
        """this context manager should be called whenever hooks or operations
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   359
        are about to be run (but after hook selection)
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   360
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   361
        It will help the undo logic record pertinent metadata or some
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   362
        hooks to run (or not) depending on who/what issued the query.
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   363
        """
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   364
        prevmode = self.hooks_in_progress
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   365
        self.hooks_in_progress = True
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   366
        yield
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   367
        self.hooks_in_progress = prevmode
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   368
9078
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   369
    # shared data handling ###################################################
8769
1672502ac204 [transaction] move RQLRewriter in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8768
diff changeset
   370
8779
9b2f68916474 [transaction] rename transaction_data to data
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8778
diff changeset
   371
    @property
9083
fe254c803ed1 [connection] have rql_rewriter accession on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9082
diff changeset
   372
    def rql_rewriter(self):
fe254c803ed1 [connection] have rql_rewriter accession on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9082
diff changeset
   373
        return self._rewriter
fe254c803ed1 [connection] have rql_rewriter accession on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9082
diff changeset
   374
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   375
    def clear(self):
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   376
        """reset internal data"""
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   377
        self.transaction_data = {}
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   378
        #: ordered list of operations to be processed on commit/rollback
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   379
        self.pending_operations = []
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   380
        #: (None, 'precommit', 'postcommit', 'uncommitable')
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   381
        self.commit_state = None
8766
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   382
        self.pruned_hooks_cache = {}
9082
a2c6d908edeb [connection] move local_perm_cache management on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9081
diff changeset
   383
        self.local_perm_cache.clear()
9090
e33ff287f082 [connection] pass a Connection object to RQLRewriter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9089
diff changeset
   384
        self.rewriter = RQLRewriter(self)
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   385
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   386
    # Entity cache management #################################################
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   387
    #
9402
2c48c091b6a2 merge 3.18.0 in 3.19 branch
Julien Cristau <julien.cristau@logilab.fr>
parents: 9123 9396
diff changeset
   388
    # The connection entity cache as held in cnx.transaction_data is removed at the
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   389
    # end of the connection (commit and rollback)
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   390
    #
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   391
    # XXX connection level caching may be a pb with multiple repository
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   392
    # instances, but 1. this is probably not the only one :$ and 2. it may be
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   393
    # an acceptable risk. Anyway we could activate it or not according to a
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   394
    # configuration option
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   395
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   396
    def set_entity_cache(self, entity):
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   397
        """Add `entity` to the connection entity cache"""
9113
af6efc15fc90 [repository] add an ``internal_cnx`` method to replace ``internal_session``
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9112
diff changeset
   398
        # XXX not using _open_only because before at creation time. _set_user
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   399
        # call this function to cache the Connection user.
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   400
        if entity.cw_etype != 'CWUser' and not self._open:
12029
3d9883a6068f [session] Drop no more necessary Session.sessionid and Connection.connectionid
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12028
diff changeset
   401
            raise ProgrammingError('Closed Connection: %s' % self)
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   402
        ecache = self.transaction_data.setdefault('ecache', {})
8784
07f453bf72e8 [transaction] small simplification in ecache code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8783
diff changeset
   403
        ecache.setdefault(entity.eid, entity)
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   404
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   405
    @_open_only
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   406
    def entity_cache(self, eid):
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   407
        """get cache entity for `eid`"""
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   408
        return self.transaction_data['ecache'][eid]
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   409
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   410
    @_open_only
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   411
    def cached_entities(self):
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   412
        """return the whole entity cache"""
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   413
        return self.transaction_data.get('ecache', {}).values()
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   414
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   415
    @_open_only
11892
08cf02efc7ce Simplify and fix _cw.drop_entity_cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11824
diff changeset
   416
    def drop_entity_cache(self):
08cf02efc7ce Simplify and fix _cw.drop_entity_cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11824
diff changeset
   417
        """Drop the whole entity cache."""
08cf02efc7ce Simplify and fix _cw.drop_entity_cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11824
diff changeset
   418
        for entity in self.cached_entities():
08cf02efc7ce Simplify and fix _cw.drop_entity_cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11824
diff changeset
   419
            entity.cw_clear_all_caches()
08cf02efc7ce Simplify and fix _cw.drop_entity_cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11824
diff changeset
   420
        self.transaction_data.pop('ecache', None)
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   421
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   422
    # relations handling #######################################################
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   423
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   424
    @_open_only
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   425
    def add_relation(self, fromeid, rtype, toeid):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   426
        """provide direct access to the repository method to add a relation.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   427
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   428
        This is equivalent to the following rql query:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   429
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   430
          SET X rtype Y WHERE X eid  fromeid, T eid toeid
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   431
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   432
        without read security check but also all the burden of rql execution.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   433
        You may use this in hooks when you know both eids of the relation you
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   434
        want to add.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   435
        """
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   436
        self.add_relations([(rtype, [(fromeid, toeid)])])
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   437
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   438
    @_open_only
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   439
    def add_relations(self, relations):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   440
        '''set many relation using a shortcut similar to the one in add_relation
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   441
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   442
        relations is a list of 2-uples, the first element of each
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   443
        2-uple is the rtype, and the second is a list of (fromeid,
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   444
        toeid) tuples
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   445
        '''
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   446
        edited_entities = {}
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   447
        relations_dict = {}
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   448
        with self.security_enabled(False, False):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   449
            for rtype, eids in relations:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   450
                if self.vreg.schema[rtype].inlined:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   451
                    for fromeid, toeid in eids:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   452
                        if fromeid not in edited_entities:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   453
                            entity = self.entity_from_eid(fromeid)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   454
                            edited = EditedEntity(entity)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   455
                            edited_entities[fromeid] = edited
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   456
                        else:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   457
                            edited = edited_entities[fromeid]
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   458
                        edited.edited_attribute(rtype, toeid)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   459
                else:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   460
                    relations_dict[rtype] = eids
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   461
            self.repo.glob_add_relations(self, relations_dict)
10663
54b8a1f249fb [py3k] dict.itervalues → dict.values
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10589
diff changeset
   462
            for edited in edited_entities.values():
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   463
                self.repo.glob_update_entity(self, edited)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   464
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   465
    @_open_only
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   466
    def delete_relation(self, fromeid, rtype, toeid):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   467
        """provide direct access to the repository method to delete a relation.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   468
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   469
        This is equivalent to the following rql query:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   470
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   471
          DELETE X rtype Y WHERE X eid  fromeid, T eid toeid
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   472
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   473
        without read security check but also all the burden of rql execution.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   474
        You may use this in hooks when you know both eids of the relation you
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   475
        want to delete.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   476
        """
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   477
        with self.security_enabled(False, False):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   478
            if self.vreg.schema[rtype].inlined:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   479
                entity = self.entity_from_eid(fromeid)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   480
                entity.cw_attr_cache[rtype] = None
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   481
                self.repo.glob_update_entity(self, entity, set((rtype,)))
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   482
            else:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   483
                self.repo.glob_delete_relation(self, fromeid, rtype, toeid)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   484
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   485
    # relations cache handling #################################################
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   486
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   487
    @_open_only
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   488
    def update_rel_cache_add(self, subject, rtype, object, symmetric=False):
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   489
        self._update_entity_rel_cache_add(subject, rtype, 'subject', object)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   490
        if symmetric:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   491
            self._update_entity_rel_cache_add(object, rtype, 'subject', subject)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   492
        else:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   493
            self._update_entity_rel_cache_add(object, rtype, 'object', subject)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   494
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   495
    @_open_only
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   496
    def update_rel_cache_del(self, subject, rtype, object, symmetric=False):
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   497
        self._update_entity_rel_cache_del(subject, rtype, 'subject', object)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   498
        if symmetric:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   499
            self._update_entity_rel_cache_del(object, rtype, 'object', object)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   500
        else:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   501
            self._update_entity_rel_cache_del(object, rtype, 'object', subject)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   502
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   503
    @_open_only
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   504
    def _update_entity_rel_cache_add(self, eid, rtype, role, targeteid):
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   505
        try:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   506
            entity = self.entity_cache(eid)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   507
        except KeyError:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   508
            return
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   509
        rcache = entity.cw_relation_cached(rtype, role)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   510
        if rcache is not None:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   511
            rset, entities = rcache
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   512
            rset = rset.copy()
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   513
            entities = list(entities)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   514
            rset.rows.append([targeteid])
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   515
            if not isinstance(rset.description, list):  # else description not set
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   516
                rset.description = list(rset.description)
11765
9cb215e833b0 [cnx] Use entity_type instead of entity_metas()['type']
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11763
diff changeset
   517
            rset.description.append([self.entity_type(targeteid)])
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   518
            targetentity = self.entity_from_eid(targeteid)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   519
            if targetentity.cw_rset is None:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   520
                targetentity.cw_rset = rset
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   521
                targetentity.cw_row = rset.rowcount
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   522
                targetentity.cw_col = 0
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   523
            rset.rowcount += 1
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   524
            entities.append(targetentity)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   525
            entity._cw_related_cache['%s_%s' % (rtype, role)] = (
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   526
                rset, tuple(entities))
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   527
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   528
    @_open_only
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   529
    def _update_entity_rel_cache_del(self, eid, rtype, role, targeteid):
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   530
        try:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   531
            entity = self.entity_cache(eid)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   532
        except KeyError:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   533
            return
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   534
        rcache = entity.cw_relation_cached(rtype, role)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   535
        if rcache is not None:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   536
            rset, entities = rcache
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   537
            for idx, row in enumerate(rset.rows):
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   538
                if row[0] == targeteid:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   539
                    break
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   540
            else:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   541
                # this may occurs if the cache has been filed by a hook
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   542
                # after the database update
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   543
                self.debug('cache inconsistency for %s %s %s %s', eid, rtype,
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   544
                           role, targeteid)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   545
                return
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   546
            rset = rset.copy()
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   547
            entities = list(entities)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   548
            del rset.rows[idx]
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   549
            if isinstance(rset.description, list):  # else description not set
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   550
                del rset.description[idx]
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   551
            del entities[idx]
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   552
            rset.rowcount -= 1
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   553
            entity._cw_related_cache['%s_%s' % (rtype, role)] = (
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   554
                rset, tuple(entities))
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   555
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   556
    # Tracking of entities added of removed in the transaction ##################
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   557
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   558
    @_open_only
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   559
    def deleted_in_transaction(self, eid):
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   560
        """return True if the entity of the given eid is being deleted in the
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   561
        current transaction
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   562
        """
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   563
        return eid in self.transaction_data.get('pendingeids', ())
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   564
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   565
    @_open_only
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   566
    def added_in_transaction(self, eid):
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   567
        """return True if the entity of the given eid is being created in the
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   568
        current transaction
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   569
        """
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   570
        return eid in self.transaction_data.get('neweids', ())
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   571
8786
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   572
    # Operation management ####################################################
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   573
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   574
    @_open_only
8786
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   575
    def add_operation(self, operation, index=None):
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   576
        """add an operation to be executed at the end of the transaction"""
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   577
        if index is None:
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   578
            self.pending_operations.append(operation)
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   579
        else:
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   580
            self.pending_operations.insert(index, operation)
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   581
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   582
    # Hooks control ###########################################################
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   583
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   584
    @_open_only
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   585
    def allow_all_hooks_but(self, *categories):
11919
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   586
        """Context manager to enable all hooks but those in the given
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   587
        categories.
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   588
        """
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   589
        return _hooks_control(self, HOOKS_ALLOW_ALL, *categories)
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   590
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   591
    @_open_only
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   592
    def deny_all_hooks_but(self, *categories):
11919
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   593
        """Context manager to disable all hooks but those in the given
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   594
        categories.
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   595
        """
11919
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   596
        return _hooks_control(self, HOOKS_DENY_ALL, *categories)
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   597
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   598
    @_open_only
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   599
    def is_hook_category_activated(self, category):
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   600
        """return a boolean telling if the given category is currently activated
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   601
        or not
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   602
        """
11919
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   603
        if self._hooks_mode is HOOKS_DENY_ALL:
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   604
            return category in self._hooks_categories
3a6746dfc57f Change hooks control (deny_all_hooks_but / allow_all_hooks_but) to be more predictable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11892
diff changeset
   605
        return category not in self._hooks_categories
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   606
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   607
    @_open_only
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   608
    def is_hook_activated(self, hook):
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   609
        """return a boolean telling if the given hook class is currently
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   610
        activated or not
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   611
        """
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   612
        return self.is_hook_category_activated(hook.category)
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   613
8806
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   614
    # Security management #####################################################
9027
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   615
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   616
    @_open_only
9027
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   617
    def security_enabled(self, read=None, write=None):
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   618
        return _security_enabled(self, read=read, write=write)
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   619
8806
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   620
    @property
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   621
    @_open_only
8806
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   622
    def read_security(self):
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   623
        return self._read_security
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   624
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   625
    @read_security.setter
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   626
    @_open_only
8806
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   627
    def read_security(self, activated):
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   628
        self._read_security = activated
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   629
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   630
    # undo support ############################################################
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   631
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   632
    @_open_only
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   633
    def ertype_supports_undo(self, ertype):
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   634
        return self.undo_actions and ertype not in NO_UNDO_TYPES
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   635
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   636
    @_open_only
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   637
    def transaction_uuid(self, set=True):
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   638
        uuid = self.transaction_data.get('tx_uuid')
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   639
        if set and uuid is None:
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12542
diff changeset
   640
            self.transaction_data['tx_uuid'] = uuid = uuid4().hex
9075
8d36838ccb3e [connection] move last part of undo logic in connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9074
diff changeset
   641
            self.repo.system_source.start_undoable_transaction(self, uuid)
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   642
        return uuid
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   643
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   644
    @_open_only
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   645
    def transaction_inc_action_counter(self):
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   646
        num = self.transaction_data.setdefault('tx_action_count', 0) + 1
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   647
        self.transaction_data['tx_action_count'] = num
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   648
        return num
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   649
8844
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   650
    # db-api like interface ###################################################
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   651
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   652
    @_open_only
8844
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   653
    def source_defs(self):
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   654
        return self.repo.source_defs()
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   655
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   656
    @_open_only
11774
51c160677afe [repository] Drop the entities.extid column and associated cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11767
diff changeset
   657
    def entity_type(self, eid):
51c160677afe [repository] Drop the entities.extid column and associated cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11767
diff changeset
   658
        """Return entity type for the entity with id `eid`."""
51c160677afe [repository] Drop the entities.extid column and associated cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11767
diff changeset
   659
        return self.repo.type_from_eid(eid, self)
51c160677afe [repository] Drop the entities.extid column and associated cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11767
diff changeset
   660
9086
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   661
    # core method #############################################################
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   662
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   663
    @_open_only
10005
7769d0f61810 remove leftover pre 3.9 deprecation warnings
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9979
diff changeset
   664
    def execute(self, rql, kwargs=None, build_descr=True):
9086
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   665
        """db-api like method directly linked to the querier execute method.
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   666
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   667
        See :meth:`cubicweb.dbapi.Cursor.execute` documentation.
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   668
        """
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   669
        rset = self._execute(self, rql, kwargs, build_descr)
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   670
        rset.req = self
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   671
        return rset
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   672
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   673
    @_open_only
12542
85194bd49119 Drop more deprecated code
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12539
diff changeset
   674
    def rollback(self):
9091
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   675
        """rollback the current transaction"""
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   676
        cnxset = self.cnxset
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   677
        assert cnxset is not None
9091
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   678
        try:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   679
            # by default, operations are executed with security turned off
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   680
            with self.security_enabled(False, False):
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   681
                while self.pending_operations:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   682
                    try:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   683
                        operation = self.pending_operations.pop(0)
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   684
                        operation.handle_event('rollback_event')
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   685
                    except BaseException:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   686
                        self.critical('rollback error', exc_info=sys.exc_info())
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   687
                        continue
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   688
                cnxset.rollback()
12029
3d9883a6068f [session] Drop no more necessary Session.sessionid and Connection.connectionid
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12028
diff changeset
   689
                self.debug('rollback for transaction %s done', self)
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   690
        finally:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   691
            self.clear()
8844
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   692
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   693
    @_open_only
12542
85194bd49119 Drop more deprecated code
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12539
diff changeset
   694
    def commit(self):
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   695
        """commit the current session's transaction"""
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   696
        assert self.cnxset is not None
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   697
        cstate = self.commit_state
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   698
        if cstate == 'uncommitable':
9403
d81207fb9499 Fix a couple merge errors
Julien Cristau <julien.cristau@logilab.fr>
parents: 9402
diff changeset
   699
            raise QueryError('transaction must be rolled back')
10059
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   700
        if cstate == 'precommit':
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   701
            self.warn('calling commit in precommit makes no sense; ignoring commit')
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   702
            return
10059
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   703
        if cstate == 'postcommit':
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   704
            self.critical('postcommit phase is not allowed to write to the db; ignoring commit')
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   705
            return
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   706
        assert cstate is None
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   707
        # on rollback, an operation should have the following state
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   708
        # information:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   709
        # - processed by the precommit/commit event or not
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   710
        # - if processed, is it the failed operation
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   711
        debug = server.DEBUG & server.DBG_OPS
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   712
        try:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   713
            # by default, operations are executed with security turned off
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   714
            with self.security_enabled(False, False):
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   715
                processed = []
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   716
                self.commit_state = 'precommit'
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   717
                if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   718
                    print(self.commit_state, '*' * 20)
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   719
                try:
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   720
                    with self.running_hooks_ops():
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   721
                        while self.pending_operations:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   722
                            operation = self.pending_operations.pop(0)
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   723
                            operation.processed = 'precommit'
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   724
                            processed.append(operation)
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   725
                            if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   726
                                print(operation)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   727
                            operation.handle_event('precommit_event')
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   728
                    self.pending_operations[:] = processed
12029
3d9883a6068f [session] Drop no more necessary Session.sessionid and Connection.connectionid
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12028
diff changeset
   729
                    self.debug('precommit transaction %s done', self)
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   730
                except BaseException:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   731
                    # if error on [pre]commit:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   732
                    #
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   733
                    # * set .failed = True on the operation causing the failure
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   734
                    # * call revert<event>_event on processed operations
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   735
                    # * call rollback_event on *all* operations
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   736
                    #
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   737
                    # that seems more natural than not calling rollback_event
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   738
                    # for processed operations, and allow generic rollback
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   739
                    # instead of having to implements rollback, revertprecommit
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   740
                    # and revertcommit, that will be enough in mont case.
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   741
                    operation.failed = True
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   742
                    if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   743
                        print(self.commit_state, '*' * 20)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   744
                    with self.running_hooks_ops():
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   745
                        for operation in reversed(processed):
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   746
                            if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   747
                                print(operation)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   748
                            try:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   749
                                operation.handle_event('revertprecommit_event')
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   750
                            except BaseException:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   751
                                self.critical('error while reverting precommit',
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   752
                                              exc_info=True)
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   753
                    # XXX use slice notation since self.pending_operations is a
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   754
                    # read-only property.
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   755
                    self.pending_operations[:] = processed + self.pending_operations
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   756
                    self.rollback()
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   757
                    raise
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   758
                self.cnxset.commit()
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   759
                self.commit_state = 'postcommit'
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   760
                if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   761
                    print(self.commit_state, '*' * 20)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   762
                with self.running_hooks_ops():
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   763
                    while self.pending_operations:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   764
                        operation = self.pending_operations.pop(0)
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   765
                        if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   766
                            print(operation)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   767
                        operation.processed = 'postcommit'
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   768
                        try:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   769
                            operation.handle_event('postcommit_event')
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   770
                        except BaseException:
12104
3ae16f70add4 [server] don't catch exception from postcommit_event() if we are in test mode
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 12047
diff changeset
   771
                            if self.repo.config.mode == 'test':
3ae16f70add4 [server] don't catch exception from postcommit_event() if we are in test mode
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 12047
diff changeset
   772
                                raise
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   773
                            self.critical('error while postcommit',
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   774
                                          exc_info=sys.exc_info())
12029
3d9883a6068f [session] Drop no more necessary Session.sessionid and Connection.connectionid
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12028
diff changeset
   775
                self.debug('postcommit transaction %s done', self)
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   776
                return self.transaction_uuid(set=False)
9091
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   777
        finally:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   778
            self.clear()
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   779
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   780
    # resource accessors ######################################################
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   781
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   782
    @_open_only
9093
e2f88df79efd [connection] move call_service on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9092
diff changeset
   783
    def call_service(self, regid, **kwargs):
9721
2f08bd4c813b [server/session] remove json dumps around call_service
Julien Cristau <julien.cristau@logilab.fr>
parents: 9707
diff changeset
   784
        self.debug('calling service %s', regid)
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
   785
        service = self.vreg['services'].select(regid, self, **kwargs)
9721
2f08bd4c813b [server/session] remove json dumps around call_service
Julien Cristau <julien.cristau@logilab.fr>
parents: 9707
diff changeset
   786
        return service.call(**kwargs)
9093
e2f88df79efd [connection] move call_service on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9092
diff changeset
   787
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   788
    @_open_only
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   789
    def system_sql(self, sql, args=None, rollback_on_failure=True):
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   790
        """return a sql cursor on the system database"""
9463
d62e13eba033 [multi-sources-removal] Simplify ConnectionsSet internal structures and public methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9458
diff changeset
   791
        source = self.repo.system_source
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   792
        try:
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   793
            return source.doexec(self, sql, args, rollback=rollback_on_failure)
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   794
        except (source.OperationalError, source.InterfaceError):
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   795
            if not rollback_on_failure:
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   796
                raise
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   797
            source.warning("trying to reconnect")
9482
5b97e69f9c29 [server] fix TypeErrors
Julien Cristau <julien.cristau@logilab.fr>
parents: 9479
diff changeset
   798
            self.cnxset.reconnect()
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   799
            return source.doexec(self, sql, args, rollback=rollback_on_failure)
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   800
9112
c859c7cef346 [connection] enforce that a connection must be open to be used
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9110
diff changeset
   801
    @_open_only
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   802
    def rtype_eids_rdef(self, rtype, eidfrom, eidto):
11763
39df042f4ab4 [repository] Drop type_and_source_from_eid and rename related cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11738
diff changeset
   803
        subjtype = self.repo.type_from_eid(eidfrom, self)
39df042f4ab4 [repository] Drop type_and_source_from_eid and rename related cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11738
diff changeset
   804
        objtype = self.repo.type_from_eid(eidto, self)
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   805
        return self.vreg.schema.rschema(rtype).rdefs[(subjtype, objtype)]
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   806
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   807
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   808
class InternalManager(object):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   809
    """a manager user with all access rights used internally for task such as
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   810
    bootstrapping the repository or creating regular users according to
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   811
    repository content
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   812
    """
10345
ef54ea75a642 [server] drop repo.internal_session and InternalSession
Julien Cristau <julien.cristau@logilab.fr>
parents: 10301
diff changeset
   813
9479
f13fbab0c718 [server] Allow setting an InternalManager's preferred language
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   814
    def __init__(self, lang='en'):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   815
        self.eid = -1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   816
        self.login = u'__internal_manager__'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   817
        self.properties = {}
9087
dd26b4f95f90 [server/session] better faking of user for InternalManager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9086
diff changeset
   818
        self.groups = set(['managers'])
9479
f13fbab0c718 [server] Allow setting an InternalManager's preferred language
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   819
        self.lang = lang
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   820
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   821
    def matching_groups(self, groups):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   822
        return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   823
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   824
    def is_in_group(self, group):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   825
        return True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   826
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   827
    def owns(self, eid):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   828
        return True
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   829
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   830
    def property_value(self, key):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   831
        if key == 'ui.language':
9479
f13fbab0c718 [server] Allow setting an InternalManager's preferred language
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   832
            return self.lang
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   833
        return None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   834
8563
d28ccecb7bf5 mock ``CWUser.prefered_language()`` on InternalManager objects.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8562
diff changeset
   835
    def prefered_language(self, language=None):
d28ccecb7bf5 mock ``CWUser.prefered_language()`` on InternalManager objects.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8562
diff changeset
   836
        # mock CWUser.prefered_language, mainly for testing purpose
d28ccecb7bf5 mock ``CWUser.prefered_language()`` on InternalManager objects.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8562
diff changeset
   837
        return self.property_value('ui.language')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   838
8579
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   839
    # CWUser compat for notification ###########################################
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   840
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   841
    def name(self):
11233
f24e83a82a4f [server] make InternalManager.name() return an empty string (closes #12418708)
David Douard <david.douard@logilab.fr>
parents: 10272
diff changeset
   842
        return ''
8579
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   843
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   844
    class _IEmailable:
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   845
        @staticmethod
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   846
        def get_email():
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   847
            return ''
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   848
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   849
    def cw_adapt_to(self, iface):
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   850
        if iface == 'IEmailable':
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   851
            return self._IEmailable
c4673bc11053 [req / session] drop is_internal_session (buggy) compat on base request by implementing necessary methods on internal manager
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8563
diff changeset
   852
        return None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   853
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   854
9021
d8806996ac01 [connection] add logging method on connection
pierre-yves
parents: 9020
diff changeset
   855
set_log_methods(Connection, getLogger('cubicweb.session'))