diff -r 6b55a2a81fd8 -r c4f6a53884ec server/hooks.py --- a/server/hooks.py Fri Jul 31 23:45:07 2009 +0200 +++ b/server/hooks.py Fri Jul 31 23:46:59 2009 +0200 @@ -17,6 +17,15 @@ get_user_sessions, rproperty) from cubicweb.server.repository import FTIndexEntityOp +# special relations that don't have to be checked for integrity, usually +# because they are handled internally by hooks (so we trust ourselves) +DONT_CHECK_RTYPES_ON_ADD = set(('owned_by', 'created_by', + 'is', 'is_instance_of', + 'wf_info_for', 'from_state', 'to_state')) +DONT_CHECK_RTYPES_ON_DEL = set(('is', 'is_instance_of', + 'wf_info_for', 'from_state', 'to_state')) + + def relation_deleted(session, eidfrom, rtype, eidto): session.transaction_data.setdefault('pendingrelations', []).append( (eidfrom, rtype, eidto)) @@ -280,7 +289,7 @@ eid = entity.eid for rschema, targetschemas, x in entity.e_schema.relation_definitions(): # skip automatically handled relations - if rschema.type in ('owned_by', 'created_by', 'is', 'is_instance_of'): + if rschema.type in DONT_CHECK_RTYPES_ON_ADD: continue if x == 'subject': subjtype = entity.e_schema @@ -299,6 +308,8 @@ def cardinalitycheck_before_del_relation(session, eidfrom, rtype, eidto): """check cardinalities are satisfied""" + if rtype in DONT_CHECK_RTYPES_ON_DEL: + return card = rproperty(session, rtype, eidfrom, eidto, 'cardinality') pendingeids = session.transaction_data.get('pendingeids', ()) if card[0] in '1+' and not eidfrom in pendingeids: