diff -r b8287e54b528 -r 8bc6eac1fac1 server/repository.py --- a/server/repository.py Wed Aug 25 10:29:07 2010 +0200 +++ b/server/repository.py Wed Aug 25 10:29:18 2010 +0200 @@ -55,6 +55,7 @@ from cubicweb.server import utils, hook, pool, querier, sources from cubicweb.server.session import Session, InternalSession, InternalManager, \ security_enabled +from cubicweb.server.ssplanner import EditedEntity def del_existing_rel_if_needed(session, eidfrom, rtype, eidto): @@ -536,8 +537,7 @@ password = password.encode('UTF8') kwargs['login'] = login kwargs['upassword'] = password - user.update(kwargs) - self.glob_add_entity(session, user) + self.glob_add_entity(session, EditedEntity(user, **kwargs)) session.execute('SET X in_group G WHERE X eid %(x)s, G name "users"', {'x': user.eid}) if email or '@' in login: @@ -940,7 +940,6 @@ self._extid_cache[cachekey] = eid self._type_source_cache[eid] = (etype, source.uri, extid) entity = source.before_entity_insertion(session, extid, etype, eid) - entity.edited_attributes = set(entity.cw_attr_cache) if source.should_call_hooks: self.hm.call_hooks('before_add_entity', session, entity=entity) # XXX call add_info with complete=False ? @@ -1043,15 +1042,16 @@ self._type_source_cache[entity.eid] = (entity.__regid__, suri, extid) return extid - def glob_add_entity(self, session, entity): + def glob_add_entity(self, session, edited): """add an entity to the repository the entity eid should originaly be None and a unique eid is assigned to the entity instance """ - # init edited_attributes before calling before_add_entity hooks + entity = edited.entity entity._cw_is_saved = False # entity has an eid but is not yet saved - entity.edited_attributes = set(entity.cw_attr_cache) # XXX cw_edited_attributes + # init edited_attributes before calling before_add_entity hooks + entity.cw_edited = edited eschema = entity.e_schema source = self.locate_etype_source(entity.__regid__) # allocate an eid to the entity before calling hooks @@ -1063,17 +1063,15 @@ relations = [] if source.should_call_hooks: self.hm.call_hooks('before_add_entity', session, entity=entity) - # XXX use entity.keys here since edited_attributes is not updated for - # inline relations XXX not true, right? (see edited_attributes - # affectation above) - for attr in entity.cw_attr_cache.iterkeys(): + for attr in edited.iterkeys(): rschema = eschema.subjrels[attr] if not rschema.final: # inlined relation - relations.append((attr, entity[attr])) - entity._cw_set_defaults() + relations.append((attr, edited[attr])) + edited.set_defaults() if session.is_hook_category_activated('integrity'): - entity._cw_check(creation=True) + edited.check(creation=True) source.add_entity(session, entity) + edited.saved = True self.add_info(session, entity, source, extid, complete=False) entity._cw_is_saved = True # entity has an eid and is saved # prefill entity relation caches @@ -1082,7 +1080,7 @@ if rtype in schema.VIRTUAL_RTYPES: continue if rschema.final: - entity.setdefault(rtype, None) + entity.cw_attr_cache.setdefault(rtype, None) else: entity.cw_set_relation_cache(rtype, 'subject', session.empty_rset()) @@ -1105,23 +1103,24 @@ eidfrom=entity.eid, rtype=attr, eidto=value) return entity.eid - def glob_update_entity(self, session, entity, edited_attributes): + def glob_update_entity(self, session, edited): """replace an entity in the repository the type and the eid of an entity must not be changed """ + entity = edited.entity if server.DEBUG & server.DBG_REPO: print 'UPDATE entity', entity.__regid__, entity.eid, \ - entity.cw_attr_cache, edited_attributes + entity.cw_attr_cache, edited hm = self.hm eschema = entity.e_schema session.set_entity_cache(entity) - orig_edited_attributes = getattr(entity, 'edited_attributes', None) - entity.edited_attributes = edited_attributes + orig_edited = getattr(entity, 'cw_edited', None) + entity.cw_edited = edited try: only_inline_rels, need_fti_update = True, False relations = [] source = self.source_from_eid(entity.eid, session) - for attr in list(edited_attributes): + for attr in list(edited): if attr == 'eid': continue rschema = eschema.subjrels[attr] @@ -1134,13 +1133,13 @@ previous_value = entity.related(attr) or None if previous_value is not None: previous_value = previous_value[0][0] # got a result set - if previous_value == entity[attr]: + if previous_value == entity.cw_attr_cache[attr]: previous_value = None elif source.should_call_hooks: hm.call_hooks('before_delete_relation', session, eidfrom=entity.eid, rtype=attr, eidto=previous_value) - relations.append((attr, entity[attr], previous_value)) + relations.append((attr, edited[attr], previous_value)) if source.should_call_hooks: # call hooks for inlined relations for attr, value, _ in relations: @@ -1149,8 +1148,9 @@ if not only_inline_rels: hm.call_hooks('before_update_entity', session, entity=entity) if session.is_hook_category_activated('integrity'): - entity._cw_check() + edited.check() source.update_entity(session, entity) + edited.saved = True self.system_source.update_info(session, entity, need_fti_update) if source.should_call_hooks: if not only_inline_rels: @@ -1172,8 +1172,8 @@ hm.call_hooks('after_add_relation', session, eidfrom=entity.eid, rtype=attr, eidto=value) finally: - if orig_edited_attributes is not None: - entity.edited_attributes = orig_edited_attributes + if orig_edited is not None: + entity.cw_edited = orig_edited def glob_delete_entity(self, session, eid): """delete an entity and all related entities from the repository"""