cubicweb/server/session.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Fri, 22 Mar 2019 17:29:15 +0100
changeset 12539 10159a3d1d72
parent 12508 a8c1ea390400
child 12542 85194bd49119
permissions -rw-r--r--
Drop deprecated CWCache entity type
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
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
    20
from __future__ import print_function
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
    21
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    22
import functools
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    23
import sys
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    24
from uuid import uuid4
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5130
diff changeset
    25
from warnings import warn
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
    26
from contextlib import contextmanager
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    27
from logging import getLogger
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    28
10752
c69f109293f2 [server/session] unicode → six.text_type
Julien Cristau <julien.cristau@logilab.fr>
parents: 10737
diff changeset
    29
from six import text_type
c69f109293f2 [server/session] unicode → six.text_type
Julien Cristau <julien.cristau@logilab.fr>
parents: 10737
diff changeset
    30
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    31
from logilab.common.registry import objectify_predicate
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    32
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    33
from cubicweb import QueryError, ProgrammingError, schema, server
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    34
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
    35
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
    36
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
    37
from cubicweb.server.edition import EditedEntity
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
7329
f2d52aa8bcdb [session] new selectors according to session type (eg user or internal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7237
diff changeset
    39
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    40
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
    41
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
    42
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
    43
# 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
    44
# 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
    45
# anyway in the later case
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    46
NO_UNDO_TYPES.add('is')
bc481dab93d4 [undo] consistent is/is_instance_of processing
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5069
diff changeset
    47
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
    48
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
    49
# XXX rememberme,forgotpwd,apycot,vcsfile
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4899
diff changeset
    50
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    51
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    52
@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
    53
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
    54
    """return 1 when session is not internal.
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    55
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    56
    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
    57
    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
    58
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    59
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    60
@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
    61
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
    62
    """return 1 when session is not internal.
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    63
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    64
    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
    65
    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
    66
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
    67
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8096
diff changeset
    68
@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
    69
def repairing(cls, req, **kwargs):
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    70
    """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
    71
    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
    72
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    73
10362
ec8c233ce54b [session] remove session-related bw compat code
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10361
diff changeset
    74
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
    75
    """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
    76
9557
a3c075fe9385 [server/session] fix a couple typos in doc strings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9543
diff changeset
    77
    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
    78
    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
    79
9025
768eb9a6a2db [session] update _hook_control docstring
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9024
diff changeset
    80
    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
    81
    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
    82
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
    83
    .. 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
    84
9025
768eb9a6a2db [session] update _hook_control docstring
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9024
diff changeset
    85
       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
    86
           # ... 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
    87
9025
768eb9a6a2db [session] update _hook_control docstring
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9024
diff changeset
    88
       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
    89
           # ... 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
    90
9557
a3c075fe9385 [server/session] fix a couple typos in doc strings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9543
diff changeset
    91
    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
    92
    :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
    93
    :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
    94
    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
    95
    """
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
    96
    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
    97
        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
    98
        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
    99
        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
   100
        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
   101
        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
   102
        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
   103
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
    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
   105
        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
   106
        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
   107
        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
   108
        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
   109
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
   110
    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
   111
        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
   112
        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
   113
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
   114
8841
f62fb831cfe6 [session] make security_enabled API private
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8840
diff changeset
   115
class _security_enabled(object):
8760
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
   116
    """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
   117
17994bf95d6a [doc] update Session documentation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
   118
    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
   119
    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
   120
    """
9027
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   121
    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
   122
        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
   123
        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
   124
        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
   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
        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
   127
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
   128
    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
   129
        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
   130
            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
   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.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
   133
            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
   134
        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
   135
            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
   136
        else:
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   137
            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
   138
            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
   139
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
   140
    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
   141
        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
   142
            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
   143
        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
   144
            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
   145
11821
7534b32c45e3 Fix (new) flake8 errors
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11774
diff changeset
   146
8765
9e9029ba2d4e [session] Move hook control constants out of the class
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8764
diff changeset
   147
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
   148
HOOKS_DENY_ALL = object()
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   149
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
   150
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
   151
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
   152
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
   153
    """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
   154
    @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
   155
    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
   156
        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
   157
            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
   158
        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
   159
    return check_open
9098
5467fb901931 [connection] transparent cnx_set handling
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9095
diff changeset
   160
9630
e7dbc4f06a48 minor cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9629
diff changeset
   161
9073
9574df1cd054 [Connection] inherit from RequestSessionBase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9052
diff changeset
   162
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
   163
    """Repository Connection
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   164
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   165
    Holds all connection related data
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   166
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   167
    Database connection resources:
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   168
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   169
      :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
   170
      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
   171
      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
   172
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   173
      :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
   174
      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
   175
      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
   176
      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
   177
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   178
    .. 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
   179
    .. 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
   180
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   181
      :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
   182
      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
   183
      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
   184
      '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
   185
      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
   186
10347
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   187
    Shared data:
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   188
10347
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   189
      :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
   190
      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
   191
      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
   192
      bits of session-scoped data.
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   193
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   194
      :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
   195
      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
   196
      there.
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   197
52a976c5d27a [connection] provide some missing documentation bits
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10346
diff changeset
   198
    Internal state:
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   199
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   200
      :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
   201
      commit/rollback
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   202
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   203
      :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
   204
      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
   205
      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
   206
      '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
   207
      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
   208
8766
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   209
    Hooks controls:
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   210
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
   211
    .. 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
   212
    .. 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
   213
8768
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   214
    Security level Management:
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   215
3d105e270abc [transaction] initialize security control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8767
diff changeset
   216
      :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
   217
      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
   218
8762
6b397a0ba1d6 [transaction] explicit Transaction cnxset attribute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8761
diff changeset
   219
    """
9085
af6085c9ac69 [connection] mark Connection as "not a request"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9084
diff changeset
   220
    is_request = False
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   221
    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
   222
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   223
    def __init__(self, repo, user):
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   224
        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
   225
        #: 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
   226
        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
   227
8842
63fa6b02b241 [transaction] keep a reference to the repo object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8841
diff changeset
   228
        #: server.Repository object
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   229
        self.repo = repo
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   230
        self.vreg = self.repo.vreg
9086
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   231
        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
   232
9023
67f242261dd3 [connection] give access to is_internal_session boolean
pierre-yves
parents: 9022
diff changeset
   233
        # internal (root) session
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   234
        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
   235
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   236
        #: 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
   237
        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
   238
        #: 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
   239
        self.pending_operations = []
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   240
        #: (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
   241
        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
   242
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   243
        # 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
   244
        # `_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
   245
        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
   246
        # `_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
   247
        # 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
   248
        # 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
   249
        # 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
   250
        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
   251
        self.pruned_hooks_cache = {}
db80ffb2f71c [transaction] initialize hook control attribute in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8765
diff changeset
   252
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   253
        # security control attributes
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   254
        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
   255
        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
   256
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   257
        # undo control
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   258
        config = repo.config
10345
ef54ea75a642 [server] drop repo.internal_session and InternalSession
Julien Cristau <julien.cristau@logilab.fr>
parents: 10301
diff changeset
   259
        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
   260
            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
   261
        else:
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   262
            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
   263
8769
1672502ac204 [transaction] move RQLRewriter in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8768
diff changeset
   264
        # 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
   265
        self._rewriter = RQLRewriter(self)
8769
1672502ac204 [transaction] move RQLRewriter in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8768
diff changeset
   266
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
   267
        # other session utility
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   268
        if user.login == '__internal_manager__':
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   269
            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
   270
        else:
12043
b8d2e6b9f548 Stop using Session on the repository side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12039
diff changeset
   271
            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
   272
10352
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_schema(self):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   275
        """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
   276
        return self.repo.source_defs()
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
    @_open_only
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   279
    def get_option_value(self, option):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   280
        """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
   281
        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
   282
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   283
    # transaction api
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
    @_open_only
10360
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   286
    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
   287
        """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
   288
        user, ordered by descendant transaction time.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   289
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   290
        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
   291
        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
   292
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   293
        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
   294
        named arguments:
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
        * `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
   297
          of the given type
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   298
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   299
        * `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
   300
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   301
        * `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
   302
          '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
   303
          'D'.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   304
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   305
        * `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
   306
          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
   307
          and set to false.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   308
        """
10360
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   309
        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
   310
                                                             **actionfilters)
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   311
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   312
    @_open_only
10360
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   313
    def transaction_info(self, txuuid):
10352
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   314
        """Return transaction object for the given uid.
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   315
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   316
        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
   317
        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
   318
        doesn't belong to him).
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   319
        """
10360
1fdbe2ea63d8 [transactions] cleanup after the dbapi removal
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10359
diff changeset
   320
        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
   321
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   322
    @_open_only
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   323
    def transaction_actions(self, txuuid, public=True):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   324
        """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
   325
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   326
        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
   327
        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
   328
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   329
        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
   330
        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
   331
        """
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   332
        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
   333
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   334
    @_open_only
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   335
    def undo_transaction(self, txuuid):
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   336
        """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
   337
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   338
        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
   339
        allowed (eg not in managers group).
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   340
        """
bab2befaac9b [session] provide missing apis to Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10351
diff changeset
   341
        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
   342
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   343
    # 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
   344
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   345
    def __enter__(self):
11738
dc081e31501e [session] Allow self._open to be False in __enter__
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11699
diff changeset
   346
        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
   347
        self._open = True
11931
ad7796dabeaa [repository] move cnxset pool handling to a helper class
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11929
diff changeset
   348
        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
   349
        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
   350
            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
   351
        return self
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   352
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   353
    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
   354
        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
   355
        self.rollback()
9108
6a4070e2849d [connection] handle and explicitly life cycle on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9107
diff changeset
   356
        self._open = False
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   357
        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
   358
        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
   359
        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
   360
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   361
    @contextmanager
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   362
    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
   363
        """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
   364
        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
   365
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   366
        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
   367
        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
   368
        """
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   369
        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
   370
        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
   371
        yield
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   372
        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
   373
9078
cfefd64c7039 [connection] give access to shared data method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9077
diff changeset
   374
    # shared data handling ###################################################
8769
1672502ac204 [transaction] move RQLRewriter in Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8768
diff changeset
   375
8779
9b2f68916474 [transaction] rename transaction_data to data
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8778
diff changeset
   376
    @property
9083
fe254c803ed1 [connection] have rql_rewriter accession on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9082
diff changeset
   377
    def rql_rewriter(self):
fe254c803ed1 [connection] have rql_rewriter accession on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9082
diff changeset
   378
        return self._rewriter
fe254c803ed1 [connection] have rql_rewriter accession on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9082
diff changeset
   379
8764
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   380
    def clear(self):
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   381
        """reset internal data"""
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   382
        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
   383
        #: 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
   384
        self.pending_operations = []
c4f022a6c7dd [transaction] initialize transaction data and state related attribute.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8763
diff changeset
   385
        #: (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
   386
        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
   387
        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
   388
        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
   389
        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
   390
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   391
    # Entity cache management #################################################
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   392
    #
9402
2c48c091b6a2 merge 3.18.0 in 3.19 branch
Julien Cristau <julien.cristau@logilab.fr>
parents: 9123 9396
diff changeset
   393
    # 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
   394
    # 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
   395
    #
9020
cb87e831c183 rename server.session.transaction into server.session.connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9016
diff changeset
   396
    # 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
   397
    # 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
   398
    # 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
   399
    # configuration option
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   400
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   401
    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
   402
        """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
   403
        # 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
   404
        # 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
   405
        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
   406
            raise ProgrammingError('Closed Connection: %s' % self)
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   407
        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
   408
        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
   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 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
   412
        """get cache entity for `eid`"""
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   413
        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
   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
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   416
    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
   417
        """return the whole entity cache"""
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   418
        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
   419
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
   420
    @_open_only
11892
08cf02efc7ce Simplify and fix _cw.drop_entity_cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11824
diff changeset
   421
    def drop_entity_cache(self):
08cf02efc7ce Simplify and fix _cw.drop_entity_cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11824
diff changeset
   422
        """Drop the whole entity cache."""
08cf02efc7ce Simplify and fix _cw.drop_entity_cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11824
diff changeset
   423
        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
   424
            entity.cw_clear_all_caches()
08cf02efc7ce Simplify and fix _cw.drop_entity_cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11824
diff changeset
   425
        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
   426
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   427
    # relations handling #######################################################
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   428
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
   429
    @_open_only
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   430
    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
   431
        """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
   432
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   433
        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
   434
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   435
          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
   436
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   437
        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
   438
        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
   439
        want to add.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   440
        """
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   441
        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
   442
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
   443
    @_open_only
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   444
    def add_relations(self, relations):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   445
        '''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
   446
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   447
        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
   448
        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
   449
        toeid) tuples
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   450
        '''
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   451
        edited_entities = {}
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   452
        relations_dict = {}
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   453
        with self.security_enabled(False, False):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   454
            for rtype, eids in relations:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   455
                if self.vreg.schema[rtype].inlined:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   456
                    for fromeid, toeid in eids:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   457
                        if fromeid not in edited_entities:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   458
                            entity = self.entity_from_eid(fromeid)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   459
                            edited = EditedEntity(entity)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   460
                            edited_entities[fromeid] = edited
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   461
                        else:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   462
                            edited = edited_entities[fromeid]
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   463
                        edited.edited_attribute(rtype, toeid)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   464
                else:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   465
                    relations_dict[rtype] = eids
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   466
            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
   467
            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
   468
                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
   469
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
   470
    @_open_only
9079
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   471
    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
   472
        """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
   473
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   474
        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
   475
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   476
          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
   477
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   478
        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
   479
        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
   480
        want to delete.
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   481
        """
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   482
        with self.security_enabled(False, False):
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   483
            if self.vreg.schema[rtype].inlined:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   484
                entity = self.entity_from_eid(fromeid)
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   485
                entity.cw_attr_cache[rtype] = None
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   486
                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
   487
            else:
f8c8e79218e1 [connection] move relation management method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9078
diff changeset
   488
                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
   489
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   490
    # relations cache handling #################################################
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   491
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
   492
    @_open_only
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   493
    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
   494
        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
   495
        if symmetric:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   496
            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
   497
        else:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   498
            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
   499
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
   500
    @_open_only
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   501
    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
   502
        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
   503
        if symmetric:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   504
            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
   505
        else:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   506
            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
   507
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
   508
    @_open_only
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   509
    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
   510
        try:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   511
            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
   512
        except KeyError:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   513
            return
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   514
        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
   515
        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
   516
            rset, entities = rcache
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   517
            rset = rset.copy()
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   518
            entities = list(entities)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   519
            rset.rows.append([targeteid])
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   520
            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
   521
                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
   522
            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
   523
            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
   524
            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
   525
                targetentity.cw_rset = rset
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   526
                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
   527
                targetentity.cw_col = 0
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   528
            rset.rowcount += 1
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   529
            entities.append(targetentity)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   530
            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
   531
                rset, tuple(entities))
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   532
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
   533
    @_open_only
9077
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   534
    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
   535
        try:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   536
            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
   537
        except KeyError:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   538
            return
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   539
        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
   540
        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
   541
            rset, entities = rcache
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   542
            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
   543
                if row[0] == targeteid:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   544
                    break
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   545
            else:
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   546
                # 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
   547
                # after the database update
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   548
                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
   549
                           role, targeteid)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   550
                return
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   551
            rset = rset.copy()
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   552
            entities = list(entities)
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   553
            del rset.rows[idx]
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   554
            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
   555
                del rset.description[idx]
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   556
            del entities[idx]
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   557
            rset.rowcount -= 1
55a88fbfd39c [connection] move relation cache method to Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9076
diff changeset
   558
            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
   559
                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
   560
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   561
    # 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
   562
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
   563
    @_open_only
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   564
    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
   565
        """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
   566
        current transaction
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   567
        """
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   568
        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
   569
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
   570
    @_open_only
8785
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   571
    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
   572
        """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
   573
        current transaction
8f2786492369 [session/transaction] move entity life utility on transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8784
diff changeset
   574
        """
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   575
        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
   576
8786
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   577
    # Operation management ####################################################
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   578
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
   579
    @_open_only
8786
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   580
    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
   581
        """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
   582
        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
   583
            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
   584
        else:
c2bc0b804982 [session/transaction] move add operation in session code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8785
diff changeset
   585
            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
   586
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   587
    # Hooks control ###########################################################
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   588
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
   589
    @_open_only
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   590
    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
   591
        """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
   592
        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
   593
        """
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   594
        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
   595
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
   596
    @_open_only
9026
84c5b01ebb3e [connection] move hook control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9025
diff changeset
   597
    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
   598
        """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
   599
        categories.
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   600
        """
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
   601
        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
   602
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
   603
    @_open_only
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   604
    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
   605
        """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
   606
        or not
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   607
        """
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
   608
        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
   609
            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
   610
        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
   611
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
   612
    @_open_only
8788
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   613
    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
   614
        """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
   615
        activated or not
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   616
        """
194f1418bc7e [session/transaction] move hook management in transaction itself
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8787
diff changeset
   617
        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
   618
8806
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   619
    # Security management #####################################################
9027
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   620
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
9027
b6b96d61e055 [connection] move security control logic on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9026
diff changeset
   622
    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
   623
        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
   624
8806
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   625
    @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
   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):
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   628
        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
   629
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   630
    @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
   631
    @_open_only
8806
8ca4b323223c [session/transaction] move read_security subtlety in transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8805
diff changeset
   632
    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
   633
        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
   634
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   635
    # undo support ############################################################
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   636
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
   637
    @_open_only
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   638
    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
   639
        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
   640
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
   641
    @_open_only
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   642
    def transaction_uuid(self, set=True):
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   643
        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
   644
        if set and uuid is None:
10752
c69f109293f2 [server/session] unicode → six.text_type
Julien Cristau <julien.cristau@logilab.fr>
parents: 10737
diff changeset
   645
            self.transaction_data['tx_uuid'] = uuid = text_type(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
   646
            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
   647
        return uuid
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   648
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
   649
    @_open_only
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   650
    def transaction_inc_action_counter(self):
9024
701b19785f1d [connection] reinstall cnx.data as cnx.transaction_data
pierre-yves
parents: 9023
diff changeset
   651
        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
   652
        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
   653
        return num
9272
68744f5154c4 [server] fix a number of typos, mostly in docstrings
Julien Cristau <julien.cristau@logilab.fr>
parents: 9267
diff changeset
   654
8844
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   655
    # db-api like interface ###################################################
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   656
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
   657
    @_open_only
8844
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   658
    def source_defs(self):
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   659
        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
   660
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
   661
    @_open_only
11774
51c160677afe [repository] Drop the entities.extid column and associated cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11767
diff changeset
   662
    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
   663
        """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
   664
        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
   665
9086
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   666
    # core method #############################################################
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   667
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
   668
    @_open_only
10005
7769d0f61810 remove leftover pre 3.9 deprecation warnings
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9979
diff changeset
   669
    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
   670
        """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
   671
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   672
        See :meth:`cubicweb.dbapi.Cursor.execute` documentation.
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   673
        """
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   674
        rset = self._execute(self, rql, kwargs, build_descr)
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   675
        rset.req = self
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   676
        return rset
1084843ab2cb [connection] move execute
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9085
diff changeset
   677
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
   678
    @_open_only
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   679
    def rollback(self, free_cnxset=None, reset_pool=None):
9091
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   680
        """rollback the current transaction"""
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   681
        if free_cnxset is not None:
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   682
            warn('[3.21] free_cnxset is now unneeded',
9091
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   683
                 DeprecationWarning, stacklevel=2)
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   684
        if reset_pool is not None:
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   685
            warn('[3.13] reset_pool is now unneeded',
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   686
                 DeprecationWarning, stacklevel=2)
9091
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   687
        cnxset = self.cnxset
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   688
        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
   689
        try:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   690
            # 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
   691
            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
   692
                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
   693
                    try:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   694
                        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
   695
                        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
   696
                    except BaseException:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   697
                        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
   698
                        continue
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   699
                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
   700
                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
   701
        finally:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   702
            self.clear()
8844
168cf5ef21f8 [session/transaction] move multiple utility on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8843
diff changeset
   703
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
   704
    @_open_only
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   705
    def commit(self, free_cnxset=None, reset_pool=None):
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   706
        """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
   707
        if free_cnxset is not None:
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   708
            warn('[3.21] free_cnxset is now unneeded',
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   709
                 DeprecationWarning, stacklevel=2)
10364
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   710
        if reset_pool is not None:
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   711
            warn('[3.13] reset_pool is now unneeded',
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   712
                 DeprecationWarning, stacklevel=2)
8b35a898b334 [server] remove cnxset tracking, it is now unneeded
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10362
diff changeset
   713
        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
   714
        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
   715
        if cstate == 'uncommitable':
9403
d81207fb9499 Fix a couple merge errors
Julien Cristau <julien.cristau@logilab.fr>
parents: 9402
diff changeset
   716
            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
   717
        if cstate == 'precommit':
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   718
            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
   719
            return
10059
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   720
        if cstate == 'postcommit':
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   721
            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
   722
            return
dab538127d72 [session] don't silently ignore commits
Julien Cristau <julien.cristau@logilab.fr>
parents: 9979
diff changeset
   723
        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
   724
        # 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
   725
        # information:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   726
        # - 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
   727
        # - 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
   728
        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
   729
        try:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   730
            # 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
   731
            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
   732
                processed = []
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   733
                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
   734
                if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   735
                    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
   736
                try:
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   737
                    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
   738
                        while self.pending_operations:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   739
                            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
   740
                            operation.processed = 'precommit'
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   741
                            processed.append(operation)
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   742
                            if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   743
                                print(operation)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   744
                            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
   745
                    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
   746
                    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
   747
                except BaseException:
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   748
                    # 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
   749
                    #
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   750
                    # * 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
   751
                    # * 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
   752
                    # * 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
   753
                    #
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   754
                    # 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
   755
                    # 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
   756
                    # 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
   757
                    # 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
   758
                    operation.failed = True
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   759
                    if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   760
                        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
   761
                    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
   762
                        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
   763
                            if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   764
                                print(operation)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   765
                            try:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   766
                                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
   767
                            except BaseException:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   768
                                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
   769
                                              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
   770
                    # 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
   771
                    # read-only property.
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   772
                    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
   773
                    self.rollback()
9092
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   774
                    raise
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   775
                self.cnxset.commit()
48d488dd3c51 [connection] move the commit method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9091
diff changeset
   776
                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
   777
                if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   778
                    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
   779
                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
   780
                    while self.pending_operations:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   781
                        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
   782
                        if debug:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10541
diff changeset
   783
                            print(operation)
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   784
                        operation.processed = 'postcommit'
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   785
                        try:
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   786
                            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
   787
                        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
   788
                            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
   789
                                raise
10351
91e63306e277 [connection] replace .running_dbapi_query with .hooks_in_progress
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 10347
diff changeset
   790
                            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
   791
                                          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
   792
                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
   793
                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
   794
        finally:
4a39f3f1f1d9 [connection] move the rollback method on Connection object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9090
diff changeset
   795
            self.clear()
8812
52af67a2f0a5 [session/transaction] move most undo support into transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8811
diff changeset
   796
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   797
    # resource accessors ######################################################
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   798
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
   799
    @_open_only
9093
e2f88df79efd [connection] move call_service on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9092
diff changeset
   800
    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
   801
        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
   802
        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
   803
        return service.call(**kwargs)
9093
e2f88df79efd [connection] move call_service on Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9092
diff changeset
   804
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
   805
    @_open_only
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   806
    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
   807
        """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
   808
        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
   809
        try:
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   810
            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
   811
        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
   812
            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
   813
                raise
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   814
            source.warning("trying to reconnect")
9482
5b97e69f9c29 [server] fix TypeErrors
Julien Cristau <julien.cristau@logilab.fr>
parents: 9479
diff changeset
   815
            self.cnxset.reconnect()
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   816
            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
   817
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
   818
    @_open_only
8845
667cc27e9d12 [session/transaction] move resource accessors on Transaction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8844
diff changeset
   819
    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
   820
        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
   821
        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
   822
        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
   823
8783
c024365ac8ac [session/transaction] move entity cache management on session
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8782
diff changeset
   824
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   825
class InternalManager(object):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   826
    """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
   827
    bootstrapping the repository or creating regular users according to
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   828
    repository content
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   829
    """
10345
ef54ea75a642 [server] drop repo.internal_session and InternalSession
Julien Cristau <julien.cristau@logilab.fr>
parents: 10301
diff changeset
   830
9479
f13fbab0c718 [server] Allow setting an InternalManager's preferred language
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   831
    def __init__(self, lang='en'):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   832
        self.eid = -1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   833
        self.login = u'__internal_manager__'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   834
        self.properties = {}
9087
dd26b4f95f90 [server/session] better faking of user for InternalManager
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9086
diff changeset
   835
        self.groups = set(['managers'])
9479
f13fbab0c718 [server] Allow setting an InternalManager's preferred language
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   836
        self.lang = lang
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   837
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   838
    def matching_groups(self, groups):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   839
        return 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   840
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   841
    def is_in_group(self, group):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   842
        return True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   843
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   844
    def owns(self, eid):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   845
        return True
1660
d1030dd9730b delete-trailing-whitespaces, missing import
sylvain.thenault@logilab.fr
parents: 1263
diff changeset
   846
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   847
    def property_value(self, key):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   848
        if key == 'ui.language':
9479
f13fbab0c718 [server] Allow setting an InternalManager's preferred language
Julien Cristau <julien.cristau@logilab.fr>
parents: 9478
diff changeset
   849
            return self.lang
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   850
        return None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   851
8563
d28ccecb7bf5 mock ``CWUser.prefered_language()`` on InternalManager objects.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8562
diff changeset
   852
    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
   853
        # 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
   854
        return self.property_value('ui.language')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   855
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
   856
    # 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
   857
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
   858
    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
   859
        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
   860
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
   861
    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
   862
        @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
   863
        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
   864
            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
   865
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
   866
    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
   867
        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
   868
            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
   869
        return None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   870
11348
70337ad23145 pep8 + docstrings and comments improvments
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11206
diff changeset
   871
9021
d8806996ac01 [connection] add logging method on connection
pierre-yves
parents: 9020
diff changeset
   872
set_log_methods(Connection, getLogger('cubicweb.session'))