hooks/syncsession.py
changeset 8556 bbe0d6985e59
parent 8190 2a3c1b787688
child 8695 358d8bed9626
equal deleted inserted replaced
8555:c747242d22a6 8556:bbe0d6985e59
     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