diff -r b2d0b14a365d -r 394f853bb653 hooks/syncschema.py --- a/hooks/syncschema.py Mon Dec 07 17:57:19 2009 +0100 +++ b/hooks/syncschema.py Mon Dec 07 19:14:49 2009 +0100 @@ -12,7 +12,7 @@ """ __docformat__ = "restructuredtext en" -from yams.schema import BASE_TYPES +from yams.schema import BASE_TYPES, RelationSchema from yams.buildobjs import EntityType, RelationType, RelationDefinition from yams.schema2sql import eschema2sql, rschema2sql, type_from_constraints @@ -483,7 +483,8 @@ # so there is nothing to do here if session.added_in_transaction(rdef.eid): return - subjtype, rtype, objtype = session.vreg.schema.schema_by_eid(rdef.eid) + rdefschema = session.vreg.schema.schema_by_eid(rdef.eid) + subjtype, rtype, objtype = rdefschema.as_triple() cstrtype = self.entity.type oldcstr = rtype.rdef(subjtype, objtype).constraint_by_type(cstrtype) newcstr = CONSTRAINTS[cstrtype].deserialize(self.entity.value) @@ -603,7 +604,7 @@ def commit_event(self): # structure should be clean, not need to remove entity's relations # at this point - self.rschema.rdef[self.kobj].update(self.values) + self.rschema.rdefs[self.kobj].update(self.values) class MemSchemaRDefDel(MemSchemaOperation): @@ -632,7 +633,8 @@ if self.session.added_in_transaction(rdef.eid): self.cancelled = True return - subjtype, rtype, objtype = self.session.vreg.schema.schema_by_eid(rdef.eid) + rdef = self.session.vreg.schema.schema_by_eid(rdef.eid) + subjtype, rtype, objtype = rdef.as_triple() self.prepare_constraints(subjtype, rtype, objtype) cstrtype = self.entity.type self.cstr = rtype.rdef(subjtype, objtype).constraint_by_type(cstrtype) @@ -668,13 +670,13 @@ def commit_event(self): """the observed connections pool has been commited""" try: - erschema = self.session.vreg.schema[self.name] + erschema = self.session.vreg.schema.schema_by_eid(self.eid) except KeyError: # duh, schema not found, log error and skip operation - self.error('no schema for %s', self.name) + self.error('no schema for %s', self.eid) return perms = list(erschema.action_permissions(self.action)) - if hasattr(self, group_eid): + if hasattr(self, 'group_eid'): perm = self.session.entity_from_eid(self.group_eid).name else: perm = erschema.rql_expression(self.expr) @@ -695,18 +697,20 @@ def commit_event(self): """the observed connections pool has been commited""" try: - erschema = self.session.vreg.schema[self.name] + erschema = self.session.vreg.schema.schema_by_eid(self.eid) except KeyError: # duh, schema not found, log error and skip operation - self.error('no schema for %s', self.name) + self.error('no schema for %s', self.eid) + return + if isinstance(erschema, RelationSchema): # XXX 3.6 migration return perms = list(erschema.action_permissions(self.action)) - if hasattr(self, group_eid): + if hasattr(self, 'group_eid'): perm = self.session.entity_from_eid(self.group_eid).name else: perm = erschema.rql_expression(self.expr) try: - perms.remove(self.group) + perms.remove(perm) erschema.set_action_permissions(self.action, perms) except ValueError: self.error('can\'t remove permission %s for %s on %s', @@ -916,7 +920,7 @@ # don't use getattr(entity, attr), we would get the modified value if any for attr in ro_attrs: if attr in entity.edited_attributes: - origval, newval = entity_oldnewvalue(entity, attr) + origval, newval = hook.entity_oldnewvalue(entity, attr) if newval != origval: errors[attr] = session._("can't change the %s attribute") % \ display_name(session, attr) @@ -940,8 +944,8 @@ def __call__(self): session = self._cw - subjschema, rschema, objschema = session.vreg.schema.schema_by_eid(self.eidfrom) - subjschema, rschema, objschema = session.schema.schema_by_eid(rdefeid) + rdef = session.vreg.schema.schema_by_eid(self.eidfrom) + subjschema, rschema, objschema = rdef.as_triple() pendings = session.transaction_data.get('pendingeids', ()) pendingrdefs = session.transaction_data.setdefault('pendingrdefs', set()) # first delete existing relation if necessary @@ -956,7 +960,7 @@ % (rschema, subjschema, objschema)) execute = session.unsafe_execute rset = execute('Any COUNT(X) WHERE X is %s, X relation_type R,' - 'R eid %%(x)s' % rdeftype, {'x': rteid}) + 'R eid %%(x)s' % rdeftype, {'x': self.eidto}) lastrel = rset[0][0] == 0 # we have to update physical schema systematically for final and inlined # relations, but only if it's the last instance for this relation type @@ -965,17 +969,17 @@ if (rschema.final or rschema.inlined): rset = execute('Any COUNT(X) WHERE X is %s, X relation_type R, ' 'R eid %%(x)s, X from_entity E, E name %%(name)s' - % rdeftype, {'x': rteid, 'name': str(subjschema)}) + % rdeftype, {'x': self.eidto, 'name': str(subjschema)}) if rset[0][0] == 0 and not subjschema.eid in pendings: ptypes = session.transaction_data.setdefault('pendingrtypes', set()) ptypes.add(rschema.type) DropColumn(session, table=SQL_PREFIX + subjschema.type, - column=SQL_PREFIX + rschema.type) + column=SQL_PREFIX + rschema.type) elif lastrel: DropRelationTable(session, rschema.type) # if this is the last instance, drop associated relation type if lastrel and not rteid in pendings: - execute('DELETE CWRType X WHERE X eid %(x)s', {'x': rteid}, 'x') + execute('DELETE CWRType X WHERE X eid %(x)s', {'x': self.eidto}, 'x') MemSchemaRDefDel(session, (subjschema, rschema, objschema)) @@ -1087,7 +1091,7 @@ group_eid=self.eidto) else: # RQLExpression expr = self._cw.entity_from_eid(self.eidto).expression - MemSchemaPermissionAdd(session, action=action, eid=self.eidfrom, + MemSchemaPermissionAdd(self._cw, action=action, eid=self.eidfrom, expr=expr)