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) |