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