author | Adrien Di Mascio <Adrien.DiMascio@logilab.fr> |
Wed, 06 Apr 2011 16:01:19 +0200 | |
changeset 7187 | 496f51b92154 |
parent 7129 | 455b503fb7ff |
child 7186 | 287f2273917f |
permissions | -rw-r--r-- |
7129
455b503fb7ff
[config] generalise config.creating, allowing to drop set_language class attribute
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7094
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:
5090
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:
5090
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:
5090
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:
5090
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:
5090
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:
5090
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:
5090
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:
5090
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:
5090
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:
5090
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:
5090
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:
5090
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:
5090
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:
5090
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:
5090
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
0 | 18 |
"""Server subcube of cubicweb : defines objects used only on the server |
19 |
(repository) side |
|
20 |
||
21 |
This module contains functions to initialize a new repository. |
|
6427
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
22 |
""" |
0 | 23 |
|
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
24 |
from __future__ import with_statement |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
25 |
|
0 | 26 |
__docformat__ = "restructuredtext en" |
27 |
||
28 |
import sys |
|
29 |
from os.path import join, exists |
|
2730
bb6fcb8c5d71
to make cw schemas importable, they have to be installed w/ cw code, not in /usr/share/cubicweb/schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2633
diff
changeset
|
30 |
from glob import glob |
0 | 31 |
|
32 |
from logilab.common.modutils import LazyObject |
|
2633
bc9386c3b2c9
get_csv is being renamed to splitstrip
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2631
diff
changeset
|
33 |
from logilab.common.textutils import splitstrip |
0 | 34 |
|
2730
bb6fcb8c5d71
to make cw schemas importable, they have to be installed w/ cw code, not in /usr/share/cubicweb/schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2633
diff
changeset
|
35 |
from yams import BASE_GROUPS |
bb6fcb8c5d71
to make cw schemas importable, they have to be installed w/ cw code, not in /usr/share/cubicweb/schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2633
diff
changeset
|
36 |
|
bb6fcb8c5d71
to make cw schemas importable, they have to be installed w/ cw code, not in /usr/share/cubicweb/schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2633
diff
changeset
|
37 |
from cubicweb import CW_SOFTWARE_ROOT |
bb6fcb8c5d71
to make cw schemas importable, they have to be installed w/ cw code, not in /usr/share/cubicweb/schemas
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2633
diff
changeset
|
38 |
|
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
39 |
# server-side debugging ######################################################### |
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
40 |
|
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
41 |
# server debugging flags. They may be combined using binary operators. |
2766
07e47b84acc2
DBG_MS flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2730
diff
changeset
|
42 |
DBG_NONE = 0 # no debug information |
07e47b84acc2
DBG_MS flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2730
diff
changeset
|
43 |
DBG_RQL = 1 # rql execution information |
07e47b84acc2
DBG_MS flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2730
diff
changeset
|
44 |
DBG_SQL = 2 # executed sql |
07e47b84acc2
DBG_MS flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2730
diff
changeset
|
45 |
DBG_REPO = 4 # repository events |
07e47b84acc2
DBG_MS flag
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2730
diff
changeset
|
46 |
DBG_MS = 8 # multi-sources |
3823
94aa250cff9b
fix cut and paste
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3699
diff
changeset
|
47 |
DBG_MORE = 16 # more verbosity |
4223
4fb00ccad3df
new DBG_ALL debug level
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4107
diff
changeset
|
48 |
DBG_ALL = 1 + 2 + 4 + 8 + 16 |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
49 |
# current debug mode |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
50 |
DEBUG = 0 |
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
51 |
|
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
52 |
def set_debug(debugmode): |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
53 |
"""change the repository debugging mode""" |
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
54 |
global DEBUG |
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
55 |
if not debugmode: |
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
56 |
DEBUG = 0 |
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
57 |
return |
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
58 |
if isinstance(debugmode, basestring): |
2633
bc9386c3b2c9
get_csv is being renamed to splitstrip
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2631
diff
changeset
|
59 |
for mode in splitstrip(debugmode, sep='|'): |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
60 |
DEBUG |= globals()[mode] |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
61 |
else: |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
62 |
DEBUG |= debugmode |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
63 |
|
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
64 |
class debugged(object): |
7079
6024de6094f6
[doc] fix rql/debugging.rst and server.__init__ docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7056
diff
changeset
|
65 |
"""Context manager and decorator to help debug the repository. |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
66 |
|
7079
6024de6094f6
[doc] fix rql/debugging.rst and server.__init__ docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7056
diff
changeset
|
67 |
It can be used either as a context manager: |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
68 |
|
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
69 |
>>> with debugged(server.DBG_RQL | server.DBG_REPO): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
70 |
... # some code in which you want to debug repository activity, |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
71 |
... # seing information about RQL being executed an repository events. |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
72 |
|
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
73 |
or as a function decorator: |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
74 |
|
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
75 |
>>> @debugged(server.DBG_RQL | server.DBG_REPO) |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
76 |
... def some_function(): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
77 |
... # some code in which you want to debug repository activity, |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
78 |
... # seing information about RQL being executed an repository events |
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
79 |
|
7079
6024de6094f6
[doc] fix rql/debugging.rst and server.__init__ docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7056
diff
changeset
|
80 |
The debug mode will be reset to its original value when leaving the "with" |
6024de6094f6
[doc] fix rql/debugging.rst and server.__init__ docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7056
diff
changeset
|
81 |
block or the decorated function. |
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
82 |
""" |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
83 |
def __init__(self, debugmode): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
84 |
self.debugmode = debugmode |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
85 |
self._clevel = None |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
86 |
|
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
87 |
def __enter__(self): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
88 |
"""enter with block""" |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
89 |
self._clevel = DEBUG |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
90 |
set_debug(self.debugmode) |
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
91 |
|
2628
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
92 |
def __exit__(self, exctype, exc, traceback): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
93 |
"""leave with block""" |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
94 |
set_debug(self._clevel) |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
95 |
return traceback is None |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
96 |
|
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
97 |
def __call__(self, func): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
98 |
"""decorate function""" |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
99 |
def wrapped(*args, **kwargs): |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
100 |
_clevel = DEBUG |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
101 |
set_debug(self.debugmode) |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
102 |
try: |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
103 |
return func(*args, **kwargs) |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
104 |
finally: |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
105 |
set_debug(self._clevel) |
a2cc32c1d982
document and replace debugged by a contextmanager/decorator class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2595
diff
changeset
|
106 |
return wrapped |
2593
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
107 |
|
16d9419a4a79
F: start to handle binary debug log level on the server side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2589
diff
changeset
|
108 |
# database initialization ###################################################### |
0 | 109 |
|
4612
d6ae30c5d055
added a function to create admin/anon user during db initialization process so one get a chance to monkey patch it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
110 |
def create_user(session, login, pwd, *groups): |
d6ae30c5d055
added a function to create admin/anon user during db initialization process so one get a chance to monkey patch it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
111 |
# monkey patch this method if you want to customize admin/anon creation |
d6ae30c5d055
added a function to create admin/anon user during db initialization process so one get a chance to monkey patch it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
112 |
# (that maybe necessary if you change CWUser's schema) |
4634
b2a3232783f8
fix create_user function introduced in d6ae30c5d055 for database initialization: messup admin user groups when anon is created due to missing restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4612
diff
changeset
|
113 |
user = session.create_entity('CWUser', login=login, upassword=pwd) |
4612
d6ae30c5d055
added a function to create admin/anon user during db initialization process so one get a chance to monkey patch it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
114 |
for group in groups: |
4634
b2a3232783f8
fix create_user function introduced in d6ae30c5d055 for database initialization: messup admin user groups when anon is created due to missing restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4612
diff
changeset
|
115 |
session.execute('SET U in_group G WHERE U eid %(u)s, G name %(group)s', |
b2a3232783f8
fix create_user function introduced in d6ae30c5d055 for database initialization: messup admin user groups when anon is created due to missing restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4612
diff
changeset
|
116 |
{'u': user.eid, 'group': group}) |
b2a3232783f8
fix create_user function introduced in d6ae30c5d055 for database initialization: messup admin user groups when anon is created due to missing restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4612
diff
changeset
|
117 |
return user |
4612
d6ae30c5d055
added a function to create admin/anon user during db initialization process so one get a chance to monkey patch it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
118 |
|
0 | 119 |
def init_repository(config, interactive=True, drop=False, vreg=None): |
120 |
"""initialise a repository database by creating tables add filling them |
|
121 |
with the minimal set of entities (ie at least the schema, base groups and |
|
122 |
a initial user) |
|
123 |
""" |
|
7056
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6427
diff
changeset
|
124 |
from cubicweb.dbapi import in_memory_repo_cnx |
0 | 125 |
from cubicweb.server.repository import Repository |
126 |
from cubicweb.server.utils import manager_userpasswd |
|
127 |
from cubicweb.server.sqlutils import sqlexec, sqlschema, sqldropschema |
|
128 |
# configuration to avoid db schema loading and user'state checking |
|
129 |
# on connection |
|
130 |
config.creating = True |
|
131 |
config.consider_user_state = False |
|
6126
aca6a2c357fd
[repository] enabled sources refactoring: to avoid error, we should always have all known source in repo.sources_by_uri and only enabled ones in repo.sources, so we still have access to the definition of temporarily disabled sources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5750
diff
changeset
|
132 |
# only enable the system source at initialization time |
0 | 133 |
repo = Repository(config, vreg=vreg) |
134 |
schema = repo.schema |
|
135 |
sourcescfg = config.sources() |
|
2396
8bfb99d7bbcc
[cw-ctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2395
diff
changeset
|
136 |
_title = '-> creating tables ' |
8bfb99d7bbcc
[cw-ctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2395
diff
changeset
|
137 |
print _title, |
0 | 138 |
source = sourcescfg['system'] |
139 |
driver = source['db-driver'] |
|
140 |
sqlcnx = repo.system_source.get_connection() |
|
141 |
sqlcursor = sqlcnx.cursor() |
|
2306
95da5d9f0870
give session to doexec so it's able to rollback the connection on unexpected error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2172
diff
changeset
|
142 |
execute = sqlcursor.execute |
0 | 143 |
if drop: |
144 |
dropsql = sqldropschema(schema, driver) |
|
145 |
try: |
|
146 |
sqlexec(dropsql, execute) |
|
147 |
except Exception, ex: |
|
2394
92bba46b853f
[cw-ctl] improve dialog messages
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2306
diff
changeset
|
148 |
print '-> drop failed, skipped (%s).' % ex |
0 | 149 |
sqlcnx.rollback() |
150 |
# schema entities and relations tables |
|
151 |
# can't skip entities table even if system source doesn't support them, |
|
152 |
# they are used sometimes by generated sql. Keeping them empty is much |
|
153 |
# simpler than fixing this... |
|
4837
54969eec48eb
misc fixes to ensure logilab.db compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4759
diff
changeset
|
154 |
schemasql = sqlschema(schema, driver) |
54969eec48eb
misc fixes to ensure logilab.db compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4759
diff
changeset
|
155 |
#skip_entities=[str(e) for e in schema.entities() |
54969eec48eb
misc fixes to ensure logilab.db compatibility
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4759
diff
changeset
|
156 |
# if not repo.system_source.support_entity(str(e))]) |
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4848
diff
changeset
|
157 |
sqlexec(schemasql, execute, pbtitle=_title, delimiter=';;') |
0 | 158 |
sqlcursor.close() |
159 |
sqlcnx.commit() |
|
160 |
sqlcnx.close() |
|
161 |
session = repo.internal_session() |
|
6427
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
162 |
# insert entity representing the system source |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
163 |
ssource = session.create_entity('CWSource', type=u'native', name=u'system') |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
164 |
repo.system_source.eid = ssource.eid |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
165 |
session.execute('SET X cw_source X WHERE X eid %(x)s', {'x': ssource.eid}) |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
166 |
# insert base groups and default admin |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
167 |
print '-> inserting default user and default groups.' |
0 | 168 |
try: |
169 |
login = unicode(sourcescfg['admin']['login']) |
|
170 |
pwd = sourcescfg['admin']['password'] |
|
171 |
except KeyError: |
|
172 |
if interactive: |
|
173 |
msg = 'enter login and password of the initial manager account' |
|
174 |
login, pwd = manager_userpasswd(msg=msg, confirm=True) |
|
175 |
else: |
|
176 |
login, pwd = unicode(source['db-user']), source['db-password'] |
|
2595
e76bf303c6f2
[F server test] sort for test predictability
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2593
diff
changeset
|
177 |
# sort for eid predicatability as expected in some server tests |
e76bf303c6f2
[F server test] sort for test predictability
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2593
diff
changeset
|
178 |
for group in sorted(BASE_GROUPS): |
6427
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
179 |
session.create_entity('CWGroup', name=unicode(group)) |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
180 |
admin = create_user(session, login, pwd, 'managers') |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
181 |
session.execute('SET X owned_by U WHERE X is IN (CWGroup,CWSource), U eid %(u)s', |
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
182 |
{'u': admin.eid}) |
0 | 183 |
session.commit() |
5750
b3bc214cd479
[repo] on repository initialization, properly shutdown intermediary repository
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5424
diff
changeset
|
184 |
repo.shutdown() |
0 | 185 |
# reloging using the admin user |
186 |
config._cubes = None # avoid assertion error |
|
7056
51f88f13d6f3
[dbapi] split in_memory_cnx functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6427
diff
changeset
|
187 |
repo, cnx = in_memory_repo_cnx(config, login, password=pwd) |
6427
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
188 |
repo.system_source.eid = ssource.eid # redo this manually |
3699
20ba545e00e1
initialize entity classes in repository initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3530
diff
changeset
|
189 |
# trigger vreg initialisation of entity classes |
20ba545e00e1
initialize entity classes in repository initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3530
diff
changeset
|
190 |
config.cubicweb_appobject_path = set(('entities',)) |
20ba545e00e1
initialize entity classes in repository initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3530
diff
changeset
|
191 |
config.cube_appobject_path = set(('entities',)) |
20ba545e00e1
initialize entity classes in repository initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3530
diff
changeset
|
192 |
repo.vreg.set_schema(repo.schema) |
0 | 193 |
assert len(repo.sources) == 1, repo.sources |
194 |
handler = config.migration_handler(schema, interactive=False, |
|
195 |
cnx=cnx, repo=repo) |
|
3903
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3823
diff
changeset
|
196 |
# install additional driver specific sql files |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3823
diff
changeset
|
197 |
handler.install_custom_sql_scripts(join(CW_SOFTWARE_ROOT, 'schemas'), driver) |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3823
diff
changeset
|
198 |
for directory in reversed(config.cubes_path()): |
7967d3766ecf
fix #544758 by calling custom sql scripts in add_cubes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3823
diff
changeset
|
199 |
handler.install_custom_sql_scripts(join(directory, 'schema'), driver) |
4759 | 200 |
# serialize the schema |
0 | 201 |
initialize_schema(config, schema, handler) |
202 |
# yoo ! |
|
203 |
cnx.commit() |
|
6427
c8a5ac2d1eaa
[schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6126
diff
changeset
|
204 |
repo.system_source.init_creating() |
0 | 205 |
cnx.commit() |
206 |
cnx.close() |
|
207 |
session.close() |
|
4766
162b2b127b15
[test] get a chance to get proper garbage collection when running pytest on whole cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4759
diff
changeset
|
208 |
repo.shutdown() |
0 | 209 |
# restore initial configuration |
210 |
config.creating = False |
|
211 |
config.consider_user_state = True |
|
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2458
diff
changeset
|
212 |
print '-> database for instance %s initialized.' % config.appid |
0 | 213 |
|
214 |
||
215 |
def initialize_schema(config, schema, mhandler, event='create'): |
|
216 |
from cubicweb.server.schemaserial import serialize_schema |
|
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
217 |
from cubicweb.server.session import hooks_control |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
218 |
session = mhandler.session |
0 | 219 |
paths = [p for p in config.cubes_path() + [config.apphome] |
220 |
if exists(join(p, 'migration'))] |
|
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
221 |
# deactivate every hooks but those responsible to set metadata |
5090
8c39d2bf58fd
[repo creation] removing existing entities of 'single' cardinality relatino should be considered as 'activeintegrity' hook. Also don't disable that category during repo creation to avoid pb such as two default workflows for one entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5043
diff
changeset
|
222 |
# so, NO INTEGRITY CHECKS are done, to have quicker db creation. |
8c39d2bf58fd
[repo creation] removing existing entities of 'single' cardinality relatino should be considered as 'activeintegrity' hook. Also don't disable that category during repo creation to avoid pb such as two default workflows for one entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5043
diff
changeset
|
223 |
# Active integrity is kept else we may pb such as two default |
8c39d2bf58fd
[repo creation] removing existing entities of 'single' cardinality relatino should be considered as 'activeintegrity' hook. Also don't disable that category during repo creation to avoid pb such as two default workflows for one entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5043
diff
changeset
|
224 |
# workflows for one entity type. |
8c39d2bf58fd
[repo creation] removing existing entities of 'single' cardinality relatino should be considered as 'activeintegrity' hook. Also don't disable that category during repo creation to avoid pb such as two default workflows for one entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5043
diff
changeset
|
225 |
with hooks_control(session, session.HOOKS_DENY_ALL, 'metadata', |
8c39d2bf58fd
[repo creation] removing existing entities of 'single' cardinality relatino should be considered as 'activeintegrity' hook. Also don't disable that category during repo creation to avoid pb such as two default workflows for one entity types
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5043
diff
changeset
|
226 |
'activeintegrity'): |
4834
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
227 |
# execute cubicweb's pre<event> script |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
228 |
mhandler.exec_event_script('pre%s' % event) |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
229 |
# execute cubes pre<event> script if any |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
230 |
for path in reversed(paths): |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
231 |
mhandler.exec_event_script('pre%s' % event, path) |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
232 |
# enter instance'schema into the database |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
233 |
session.set_pool() |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
234 |
serialize_schema(session, schema) |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
235 |
# execute cubicweb's post<event> script |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
236 |
mhandler.exec_event_script('post%s' % event) |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
237 |
# execute cubes'post<event> script if any |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
238 |
for path in reversed(paths): |
b718626a0e60
move hooks activation control on session object, so we can have a per transaction control. Added a new `hooks_control` context manager for usual modification of hooks activation.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4831
diff
changeset
|
239 |
mhandler.exec_event_script('post%s' % event, path) |
0 | 240 |
|
241 |
||
4831
c5aec27c1bf7
[repo] use logilab.db instead of lgc.adbh/lgc.db/lgc.sqlgen/indexer, test new date extranction functions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4766
diff
changeset
|
242 |
# sqlite'stored procedures have to be registered at connection opening time |
4848
41f84eea63c9
rename logilab.db into logilab.database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4845
diff
changeset
|
243 |
from logilab.database import SQL_CONNECT_HOOKS |
0 | 244 |
|
245 |
# add to this set relations which should have their add security checking done |
|
246 |
# *BEFORE* adding the actual relation (done after by default) |
|
247 |
BEFORE_ADD_RELATIONS = set(('owned_by',)) |
|
248 |
||
249 |
# add to this set relations which should have their add security checking done |
|
250 |
# *at COMMIT TIME* (done after by default) |
|
251 |
ON_COMMIT_ADD_RELATIONS = set(()) |
|
252 |
||
253 |
# available sources registry |
|
254 |
SOURCE_TYPES = {'native': LazyObject('cubicweb.server.sources.native', 'NativeSQLSource'), |
|
255 |
'pyrorql': LazyObject('cubicweb.server.sources.pyrorql', 'PyroRQLSource'), |
|
256 |
'ldapuser': LazyObject('cubicweb.server.sources.ldapuser', 'LDAPUserSource'), |
|
6957
ffda12be2e9f
[repository] #1460066: backport datafeed cube as cubicweb source
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6427
diff
changeset
|
257 |
'datafeed': LazyObject('cubicweb.server.sources.datafeed', 'DataFeedSource'), |
0 | 258 |
} |