server/sources/native.py
changeset 6142 8bc6eac1fac1
parent 6128 fbb8398f80dc
child 6225 a176e68b7d0d
equal deleted inserted replaced
6141:b8287e54b528 6142:8bc6eac1fac1
    52 from cubicweb.server.utils import crypt_password, eschema_eid
    52 from cubicweb.server.utils import crypt_password, eschema_eid
    53 from cubicweb.server.sqlutils import SQL_PREFIX, SQLAdapterMixIn
    53 from cubicweb.server.sqlutils import SQL_PREFIX, SQLAdapterMixIn
    54 from cubicweb.server.rqlannotation import set_qdata
    54 from cubicweb.server.rqlannotation import set_qdata
    55 from cubicweb.server.hook import CleanupDeletedEidsCacheOp
    55 from cubicweb.server.hook import CleanupDeletedEidsCacheOp
    56 from cubicweb.server.session import hooks_control, security_enabled
    56 from cubicweb.server.session import hooks_control, security_enabled
       
    57 from cubicweb.server.ssplanner import EditedEntity
    57 from cubicweb.server.sources import AbstractSource, dbg_st_search, dbg_results
    58 from cubicweb.server.sources import AbstractSource, dbg_st_search, dbg_results
    58 from cubicweb.server.sources.rql2sql import SQLGenerator
    59 from cubicweb.server.sources.rql2sql import SQLGenerator
    59 
    60 
    60 
    61 
    61 ATTR_MAP = {}
    62 ATTR_MAP = {}
   544         #    value once the SQL query will be executed
   545         #    value once the SQL query will be executed
   545         restore_values = {}
   546         restore_values = {}
   546         etype = entity.__regid__
   547         etype = entity.__regid__
   547         for attr, storage in self._storages.get(etype, {}).items():
   548         for attr, storage in self._storages.get(etype, {}).items():
   548             try:
   549             try:
   549                 edited = entity.edited_attributes
   550                 edited = entity.cw_edited
   550             except AttributeError:
   551             except AttributeError:
   551                 assert event == 'deleted'
   552                 assert event == 'deleted'
   552                 getattr(storage, 'entity_deleted')(entity, attr)
   553                 getattr(storage, 'entity_deleted')(entity, attr)
   553             else:
   554             else:
   554                 if attr in edited:
   555                 if attr in edited:
   555                     handler = getattr(storage, 'entity_%s' % event)
   556                     handler = getattr(storage, 'entity_%s' % event)
   556                     real_value = handler(entity, attr)
   557                     restore_values[attr] = handler(entity, attr)
   557                     restore_values[attr] = real_value
       
   558         try:
   558         try:
   559             yield # 2/ execute the source's instructions
   559             yield # 2/ execute the source's instructions
   560         finally:
   560         finally:
   561             # 3/ restore original values
   561             # 3/ restore original values
   562             for attr, value in restore_values.items():
   562             for attr, value in restore_values.items():
   563                 entity[attr] = value
   563                 entity.cw_edited.edited_attribute(attr, value)
   564 
   564 
   565     def add_entity(self, session, entity):
   565     def add_entity(self, session, entity):
   566         """add a new entity to the source"""
   566         """add a new entity to the source"""
   567         with self._storage_handler(entity, 'added'):
   567         with self._storage_handler(entity, 'added'):
   568             attrs = self.preprocess_entity(entity)
   568             attrs = self.preprocess_entity(entity)
  1106             entity = self.repo.vreg['etypes'].etype_class(etype)(session)
  1106             entity = self.repo.vreg['etypes'].etype_class(etype)(session)
  1107         except Exception:
  1107         except Exception:
  1108             err("can't restore entity %s of type %s, type no more supported"
  1108             err("can't restore entity %s of type %s, type no more supported"
  1109                 % (eid, etype))
  1109                 % (eid, etype))
  1110             return errors
  1110             return errors
       
  1111         entity.cw_edited = edited = EditedEntity(entity)
  1111         # check for schema changes, entities linked through inlined relation
  1112         # check for schema changes, entities linked through inlined relation
  1112         # still exists, rewrap binary values
  1113         # still exists, rewrap binary values
  1113         eschema = entity.e_schema
  1114         eschema = entity.e_schema
  1114         getrschema = eschema.subjrels
  1115         getrschema = eschema.subjrels
  1115         for column, value in action.changes.items():
  1116         for column, value in action.changes.items():
  1122                     % {'rtype': rtype, 'eid': eid})
  1123                     % {'rtype': rtype, 'eid': eid})
  1123             if not rschema.final:
  1124             if not rschema.final:
  1124                 assert value is None
  1125                 assert value is None
  1125             elif eschema.destination(rtype) in ('Bytes', 'Password'):
  1126             elif eschema.destination(rtype) in ('Bytes', 'Password'):
  1126                 action.changes[column] = self._binary(value)
  1127                 action.changes[column] = self._binary(value)
  1127                 entity[rtype] = Binary(value)
  1128                 edited[rtype] = Binary(value)
  1128             elif isinstance(value, str):
  1129             elif isinstance(value, str):
  1129                 entity[rtype] = unicode(value, session.encoding, 'replace')
  1130                 edited[rtype] = unicode(value, session.encoding, 'replace')
  1130             else:
  1131             else:
  1131                 entity[rtype] = value
  1132                 edited[rtype] = value
  1132         entity.eid = eid
  1133         entity.eid = eid
  1133         session.repo.init_entity_caches(session, entity, self)
  1134         session.repo.init_entity_caches(session, entity, self)
  1134         entity.edited_attributes = set(entity)
  1135         edited.check()
  1135         entity._cw_check()
       
  1136         self.repo.hm.call_hooks('before_add_entity', session, entity=entity)
  1136         self.repo.hm.call_hooks('before_add_entity', session, entity=entity)
  1137         # restore the entity
  1137         # restore the entity
  1138         action.changes['cw_eid'] = eid
  1138         action.changes['cw_eid'] = eid
  1139         sql = self.sqlgen.insert(SQL_PREFIX + etype, action.changes)
  1139         sql = self.sqlgen.insert(SQL_PREFIX + etype, action.changes)
  1140         self.doexec(session, sql, action.changes)
  1140         self.doexec(session, sql, action.changes)