1 # copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
1 # copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr |
2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr |
3 # |
3 # |
4 # This file is part of CubicWeb. |
4 # This file is part of CubicWeb. |
5 # |
5 # |
6 # CubicWeb is free software: you can redistribute it and/or modify it under the |
6 # CubicWeb is free software: you can redistribute it and/or modify it under the |
16 # You should have received a copy of the GNU Lesser General Public License along |
16 # You should have received a copy of the GNU Lesser General Public License along |
17 # with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
17 # with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
18 """Core hooks: synchronize living session on persistent data changes""" |
18 """Core hooks: synchronize living session on persistent data changes""" |
19 |
19 |
20 __docformat__ = "restructuredtext en" |
20 __docformat__ = "restructuredtext en" |
21 |
21 _ = unicode |
22 from yams.schema import role_name |
22 |
23 from cubicweb import UnknownProperty, ValidationError, BadConnectionId |
23 from cubicweb import UnknownProperty, BadConnectionId, validation_error |
24 from cubicweb.predicates import is_instance |
24 from cubicweb.predicates import is_instance |
25 from cubicweb.server import hook |
25 from cubicweb.server import hook |
26 |
26 |
27 |
27 |
28 def get_user_sessions(repo, ueid): |
28 def get_user_sessions(repo, ueid): |
163 return |
163 return |
164 session = self._cw |
164 session = self._cw |
165 try: |
165 try: |
166 value = session.vreg.typed_value(key, value) |
166 value = session.vreg.typed_value(key, value) |
167 except UnknownProperty: |
167 except UnknownProperty: |
168 qname = role_name('pkey', 'subject') |
168 msg = _('unknown property key %s') |
169 msg = session._('unknown property key %s') % key |
169 raise validation_error(self.entity, {('pkey', 'subject'): msg}, (key,)) |
170 raise ValidationError(self.entity.eid, {qname: msg}) |
|
171 except ValueError, ex: |
170 except ValueError, ex: |
172 qname = role_name('value', 'subject') |
171 raise validation_error(self.entity, |
173 raise ValidationError(self.entity.eid, |
172 {('value', 'subject'): str(ex)}) |
174 {qname: session._(str(ex))}) |
|
175 if not session.user.matching_groups('managers'): |
173 if not session.user.matching_groups('managers'): |
176 session.add_relation(self.entity.eid, 'for_user', session.user.eid) |
174 session.add_relation(self.entity.eid, 'for_user', session.user.eid) |
177 else: |
175 else: |
178 _AddCWPropertyOp(session, cwprop=self.entity) |
176 _AddCWPropertyOp(session, cwprop=self.entity) |
179 |
177 |
194 try: |
192 try: |
195 value = session.vreg.typed_value(key, value) |
193 value = session.vreg.typed_value(key, value) |
196 except UnknownProperty: |
194 except UnknownProperty: |
197 return |
195 return |
198 except ValueError, ex: |
196 except ValueError, ex: |
199 qname = role_name('value', 'subject') |
197 raise validation_error(entity, {('value', 'subject'): str(ex)}) |
200 raise ValidationError(entity.eid, {qname: session._(str(ex))}) |
|
201 if entity.for_user: |
198 if entity.for_user: |
202 for session_ in get_user_sessions(session.repo, entity.for_user[0].eid): |
199 for session_ in get_user_sessions(session.repo, entity.for_user[0].eid): |
203 _ChangeCWPropertyOp(session, cwpropdict=session_.user.properties, |
200 _ChangeCWPropertyOp(session, cwpropdict=session_.user.properties, |
204 key=key, value=value) |
201 key=key, value=value) |
205 else: |
202 else: |
235 if not session.describe(eidfrom)[0] == 'CWProperty': |
232 if not session.describe(eidfrom)[0] == 'CWProperty': |
236 return |
233 return |
237 key, value = session.execute('Any K,V WHERE P eid %(x)s,P pkey K,P value V', |
234 key, value = session.execute('Any K,V WHERE P eid %(x)s,P pkey K,P value V', |
238 {'x': eidfrom})[0] |
235 {'x': eidfrom})[0] |
239 if session.vreg.property_info(key)['sitewide']: |
236 if session.vreg.property_info(key)['sitewide']: |
240 qname = role_name('for_user', 'subject') |
237 msg = _("site-wide property can't be set for user") |
241 msg = session._("site-wide property can't be set for user") |
238 raise validation_error(eidfrom, {('for_user', 'subject'): msg}) |
242 raise ValidationError(eidfrom, |
|
243 {qname: msg}) |
|
244 for session_ in get_user_sessions(session.repo, self.eidto): |
239 for session_ in get_user_sessions(session.repo, self.eidto): |
245 _ChangeCWPropertyOp(session, cwpropdict=session_.user.properties, |
240 _ChangeCWPropertyOp(session, cwpropdict=session_.user.properties, |
246 key=key, value=value) |
241 key=key, value=value) |
247 |
242 |
248 |
243 |