author | Florent Cayré <florent.cayre@logilab.fr> |
Mon, 27 Feb 2012 10:11:04 +0100 | |
changeset 8268 | c9babe49c1c1 |
parent 8239 | c6cdd060212e |
child 8274 | aedb32d324ab |
permissions | -rw-r--r-- |
7140
ba51dac1115d
[c-c create] unification of c-c create and its subcommands handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7134
diff
changeset
|
1 |
# copyright 2003-2011 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:
5345
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:
5345
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:
5345
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:
5345
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:
5345
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:
5345
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:
5345
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:
5345
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:
5345
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:
5345
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:
5345
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:
5345
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:
5345
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:
5345
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:
5345
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
0 | 18 |
"""DB-API 2.0 compliant module |
19 |
||
20 |
Take a look at http://www.python.org/peps/pep-0249.html |
|
21 |
||
22 |
(most parts of this document are reported here in docstrings) |
|
5813
0b250d72fcfa
[transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5812
diff
changeset
|
23 |
""" |
0 | 24 |
|
25 |
__docformat__ = "restructuredtext en" |
|
26 |
||
5813
0b250d72fcfa
[transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5812
diff
changeset
|
27 |
from threading import currentThread |
1132 | 28 |
from logging import getLogger |
0 | 29 |
from time import time, clock |
2496
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
30 |
from itertools import count |
5174
78438ad513ca
#759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5100
diff
changeset
|
31 |
from warnings import warn |
5507
3604c1c78295
[dbapi] missing import
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5500
diff
changeset
|
32 |
from os.path import join |
7428
5338d895b891
[web session] fix session handling so we get a chance to have for instance the 'forgotpwd' feature working on a site where anonymous are not allowed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7140
diff
changeset
|
33 |
from uuid import uuid4 |
0 | 34 |
|
1923
3802c2e37e72
handle speaking to an instance using old entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1882
diff
changeset
|
35 |
from logilab.common.logging_ext import set_log_methods |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
36 |
from logilab.common.decorators import monkeypatch |
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2650
diff
changeset
|
37 |
from logilab.common.deprecation import deprecated |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
38 |
|
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
39 |
from cubicweb import ETYPE_NAME_MAP, ConnectionError, AuthenticationError,\ |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
40 |
cwvreg, cwconfig |
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:
2770
diff
changeset
|
41 |
from cubicweb.req import RequestSessionBase |
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:
2770
diff
changeset
|
42 |
|
1524 | 43 |
|
0 | 44 |
_MARKER = object() |
45 |
||
2496
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
46 |
def _fake_property_value(self, name): |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
47 |
try: |
4716
55b6a3262071
fix some pylint detected errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4705
diff
changeset
|
48 |
return super(DBAPIRequest, self).property_value(name) |
2496
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
49 |
except KeyError: |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
50 |
return '' |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
51 |
|
6581
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
52 |
def fake(*args, **kwargs): |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
53 |
return None |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
54 |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
55 |
def multiple_connections_fix(): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
56 |
"""some monkey patching necessary when an application has to deal with |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
57 |
several connections to different repositories. It tries to hide buggy class |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
58 |
attributes since classes are not designed to be shared among multiple |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
59 |
registries. |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
60 |
""" |
8190
2a3c1b787688
[vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7962
diff
changeset
|
61 |
defaultcls = cwvreg.CWRegistryStore.REGISTRY_FACTORY[None] |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
62 |
|
8190
2a3c1b787688
[vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7962
diff
changeset
|
63 |
etypescls = cwvreg.CWRegistryStore.REGISTRY_FACTORY['etypes'] |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
64 |
orig_etype_class = etypescls.orig_etype_class = etypescls.etype_class |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
65 |
@monkeypatch(defaultcls) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
66 |
def etype_class(self, etype): |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
67 |
"""return an entity class for the given entity type. |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
68 |
Try to find out a specific class for this kind of entity or |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
69 |
default to a dump of the class registered for 'Any' |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
70 |
""" |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
71 |
usercls = orig_etype_class(self, etype) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
72 |
if etype == 'Any': |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
73 |
return usercls |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
74 |
usercls.e_schema = self.schema.eschema(etype) |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
75 |
return usercls |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
76 |
|
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
77 |
def multiple_connections_unfix(): |
8190
2a3c1b787688
[vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7962
diff
changeset
|
78 |
etypescls = cwvreg.CWRegistryStore.REGISTRY_FACTORY['etypes'] |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
79 |
etypescls.etype_class = etypescls.orig_etype_class |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
80 |
|
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
81 |
|
0 | 82 |
class ConnectionProperties(object): |
83 |
def __init__(self, cnxtype=None, lang=None, close=True, log=False): |
|
84 |
self.cnxtype = cnxtype or 'pyro' |
|
85 |
self.lang = lang |
|
86 |
self.log_queries = log |
|
87 |
self.close_on_del = close |
|
88 |
||
89 |
||
90 |
def get_repository(method, database=None, config=None, vreg=None): |
|
91 |
"""get a proxy object to the CubicWeb repository, using a specific RPC method. |
|
1524 | 92 |
|
0 | 93 |
Only 'in-memory' and 'pyro' are supported for now. Either vreg or config |
94 |
argument should be given |
|
95 |
""" |
|
96 |
assert method in ('pyro', 'inmemory') |
|
97 |
assert vreg or config |
|
98 |
if vreg and not config: |
|
99 |
config = vreg.config |
|
100 |
if method == 'inmemory': |
|
101 |
# get local access to the repository |
|
102 |
from cubicweb.server.repository import Repository |
|
103 |
return Repository(config, vreg=vreg) |
|
104 |
else: # method == 'pyro' |
|
105 |
# resolve the Pyro object |
|
7134
01544b6d98fa
allow CW to act as a Pyro Server without registering the server to a Pyro Nameserver (closes #1528533)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7085
diff
changeset
|
106 |
from logilab.common.pyro_ext import ns_get_proxy, get_proxy |
6061
7cb29eab1c9d
[pyro] instance id cleanup, ensure config['pyro-instance-id'] is a fully qualified pyro id on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5863
diff
changeset
|
107 |
pyroid = database or config['pyro-instance-id'] or config.appid |
0 | 108 |
try: |
7134
01544b6d98fa
allow CW to act as a Pyro Server without registering the server to a Pyro Nameserver (closes #1528533)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7085
diff
changeset
|
109 |
if config['pyro-ns-host'] == 'NO_PYRONS': |
01544b6d98fa
allow CW to act as a Pyro Server without registering the server to a Pyro Nameserver (closes #1528533)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7085
diff
changeset
|
110 |
return get_proxy(pyroid) |
01544b6d98fa
allow CW to act as a Pyro Server without registering the server to a Pyro Nameserver (closes #1528533)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7085
diff
changeset
|
111 |
else: |
01544b6d98fa
allow CW to act as a Pyro Server without registering the server to a Pyro Nameserver (closes #1528533)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7085
diff
changeset
|
112 |
return ns_get_proxy(pyroid, defaultnsgroup=config['pyro-ns-group'], |
01544b6d98fa
allow CW to act as a Pyro Server without registering the server to a Pyro Nameserver (closes #1528533)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7085
diff
changeset
|
113 |
nshost=config['pyro-ns-host']) |
2665
0c6281487f90
[pyro] use lgc.pyro_ext, simplify pyro related options
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
114 |
except Exception, ex: |
0c6281487f90
[pyro] use lgc.pyro_ext, simplify pyro related options
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2657
diff
changeset
|
115 |
raise ConnectionError(str(ex)) |
1524 | 116 |
|
3647
2941f4a0aab9
refactor repo authentication to allow pluggable authentifier to login with something else than a password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
117 |
def repo_connect(repo, login, **kwargs): |
0 | 118 |
"""Constructor to create a new connection to the CubicWeb repository. |
1524 | 119 |
|
0 | 120 |
Returns a Connection instance. |
121 |
""" |
|
3647
2941f4a0aab9
refactor repo authentication to allow pluggable authentifier to login with something else than a password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
122 |
if not 'cnxprops' in kwargs: |
2941f4a0aab9
refactor repo authentication to allow pluggable authentifier to login with something else than a password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
123 |
kwargs['cnxprops'] = ConnectionProperties('inmemory') |
2941f4a0aab9
refactor repo authentication to allow pluggable authentifier to login with something else than a password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
124 |
cnxid = repo.connect(unicode(login), **kwargs) |
2941f4a0aab9
refactor repo authentication to allow pluggable authentifier to login with something else than a password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
125 |
cnx = Connection(repo, cnxid, kwargs['cnxprops']) |
2941f4a0aab9
refactor repo authentication to allow pluggable authentifier to login with something else than a password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
126 |
if kwargs['cnxprops'].cnxtype == 'inmemory': |
0 | 127 |
cnx.vreg = repo.vreg |
128 |
return cnx |
|
1524 | 129 |
|
3647
2941f4a0aab9
refactor repo authentication to allow pluggable authentifier to login with something else than a password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
130 |
def connect(database=None, login=None, host=None, group=None, |
2941f4a0aab9
refactor repo authentication to allow pluggable authentifier to login with something else than a password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
131 |
cnxprops=None, setvreg=True, mulcnx=True, initlog=True, **kwargs): |
0 | 132 |
"""Constructor for creating a connection to the CubicWeb repository. |
5345
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
133 |
Returns a :class:`Connection` object. |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
134 |
|
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
135 |
Typical usage:: |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
136 |
|
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
137 |
cnx = connect('myinstance', login='me', password='toto') |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
138 |
|
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
139 |
Arguments: |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
140 |
|
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
141 |
:database: |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
142 |
the instance's pyro identifier. |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
143 |
|
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
144 |
:login: |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
145 |
the user login to use to authenticate. |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
146 |
|
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
147 |
:host: |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
148 |
the pyro nameserver host. Will be detected using broadcast query if |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
149 |
unspecified. |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
150 |
|
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
151 |
:group: |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
152 |
the instance's pyro nameserver group. You don't have to specify it unless |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
153 |
tweaked in instance's configuration. |
0 | 154 |
|
5345
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
155 |
:cnxprops: |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
156 |
an optional :class:`ConnectionProperties` instance, allowing to specify |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
157 |
the connection method (eg in memory or pyro). A Pyro connection will be |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
158 |
established if you don't specify that argument. |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
159 |
|
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
160 |
:setvreg: |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
161 |
flag telling if a registry should be initialized for the connection. |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
162 |
Don't change this unless you know what you're doing. |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
163 |
|
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
164 |
:mulcnx: |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
165 |
Will disappear at some point. Try to deal with connections to differents |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
166 |
instances in the same process unless specified otherwise by setting this |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
167 |
flag to False. Don't change this unless you know what you're doing. |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
168 |
|
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
169 |
:initlog: |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
170 |
flag telling if logging should be initialized. You usually don't want |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
171 |
logging initialization when establishing the connection from a process |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
172 |
where it's already initialized. |
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
173 |
|
dc9afabbb45b
[dbapi] document connect() function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5307
diff
changeset
|
174 |
:kwargs: |
7004
9e142116d82f
[dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
175 |
there goes authentication tokens. You usually have to specify a password |
9e142116d82f
[dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
176 |
for the given user, using a named 'password' argument. |
0 | 177 |
""" |
178 |
cnxprops = cnxprops or ConnectionProperties() |
|
179 |
method = cnxprops.cnxtype |
|
7004
9e142116d82f
[dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
180 |
if method == 'pyro': |
9e142116d82f
[dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
181 |
config = cwconfig.CubicWebNoAppConfiguration() |
9e142116d82f
[dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
182 |
if host: |
9e142116d82f
[dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
183 |
config.global_set_option('pyro-ns-host', host) |
9e142116d82f
[dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
184 |
if group: |
9e142116d82f
[dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
185 |
config.global_set_option('pyro-ns-group', group) |
9e142116d82f
[dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
186 |
else: |
9e142116d82f
[dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
187 |
assert database |
9e142116d82f
[dbapi] fix for cases where one want to use 'connect' for an in-memory connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
188 |
config = cwconfig.instance_configuration(database) |
0 | 189 |
repo = get_repository(method, database, config=config) |
190 |
if method == 'inmemory': |
|
191 |
vreg = repo.vreg |
|
192 |
elif setvreg: |
|
193 |
if mulcnx: |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2496
diff
changeset
|
194 |
multiple_connections_fix() |
8190
2a3c1b787688
[vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7962
diff
changeset
|
195 |
vreg = cwvreg.CWRegistryStore(config, initlog=initlog) |
1923
3802c2e37e72
handle speaking to an instance using old entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1882
diff
changeset
|
196 |
schema = repo.get_schema() |
3802c2e37e72
handle speaking to an instance using old entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1882
diff
changeset
|
197 |
for oldetype, newetype in ETYPE_NAME_MAP.items(): |
3802c2e37e72
handle speaking to an instance using old entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1882
diff
changeset
|
198 |
if oldetype in schema: |
3802c2e37e72
handle speaking to an instance using old entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1882
diff
changeset
|
199 |
print 'aliasing', newetype, 'to', oldetype |
3802c2e37e72
handle speaking to an instance using old entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1882
diff
changeset
|
200 |
schema._entities[newetype] = schema._entities[oldetype] |
3802c2e37e72
handle speaking to an instance using old entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1882
diff
changeset
|
201 |
vreg.set_schema(schema) |
0 | 202 |
else: |
203 |
vreg = None |
|
3647
2941f4a0aab9
refactor repo authentication to allow pluggable authentifier to login with something else than a password
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
204 |
cnx = repo_connect(repo, login, cnxprops=cnxprops, **kwargs) |
0 | 205 |
cnx.vreg = vreg |
206 |
return cnx |
|
207 |
||
7056
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
208 |
def in_memory_repo(config): |
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
209 |
"""Return and in_memory Repository object from a config (or vreg)""" |
8190
2a3c1b787688
[vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7962
diff
changeset
|
210 |
if isinstance(config, cwvreg.CWRegistryStore): |
0 | 211 |
vreg = config |
212 |
config = None |
|
213 |
else: |
|
214 |
vreg = None |
|
215 |
# get local access to the repository |
|
7056
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
216 |
return get_repository('inmemory', config=config, vreg=vreg) |
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
217 |
|
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
218 |
def in_memory_cnx(repo, login, **kwargs): |
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
219 |
"""Establish a In memory connection to a <repo> for the user with <login> |
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
220 |
|
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
221 |
additionel credential might be required""" |
0 | 222 |
cnxprops = ConnectionProperties('inmemory') |
7056
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
223 |
return repo_connect(repo, login, cnxprops=cnxprops, **kwargs) |
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
224 |
|
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
225 |
def in_memory_repo_cnx(config, login, **kwargs): |
7876
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
226 |
"""useful method for testing and scripting to get a dbapi.Connection |
7056
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
227 |
object connected to an in-memory repository instance |
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
228 |
""" |
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
229 |
# connection to the CubicWeb repository |
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
230 |
repo = in_memory_repo(config) |
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7004
diff
changeset
|
231 |
return repo, in_memory_cnx(repo, login, **kwargs) |
0 | 232 |
|
7876
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
233 |
|
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
234 |
def anonymous_session(vreg): |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
235 |
"""return a new anonymous session |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
236 |
|
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
237 |
raises an AuthenticationError if anonymous usage is not allowed |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
238 |
""" |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
239 |
anoninfo = vreg.config.anonymous_user() |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
240 |
if anoninfo is None: # no anonymous user |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
241 |
raise AuthenticationError('anonymous access is not authorized') |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
242 |
anon_login, anon_password = anoninfo |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
243 |
cnxprops = ConnectionProperties(vreg.config.repo_method) |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
244 |
# use vreg's repository cache |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
245 |
repo = vreg.config.repository(vreg) |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
246 |
anon_cnx = repo_connect(repo, anon_login, |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
247 |
cnxprops=cnxprops, password=anon_password) |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
248 |
anon_cnx.vreg = vreg |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
249 |
return DBAPISession(anon_cnx, anon_login) |
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
250 |
|
df15d194a134
[views] implement json / jsonp export views (closes #1942658)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7815
diff
changeset
|
251 |
|
5244
5467674ad101
[web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
252 |
class _NeedAuthAccessMock(object): |
5467674ad101
[web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
253 |
def __getattribute__(self, attr): |
5467674ad101
[web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
254 |
raise AuthenticationError() |
5467674ad101
[web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
255 |
def __nonzero__(self): |
5467674ad101
[web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
256 |
return False |
0 | 257 |
|
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
258 |
class DBAPISession(object): |
6848
f87cd875c6db
[web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
259 |
def __init__(self, cnx, login=None): |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
260 |
self.cnx = cnx |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
261 |
self.data = {} |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
262 |
self.login = login |
7589
d3459fe041f0
[web session] fix bad cleanup of session without a connection set. Closes #1772125
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7428
diff
changeset
|
263 |
self.mtime = time() |
5251
b675edd05c19
[web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5244
diff
changeset
|
264 |
# dbapi session identifier is the same as the first connection |
b675edd05c19
[web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5244
diff
changeset
|
265 |
# identifier, but may later differ in case of auto-reconnection as done |
b675edd05c19
[web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5244
diff
changeset
|
266 |
# by the web authentication manager (in cw.web.views.authentication) |
b675edd05c19
[web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5244
diff
changeset
|
267 |
if cnx is not None: |
b675edd05c19
[web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5244
diff
changeset
|
268 |
self.sessionid = cnx.sessionid |
b675edd05c19
[web session] fix web session id bug on automatic reconnection. The web session id should keep the first connection id, then differ of the repo connection id once some reconnection has been done (since the session cookie isn't updated in such cases). Also, use a lock to avoid potential race condition on reconnection.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5244
diff
changeset
|
269 |
else: |
7428
5338d895b891
[web session] fix session handling so we get a chance to have for instance the 'forgotpwd' feature working on a site where anonymous are not allowed
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7140
diff
changeset
|
270 |
self.sessionid = uuid4().hex |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
271 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
272 |
@property |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
273 |
def anonymous_session(self): |
5244
5467674ad101
[web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
274 |
return not self.cnx or self.cnx.anonymous_connection |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
275 |
|
7909
71c70bf482cf
[web session] ProgrammingError may be raised, we should catch it (closes #1980076)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
276 |
def __repr__(self): |
71c70bf482cf
[web session] ProgrammingError may be raised, we should catch it (closes #1980076)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
277 |
return '<DBAPISession %r>' % self.sessionid |
0 | 278 |
|
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:
2770
diff
changeset
|
279 |
class DBAPIRequest(RequestSessionBase): |
1524 | 280 |
|
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
281 |
def __init__(self, vreg, session=None): |
0 | 282 |
super(DBAPIRequest, self).__init__(vreg) |
283 |
try: |
|
284 |
# no vreg or config which doesn't handle translations |
|
285 |
self.translations = vreg.config.translations |
|
286 |
except AttributeError: |
|
287 |
self.translations = {} |
|
288 |
self.set_default_language(vreg) |
|
289 |
# cache entities built during the request |
|
290 |
self._eid_cache = {} |
|
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
291 |
if session is not None: |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
292 |
self.set_session(session) |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
293 |
else: |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
294 |
# these args are initialized after a connection is |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
295 |
# established |
5244
5467674ad101
[web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
296 |
self.session = None |
5271
94e16453a640
[dbapi] fix user handling on dbapi request. Avoid getting None as _user and remove the need for a property.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5251
diff
changeset
|
297 |
self.cnx = self.user = _NeedAuthAccessMock() |
0 | 298 |
|
299 |
def from_controller(self): |
|
300 |
return 'view' |
|
1524 | 301 |
|
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
302 |
def set_session(self, session, user=None): |
0 | 303 |
"""method called by the session handler when the user is authenticated |
304 |
or an anonymous connection is open |
|
305 |
""" |
|
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
306 |
self.session = session |
5244
5467674ad101
[web] put a fake object that raise Unauthorized on any attribute access as req.cnx and req._user, so we are properly asked to authenticated on any view that tries to do something with one of those attributes (instead of doing defensive programming everywhere we're doing that)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5223
diff
changeset
|
307 |
if session.cnx: |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
308 |
self.cnx = session.cnx |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
309 |
self.execute = session.cnx.cursor(self).execute |
5271
94e16453a640
[dbapi] fix user handling on dbapi request. Avoid getting None as _user and remove the need for a property.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5251
diff
changeset
|
310 |
if user is None: |
94e16453a640
[dbapi] fix user handling on dbapi request. Avoid getting None as _user and remove the need for a property.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5251
diff
changeset
|
311 |
user = self.cnx.user(self, {'lang': self.lang}) |
94e16453a640
[dbapi] fix user handling on dbapi request. Avoid getting None as _user and remove the need for a property.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5251
diff
changeset
|
312 |
if user is not None: |
94e16453a640
[dbapi] fix user handling on dbapi request. Avoid getting None as _user and remove the need for a property.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5251
diff
changeset
|
313 |
self.user = user |
94e16453a640
[dbapi] fix user handling on dbapi request. Avoid getting None as _user and remove the need for a property.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5251
diff
changeset
|
314 |
self.set_entity_cache(user) |
1524 | 315 |
|
7879
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
316 |
def execute(self, *args, **kwargs): # pylint: disable=E0202 |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
317 |
"""overriden when session is set. By default raise authentication error |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
318 |
so authentication is requested. |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
319 |
""" |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
320 |
raise AuthenticationError() |
1524 | 321 |
|
0 | 322 |
def set_default_language(self, vreg): |
323 |
try: |
|
324 |
self.lang = vreg.property_value('ui.language') |
|
7815
2a164a9cf81c
[exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7665
diff
changeset
|
325 |
except Exception: # property may not be registered |
0 | 326 |
self.lang = 'en' |
327 |
# use req.__ to translate a message without registering it to the catalog |
|
328 |
try: |
|
3275
5247789df541
[gettext] provide GNU contexts to avoid translations ambiguities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3258
diff
changeset
|
329 |
gettext, pgettext = self.translations[self.lang] |
5247789df541
[gettext] provide GNU contexts to avoid translations ambiguities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3258
diff
changeset
|
330 |
self._ = self.__ = gettext |
5247789df541
[gettext] provide GNU contexts to avoid translations ambiguities
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3258
diff
changeset
|
331 |
self.pgettext = pgettext |
0 | 332 |
except KeyError: |
333 |
# this occurs usually during test execution |
|
334 |
self._ = self.__ = unicode |
|
7960
981d2a6d95be
[test] map pgettext to unicode as _
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7909
diff
changeset
|
335 |
self.pgettext = lambda x, y: unicode(y) |
2111
5e142c7a4531
different message
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
336 |
self.debug('request default language: %s', self.lang) |
0 | 337 |
|
338 |
# entities cache management ############################################### |
|
1524 | 339 |
|
0 | 340 |
def entity_cache(self, eid): |
341 |
return self._eid_cache[eid] |
|
1524 | 342 |
|
0 | 343 |
def set_entity_cache(self, entity): |
344 |
self._eid_cache[entity.eid] = entity |
|
345 |
||
346 |
def cached_entities(self): |
|
347 |
return self._eid_cache.values() |
|
1524 | 348 |
|
0 | 349 |
def drop_entity_cache(self, eid=None): |
350 |
if eid is None: |
|
351 |
self._eid_cache = {} |
|
352 |
else: |
|
353 |
del self._eid_cache[eid] |
|
354 |
||
355 |
# low level session data management ####################################### |
|
356 |
||
6013
8ca424bc393b
[dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6012
diff
changeset
|
357 |
def get_shared_data(self, key, default=None, pop=False, txdata=False): |
8ca424bc393b
[dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6012
diff
changeset
|
358 |
"""see :meth:`Connection.get_shared_data`""" |
8ca424bc393b
[dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6012
diff
changeset
|
359 |
return self.cnx.get_shared_data(key, default, pop, txdata) |
0 | 360 |
|
6013
8ca424bc393b
[dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6012
diff
changeset
|
361 |
def set_shared_data(self, key, value, txdata=False, querydata=None): |
8ca424bc393b
[dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6012
diff
changeset
|
362 |
"""see :meth:`Connection.set_shared_data`""" |
8ca424bc393b
[dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6012
diff
changeset
|
363 |
if querydata is not None: |
8ca424bc393b
[dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6012
diff
changeset
|
364 |
txdata = querydata |
8ca424bc393b
[dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6012
diff
changeset
|
365 |
warn('[3.10] querydata argument has been renamed to txdata', |
8ca424bc393b
[dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6012
diff
changeset
|
366 |
DeprecationWarning, stacklevel=2) |
8ca424bc393b
[dbapi] cleanup shared data api: let access to transaction from dbapi, we can write it after all... Also, querydata is better named txdata
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6012
diff
changeset
|
367 |
return self.cnx.set_shared_data(key, value, txdata) |
0 | 368 |
|
369 |
# server session compat layer ############################################# |
|
370 |
||
7543
570522300e22
[ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7428
diff
changeset
|
371 |
def describe(self, eid, asdict=False): |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
372 |
"""return a tuple (type, sourceuri, extid) for the entity with id <eid>""" |
7543
570522300e22
[ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7428
diff
changeset
|
373 |
return self.cnx.describe(eid, asdict) |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
374 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
375 |
def source_defs(self): |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
376 |
"""return the definition of sources used by the repository.""" |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
377 |
return self.cnx.source_defs() |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
378 |
|
3110
757d36162235
enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2665
diff
changeset
|
379 |
def hijack_user(self, user): |
757d36162235
enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2665
diff
changeset
|
380 |
"""return a fake request/session using specified user""" |
757d36162235
enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2665
diff
changeset
|
381 |
req = DBAPIRequest(self.vreg) |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
382 |
req.set_session(self.session, user) |
3110
757d36162235
enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2665
diff
changeset
|
383 |
return req |
757d36162235
enhance notification mecanism: recipients may return user entities, which will be used to create a fake session so one can check security during notification if necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2665
diff
changeset
|
384 |
|
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
385 |
@deprecated('[3.8] use direct access to req.session.data dictionary') |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
386 |
def session_data(self): |
8238
087bb529035c
[spelling] fix dictionnary -> dictionary typo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7962
diff
changeset
|
387 |
"""return a dictionary containing session data""" |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
388 |
return self.session.data |
0 | 389 |
|
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
390 |
@deprecated('[3.8] use direct access to req.session.data dictionary') |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
391 |
def get_session_data(self, key, default=None, pop=False): |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
392 |
if pop: |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
393 |
return self.session.data.pop(key, default) |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
394 |
return self.session.data.get(key, default) |
1524 | 395 |
|
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
396 |
@deprecated('[3.8] use direct access to req.session.data dictionary') |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
397 |
def set_session_data(self, key, value): |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
398 |
self.session.data[key] = value |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
399 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
400 |
@deprecated('[3.8] use direct access to req.session.data dictionary') |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
401 |
def del_session_data(self, key): |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
402 |
self.session.data.pop(key, None) |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
403 |
|
7083
b8e35cde46e9
help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7056
diff
changeset
|
404 |
# these are overridden by set_log_methods below |
b8e35cde46e9
help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7056
diff
changeset
|
405 |
# only defining here to prevent pylint from complaining |
b8e35cde46e9
help pylint by explicitely defining some attributes
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7056
diff
changeset
|
406 |
info = warning = error = critical = exception = debug = lambda msg,*a,**kw: None |
0 | 407 |
|
408 |
set_log_methods(DBAPIRequest, getLogger('cubicweb.dbapi')) |
|
1524 | 409 |
|
410 |
||
0 | 411 |
# exceptions ################################################################## |
412 |
||
413 |
class ProgrammingError(Exception): #DatabaseError): |
|
414 |
"""Exception raised for errors that are related to the database's operation |
|
415 |
and not necessarily under the control of the programmer, e.g. an unexpected |
|
416 |
disconnect occurs, the data source name is not found, a transaction could |
|
417 |
not be processed, a memory allocation error occurred during processing, |
|
418 |
etc. |
|
419 |
""" |
|
420 |
||
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
421 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
422 |
# cursor / connection objects ################################################## |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
423 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
424 |
class Cursor(object): |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
425 |
"""These objects represent a database cursor, which is used to manage the |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
426 |
context of a fetch operation. Cursors created from the same connection are |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
427 |
not isolated, i.e., any changes done to the database by a cursor are |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
428 |
immediately visible by the other cursors. Cursors created from different |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
429 |
connections are isolated. |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
430 |
""" |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
431 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
432 |
def __init__(self, connection, repo, req=None): |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
433 |
"""This read-only attribute return a reference to the Connection |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
434 |
object on which the cursor was created. |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
435 |
""" |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
436 |
self.connection = connection |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
437 |
"""optionnal issuing request instance""" |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
438 |
self.req = req |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
439 |
self._repo = repo |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
440 |
self._sessid = connection.sessionid |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
441 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
442 |
def close(self): |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
443 |
"""no effect""" |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
444 |
pass |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
445 |
|
5813
0b250d72fcfa
[transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5812
diff
changeset
|
446 |
def _txid(self): |
0b250d72fcfa
[transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5812
diff
changeset
|
447 |
return self.connection._txid(self) |
0b250d72fcfa
[transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5812
diff
changeset
|
448 |
|
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
449 |
def execute(self, rql, args=None, eid_key=None, build_descr=True): |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
450 |
"""execute a rql query, return resulting rows and their description in |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
451 |
a :class:`~cubicweb.rset.ResultSet` object |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
452 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
453 |
* `rql` should be an Unicode string or a plain ASCII string, containing |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
454 |
the rql query |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
455 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
456 |
* `args` the optional args dictionary associated to the query, with key |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
457 |
matching named substitution in `rql` |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
458 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
459 |
* `build_descr` is a boolean flag indicating if the description should |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
460 |
be built on select queries (if false, the description will be en empty |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
461 |
list) |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
462 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
463 |
on INSERT queries, there will be one row for each inserted entity, |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
464 |
containing its eid |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
465 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
466 |
on SET queries, XXX describe |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
467 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
468 |
DELETE queries returns no result. |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
469 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
470 |
.. Note:: |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
471 |
to maximize the rql parsing/analyzing cache performance, you should |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
472 |
always use substitute arguments in queries, i.e. avoid query such as:: |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
473 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
474 |
execute('Any X WHERE X eid 123') |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
475 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
476 |
use:: |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
477 |
|
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
478 |
execute('Any X WHERE X eid %(x)s', {'x': 123}) |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
479 |
""" |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
480 |
if eid_key is not None: |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
481 |
warn('[3.8] eid_key is deprecated, you can safely remove this argument', |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
482 |
DeprecationWarning, stacklevel=2) |
5364
e0feefb87de5
[dbapi] some compat with distant < 3.8 repo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5359
diff
changeset
|
483 |
# XXX use named argument for build_descr in case repo is < 3.8 |
5813
0b250d72fcfa
[transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5812
diff
changeset
|
484 |
rset = self._repo.execute(self._sessid, rql, args, |
5859
3da3574fe397
[dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5813
diff
changeset
|
485 |
build_descr=build_descr, **self._txid()) |
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
486 |
rset.req = self.req |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
487 |
return rset |
0 | 488 |
|
489 |
||
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
490 |
class LogCursor(Cursor): |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
491 |
"""override the standard cursor to log executed queries""" |
0 | 492 |
|
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
493 |
def execute(self, operation, parameters=None, eid_key=None, build_descr=True): |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
494 |
"""override the standard cursor to log executed queries""" |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
495 |
if eid_key is not None: |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
496 |
warn('[3.8] eid_key is deprecated, you can safely remove this argument', |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
497 |
DeprecationWarning, stacklevel=2) |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
498 |
tstart, cstart = time(), clock() |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
499 |
rset = Cursor.execute(self, operation, parameters, build_descr=build_descr) |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
500 |
self.connection.executed_queries.append((operation, parameters, |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
501 |
time() - tstart, clock() - cstart)) |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
502 |
return rset |
0 | 503 |
|
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
504 |
def check_not_closed(func): |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
505 |
def decorator(self, *args, **kwargs): |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
506 |
if self._closed is not None: |
7665
0cd299c16f12
[session] add session id to closed connection errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7650
diff
changeset
|
507 |
raise ProgrammingError('Closed connection %s' % self.sessionid) |
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
508 |
return func(self, *args, **kwargs) |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
509 |
return decorator |
0 | 510 |
|
511 |
class Connection(object): |
|
3258
6536ee4f37f7
update the documentation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3110
diff
changeset
|
512 |
"""DB-API 2.0 compatible Connection object for CubicWeb |
0 | 513 |
""" |
514 |
# make exceptions available through the connection object |
|
515 |
ProgrammingError = ProgrammingError |
|
5223
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
516 |
# attributes that may be overriden per connection instance |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
517 |
anonymous_connection = False |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
518 |
cursor_class = Cursor |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
519 |
vreg = None |
6abd6e3599f4
#773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5174
diff
changeset
|
520 |
_closed = None |
0 | 521 |
|
522 |
def __init__(self, repo, cnxid, cnxprops=None): |
|
523 |
self._repo = repo |
|
524 |
self.sessionid = cnxid |
|
525 |
self._close_on_del = getattr(cnxprops, 'close_on_del', True) |
|
526 |
self._cnxtype = getattr(cnxprops, 'cnxtype', 'pyro') |
|
6581
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
527 |
self._web_request = False |
0 | 528 |
if cnxprops and cnxprops.log_queries: |
529 |
self.executed_queries = [] |
|
530 |
self.cursor_class = LogCursor |
|
5859
3da3574fe397
[dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5813
diff
changeset
|
531 |
if self._cnxtype == 'pyro': |
3da3574fe397
[dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5813
diff
changeset
|
532 |
# check client/server compat |
3da3574fe397
[dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5813
diff
changeset
|
533 |
if self._repo.get_versions()['cubicweb'] < (3, 8, 6): |
3da3574fe397
[dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5813
diff
changeset
|
534 |
self._txid = lambda cursor=None: {} |
0 | 535 |
|
536 |
def __repr__(self): |
|
537 |
if self.anonymous_connection: |
|
538 |
return '<Connection %s (anonymous)>' % self.sessionid |
|
539 |
return '<Connection %s>' % self.sessionid |
|
540 |
||
5100
04c71ebf38a5
Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5032
diff
changeset
|
541 |
def __enter__(self): |
04c71ebf38a5
Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5032
diff
changeset
|
542 |
return self.cursor() |
04c71ebf38a5
Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5032
diff
changeset
|
543 |
|
04c71ebf38a5
Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5032
diff
changeset
|
544 |
def __exit__(self, exc_type, exc_val, exc_tb): |
04c71ebf38a5
Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5032
diff
changeset
|
545 |
if exc_type is None: |
04c71ebf38a5
Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5032
diff
changeset
|
546 |
self.commit() |
04c71ebf38a5
Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5032
diff
changeset
|
547 |
else: |
04c71ebf38a5
Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5032
diff
changeset
|
548 |
self.rollback() |
04c71ebf38a5
Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5032
diff
changeset
|
549 |
return False #propagate the exception |
04c71ebf38a5
Add context management methode to dbapi.Connection
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5032
diff
changeset
|
550 |
|
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
551 |
def __del__(self): |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
552 |
"""close the remote connection if necessary""" |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
553 |
if self._closed is None and self._close_on_del: |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
554 |
try: |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
555 |
self.close() |
7815
2a164a9cf81c
[exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7665
diff
changeset
|
556 |
except Exception: |
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
557 |
pass |
2245
7463e1a748dd
new set_session_props method exposed by the repository, use it to be sure session language is in sync the request language
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2111
diff
changeset
|
558 |
|
8268
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8239
diff
changeset
|
559 |
# server-side service call ################################################# |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8239
diff
changeset
|
560 |
|
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8239
diff
changeset
|
561 |
@check_not_closed |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8239
diff
changeset
|
562 |
def call_service(self, regid, async=False, **kwargs): |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8239
diff
changeset
|
563 |
return self._repo.call_service(self.sessionid, regid, async, **kwargs) |
c9babe49c1c1
[repository] implement a generic way to call repo-side services; closes #2203418
Florent Cayré <florent.cayre@logilab.fr>
parents:
8239
diff
changeset
|
564 |
|
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
565 |
# connection initialization methods ######################################## |
0 | 566 |
|
5763
1bdddb7460a9
[vreg] register_objects lost its force_reload argument, fix dbapi.Connection.load_appobjects consequently
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5507
diff
changeset
|
567 |
def load_appobjects(self, cubes=_MARKER, subpath=None, expand=True): |
0 | 568 |
config = self.vreg.config |
569 |
if cubes is _MARKER: |
|
570 |
cubes = self._repo.get_cubes() |
|
571 |
elif cubes is None: |
|
572 |
cubes = () |
|
573 |
else: |
|
574 |
if not isinstance(cubes, (list, tuple)): |
|
575 |
cubes = (cubes,) |
|
576 |
if expand: |
|
577 |
cubes = config.expand_cubes(cubes) |
|
578 |
if subpath is None: |
|
579 |
subpath = esubpath = ('entities', 'views') |
|
580 |
else: |
|
581 |
esubpath = subpath |
|
582 |
if 'views' in subpath: |
|
583 |
esubpath = list(subpath) |
|
584 |
esubpath.remove('views') |
|
5500
55a40cc0ab9a
replaced hardcoded 'web/view' by os.path.join('web', 'view') so views path is also valid under windows
egazoni
parents:
5429
diff
changeset
|
585 |
esubpath.append(join('web', 'views')) |
6494
70c87c717e4a
[config] make config.cubes() available on NoAppCubicWebConfiguration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
586 |
config.init_cubes(cubes) |
70c87c717e4a
[config] make config.cubes() available on NoAppCubicWebConfiguration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6333
diff
changeset
|
587 |
vpath = config.build_vregistry_path(reversed(config.cubes_path()), |
5812
d970049d7cfd
[dbapi] Connection.load_appobjects should load site_cubicweb files as well, they may contains necessary RQL extension function definitions. Also kill some broken deprecated code in this method.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5763
diff
changeset
|
588 |
evobjpath=esubpath, |
0 | 589 |
tvobjpath=subpath) |
5763
1bdddb7460a9
[vreg] register_objects lost its force_reload argument, fix dbapi.Connection.load_appobjects consequently
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5507
diff
changeset
|
590 |
self.vreg.register_objects(vpath) |
1524 | 591 |
|
2496
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
592 |
def use_web_compatible_requests(self, baseurl, sitetitle=None): |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
593 |
"""monkey patch DBAPIRequest to fake a cw.web.request, so you should |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
594 |
able to call html views using rset from a simple dbapi connection. |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
595 |
|
2657
de974465d381
[appobject] kill VObject class, move base selector classes to appobject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2650
diff
changeset
|
596 |
You should call `load_appobjects` at some point to register those views. |
2496
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
597 |
""" |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
598 |
DBAPIRequest.property_value = _fake_property_value |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
599 |
DBAPIRequest.next_tabindex = count().next |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
600 |
DBAPIRequest.relative_path = fake |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
601 |
DBAPIRequest.url = fake |
3832
ce8dd861f442
#473188: missing get_page_data when patching bare db-api request for web compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3707
diff
changeset
|
602 |
DBAPIRequest.get_page_data = fake |
3833
5507aa75f601
add set_page_data as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3832
diff
changeset
|
603 |
DBAPIRequest.set_page_data = fake |
2496
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
604 |
# XXX could ask the repo for it's base-url configuration |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
605 |
self.vreg.config.set_option('base-url', baseurl) |
6581
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
606 |
self.vreg.config.uiprops = {} |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
607 |
self.vreg.config.datadir_url = baseurl + '/data' |
2496
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
608 |
# XXX why is this needed? if really needed, could be fetched by a query |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
609 |
if sitetitle is not None: |
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
610 |
self.vreg['propertydefs']['ui.site-title'] = {'default': sitetitle} |
6581
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
611 |
self._web_request = True |
2496
fbd1fd2ca312
#343624: access to ORM and views outside web engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2476
diff
changeset
|
612 |
|
6581
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
613 |
def request(self): |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
614 |
if self._web_request: |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
615 |
from cubicweb.web.request import CubicWebRequestBase |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
616 |
req = CubicWebRequestBase(self.vreg, False) |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
617 |
req.get_header = lambda x, default=None: default |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
618 |
req.set_session = lambda session, user=None: DBAPIRequest.set_session( |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
619 |
req, session, user) |
6613
e7ff604491b2
[dbapi] web request compatibility fixes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6581
diff
changeset
|
620 |
req.relative_path = lambda includeparams=True: '' |
6581
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
621 |
else: |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
622 |
req = DBAPIRequest(self.vreg) |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
623 |
req.set_session(DBAPISession(self)) |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
624 |
return req |
0 | 625 |
|
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
626 |
@check_not_closed |
322
0d9aca19b3d0
make req argument optional
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
169
diff
changeset
|
627 |
def user(self, req=None, props=None): |
0 | 628 |
"""return the User object associated to this connection""" |
629 |
# cnx validity is checked by the call to .user_info |
|
2245
7463e1a748dd
new set_session_props method exposed by the repository, use it to be sure session language is in sync the request language
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2111
diff
changeset
|
630 |
eid, login, groups, properties = self._repo.user_info(self.sessionid, |
7463e1a748dd
new set_session_props method exposed by the repository, use it to be sure session language is in sync the request language
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2111
diff
changeset
|
631 |
props) |
0 | 632 |
if req is None: |
633 |
req = self.request() |
|
1923
3802c2e37e72
handle speaking to an instance using old entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1882
diff
changeset
|
634 |
rset = req.eid_rset(eid, 'CWUser') |
5359
d83a227df75c
[dbapi] take care vreg may not be set
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5347
diff
changeset
|
635 |
if self.vreg is not None and 'etypes' in self.vreg: |
6848
f87cd875c6db
[web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
636 |
user = self.vreg['etypes'].etype_class('CWUser')( |
f87cd875c6db
[web session] cleanup session/authentication api: we don't have anymore to store authentication information on web session since the auto-reconnection feature has been dropped (eg in 3.10)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6613
diff
changeset
|
637 |
req, rset, row=0, groups=groups, properties=properties) |
5321
6bdca255985a
[dbapi] fallback to Entity when etypes registry isn't initialized (weird we haven't catchi this pb before)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5271
diff
changeset
|
638 |
else: |
6bdca255985a
[dbapi] fallback to Entity when etypes registry isn't initialized (weird we haven't catchi this pb before)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5271
diff
changeset
|
639 |
from cubicweb.entity import Entity |
6bdca255985a
[dbapi] fallback to Entity when etypes registry isn't initialized (weird we haven't catchi this pb before)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5271
diff
changeset
|
640 |
user = Entity(req, rset, row=0) |
6142
8bc6eac1fac1
[session] cleanup hook / operation / entity edition api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6066
diff
changeset
|
641 |
user.cw_attr_cache['login'] = login # cache login |
0 | 642 |
return user |
643 |
||
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
644 |
@check_not_closed |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
645 |
def check(self): |
6279
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
646 |
"""raise `BadConnectionId` if the connection is no more valid, else |
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
647 |
return its latest activity timestamp. |
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
648 |
""" |
6293
df44d7163582
[dbapi] Connection.check() must return the latest activity timestamp (dropped accidentally during latest merge)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
6279
diff
changeset
|
649 |
return self._repo.check_session(self.sessionid) |
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
650 |
|
7879
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
651 |
def _txid(self, cursor=None): # pylint: disable=E0202 |
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7815
diff
changeset
|
652 |
# XXX could now handle various isolation level! |
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
653 |
# return a dict as bw compat trick |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
654 |
return {'txid': currentThread().getName()} |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
655 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
656 |
# session data methods ##################################################### |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
657 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
658 |
@check_not_closed |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
659 |
def set_session_props(self, **props): |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
660 |
"""raise `BadConnectionId` if the connection is no more valid""" |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
661 |
self._repo.set_session_props(self.sessionid, props) |
1524 | 662 |
|
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
663 |
@check_not_closed |
6279
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
664 |
def get_shared_data(self, key, default=None, pop=False, txdata=False): |
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
665 |
"""return value associated to key in the session's data dictionary or |
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
666 |
session's transaction's data if `txdata` is true. |
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
667 |
|
8238
087bb529035c
[spelling] fix dictionnary -> dictionary typo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7962
diff
changeset
|
668 |
If pop is True, value will be removed from the dictionary. |
1524 | 669 |
|
8238
087bb529035c
[spelling] fix dictionnary -> dictionary typo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7962
diff
changeset
|
670 |
If key isn't defined in the dictionary, value specified by the |
6279
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
671 |
`default` argument will be returned. |
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
672 |
""" |
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
673 |
return self._repo.get_shared_data(self.sessionid, key, default, pop, txdata) |
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
674 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
675 |
@check_not_closed |
6279
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
676 |
def set_shared_data(self, key, value, txdata=False): |
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
677 |
"""set value associated to `key` in shared data |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
678 |
|
6279
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
679 |
if `txdata` is true, the value will be added to the repository |
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
680 |
session's query data which are cleared on commit/rollback of the current |
6279
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
681 |
transaction. |
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
682 |
""" |
6279
42079f752a9c
backport stable into default
Sylvain Thénault <sylvain.thenault@logilab.fr>
diff
changeset
|
683 |
return self._repo.set_shared_data(self.sessionid, key, value, txdata) |
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
684 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
685 |
# meta-data accessors ###################################################### |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
686 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
687 |
@check_not_closed |
6581
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
688 |
def source_defs(self): |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
689 |
"""Return the definition of sources used by the repository.""" |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
690 |
return self._repo.source_defs() |
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
691 |
|
4a3b264589dc
[dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6494
diff
changeset
|
692 |
@check_not_closed |
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
693 |
def get_schema(self): |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
694 |
"""Return the schema currently used by the repository.""" |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
695 |
return self._repo.get_schema() |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
696 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
697 |
@check_not_closed |
6308
c151c730a1ac
[dbapi] get_option_value now has a foreid argument telling the option should be dereferenced to the entity's actual repository (necessary for apycot/local_cache handling)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6257
diff
changeset
|
698 |
def get_option_value(self, option, foreid=None): |
c151c730a1ac
[dbapi] get_option_value now has a foreid argument telling the option should be dereferenced to the entity's actual repository (necessary for apycot/local_cache handling)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6257
diff
changeset
|
699 |
"""Return the value for `option` in the configuration. If `foreid` is |
c151c730a1ac
[dbapi] get_option_value now has a foreid argument telling the option should be dereferenced to the entity's actual repository (necessary for apycot/local_cache handling)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6257
diff
changeset
|
700 |
specified, the actual repository to which this entity belongs is |
6312
b6c2b81e49ec
[dbapi] fix typo
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
6308
diff
changeset
|
701 |
dereferenced and the option value retrieved from it. |
6308
c151c730a1ac
[dbapi] get_option_value now has a foreid argument telling the option should be dereferenced to the entity's actual repository (necessary for apycot/local_cache handling)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6257
diff
changeset
|
702 |
""" |
c151c730a1ac
[dbapi] get_option_value now has a foreid argument telling the option should be dereferenced to the entity's actual repository (necessary for apycot/local_cache handling)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6257
diff
changeset
|
703 |
return self._repo.get_option_value(option, foreid) |
6257
7eb5f1aed728
[repo] new method on repo+dbapi.Connection to get a value from repository's configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6252
diff
changeset
|
704 |
|
7eb5f1aed728
[repo] new method on repo+dbapi.Connection to get a value from repository's configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6252
diff
changeset
|
705 |
@check_not_closed |
7543
570522300e22
[ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7428
diff
changeset
|
706 |
def describe(self, eid, asdict=False): |
570522300e22
[ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7428
diff
changeset
|
707 |
metas = self._repo.describe(self.sessionid, eid, **self._txid()) |
7650
278fe9c1f3ad
[repo] closes #1821172: fix source deletion
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7595
diff
changeset
|
708 |
if len(metas) == 3: # backward compat |
278fe9c1f3ad
[repo] closes #1821172: fix source deletion
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7595
diff
changeset
|
709 |
metas = list(metas) |
278fe9c1f3ad
[repo] closes #1821172: fix source deletion
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7595
diff
changeset
|
710 |
metas.append(metas[1]) |
7543
570522300e22
[ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7428
diff
changeset
|
711 |
if asdict: |
570522300e22
[ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7428
diff
changeset
|
712 |
return dict(zip(('type', 'source', 'extid', 'asource'), metas)) |
570522300e22
[ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7428
diff
changeset
|
713 |
# XXX :-1 for cw compat, use asdict=True for full information |
570522300e22
[ms, entity metas] add 'actual source' to entities table / base entity metadata cache. Closes #1767090
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7428
diff
changeset
|
714 |
return metas[:-1] |
1524 | 715 |
|
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
716 |
# db-api like interface #################################################### |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
717 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
718 |
@check_not_closed |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
719 |
def commit(self): |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
720 |
"""Commit pending transaction for this connection to the repository. |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
721 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
722 |
may raises `Unauthorized` or `ValidationError` if we attempted to do |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
723 |
something we're not allowed to for security or integrity reason. |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
724 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
725 |
If the transaction is undoable, a transaction id will be returned. |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
726 |
""" |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
727 |
return self._repo.commit(self.sessionid, **self._txid()) |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
728 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
729 |
@check_not_closed |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
730 |
def rollback(self): |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
731 |
"""This method is optional since not all databases provide transaction |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
732 |
support. |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
733 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
734 |
In case a database does provide transactions this method causes the the |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
735 |
database to roll back to the start of any pending transaction. Closing |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
736 |
a connection without committing the changes first will cause an implicit |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
737 |
rollback to be performed. |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
738 |
""" |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
739 |
self._repo.rollback(self.sessionid, **self._txid()) |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
740 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
741 |
@check_not_closed |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
742 |
def cursor(self, req=None): |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
743 |
"""Return a new Cursor Object using the connection. |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
744 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
745 |
On pyro connection, you should get cursor after calling if |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
746 |
load_appobjects method if desired (which you should call if you intend |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
747 |
to use ORM abilities). |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
748 |
""" |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
749 |
if req is None: |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
750 |
req = self.request() |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
751 |
return self.cursor_class(self, self._repo, req=req) |
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
752 |
|
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
753 |
@check_not_closed |
0 | 754 |
def close(self): |
755 |
"""Close the connection now (rather than whenever __del__ is called). |
|
1524 | 756 |
|
0 | 757 |
The connection will be unusable from this point forward; an Error (or |
758 |
subclass) exception will be raised if any operation is attempted with |
|
759 |
the connection. The same applies to all cursor objects trying to use the |
|
760 |
connection. Note that closing a connection without committing the |
|
761 |
changes first will cause an implicit rollback to be performed. |
|
762 |
""" |
|
5859
3da3574fe397
[dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5813
diff
changeset
|
763 |
self._repo.close(self.sessionid, **self._txid()) |
4768
430b89aed996
delete pyro proxy on connection close, properly raise programming error when working on a closed connection
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4721
diff
changeset
|
764 |
del self._repo # necessary for proper garbage collection |
0 | 765 |
self._closed = 1 |
766 |
||
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
767 |
# undo support ############################################################ |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
768 |
|
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
769 |
@check_not_closed |
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
770 |
def undoable_transactions(self, ueid=None, req=None, **actionfilters): |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
771 |
"""Return a list of undoable transaction objects by the connection's |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
772 |
user, ordered by descendant transaction time. |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
773 |
|
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
774 |
Managers may filter according to user (eid) who has done the transaction |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
775 |
using the `ueid` argument. Others will only see their own transactions. |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
776 |
|
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
777 |
Additional filtering capabilities is provided by using the following |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
778 |
named arguments: |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
779 |
|
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
780 |
* `etype` to get only transactions creating/updating/deleting entities |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
781 |
of the given type |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
782 |
|
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
783 |
* `eid` to get only transactions applied to entity of the given eid |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
784 |
|
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
785 |
* `action` to get only transactions doing the given action (action in |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
786 |
'C', 'U', 'D', 'A', 'R'). If `etype`, action can only be 'C', 'U' or |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
787 |
'D'. |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
788 |
|
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
789 |
* `public`: when additional filtering is provided, their are by default |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
790 |
only searched in 'public' actions, unless a `public` argument is given |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
791 |
and set to false. |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
792 |
""" |
5859
3da3574fe397
[dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5813
diff
changeset
|
793 |
actionfilters.update(self._txid()) |
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
794 |
txinfos = self._repo.undoable_transactions(self.sessionid, ueid, |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
795 |
**actionfilters) |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
796 |
if req is None: |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
797 |
req = self.request() |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
798 |
for txinfo in txinfos: |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
799 |
txinfo.req = req |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
800 |
return txinfos |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
801 |
|
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
802 |
@check_not_closed |
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
803 |
def transaction_info(self, txuuid, req=None): |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
804 |
"""Return transaction object for the given uid. |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
805 |
|
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
806 |
raise `NoSuchTransaction` if not found or if session's user is not |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
807 |
allowed (eg not in managers group and the transaction doesn't belong to |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
808 |
him). |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
809 |
""" |
5813
0b250d72fcfa
[transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5812
diff
changeset
|
810 |
txinfo = self._repo.transaction_info(self.sessionid, txuuid, |
5859
3da3574fe397
[dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5813
diff
changeset
|
811 |
**self._txid()) |
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
812 |
if req is None: |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
813 |
req = self.request() |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
814 |
txinfo.req = req |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
815 |
return txinfo |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
816 |
|
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
817 |
@check_not_closed |
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
818 |
def transaction_actions(self, txuuid, public=True): |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
819 |
"""Return an ordered list of action effectued during that transaction. |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
820 |
|
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
821 |
If public is true, return only 'public' actions, eg not ones triggered |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
822 |
under the cover by hooks, else return all actions. |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
823 |
|
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
824 |
raise `NoSuchTransaction` if the transaction is not found or if |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
825 |
session's user is not allowed (eg not in managers group and the |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
826 |
transaction doesn't belong to him). |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
827 |
""" |
5813
0b250d72fcfa
[transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5812
diff
changeset
|
828 |
return self._repo.transaction_actions(self.sessionid, txuuid, public, |
5859
3da3574fe397
[dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5813
diff
changeset
|
829 |
**self._txid()) |
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
830 |
|
6252
d33509b79efe
[dbapi] reorganize Connection methods and use a @check_not_closed decorator
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6061
diff
changeset
|
831 |
@check_not_closed |
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
832 |
def undo_transaction(self, txuuid): |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
833 |
"""Undo the given transaction. Return potential restoration errors. |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
834 |
|
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
835 |
raise `NoSuchTransaction` if not found or if session's user is not |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
836 |
allowed (eg not in managers group and the transaction doesn't belong to |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
837 |
him). |
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4895
diff
changeset
|
838 |
""" |
5813
0b250d72fcfa
[transaction w/ separated web/repo processes] the dbapi should explicitly specify a transaction id to avoid confusion when web server / repository run in separated processes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5812
diff
changeset
|
839 |
return self._repo.undo_transaction(self.sessionid, txuuid, |
5859
3da3574fe397
[dbapi] refactor so that cw 3.8.6 can still speak with a 3.8.5 server
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5813
diff
changeset
|
840 |
**self._txid()) |