server/schemahooks.py
branchstable
changeset 2963 12ad88615a12
parent 2745 0dafa29ace1f
child 2967 e7d348134006
equal deleted inserted replaced
2962:5e2239672e16 2963:12ad88615a12
   133     def __init__(self, session):
   133     def __init__(self, session):
   134         self.repo = session.repo
   134         self.repo = session.repo
   135         SingleLastOperation.__init__(self, session)
   135         SingleLastOperation.__init__(self, session)
   136 
   136 
   137     def commit_event(self):
   137     def commit_event(self):
   138         self.repo.set_schema(self.repo.schema)
   138         rebuildinfered = self.session.data.get('rebuild-infered', True)
       
   139         self.repo.set_schema(self.repo.schema, rebuildinfered=rebuildinfered)
   139 
   140 
   140 
   141 
   141 class MemSchemaOperation(Operation):
   142 class MemSchemaOperation(Operation):
   142     """base class for schema operations"""
   143     """base class for schema operations"""
   143     def __init__(self, session, kobj=None, **kwargs):
   144     def __init__(self, session, kobj=None, **kwargs):
   716                 self.perm, erschema.type, self.expr)
   717                 self.perm, erschema.type, self.expr)
   717             return
   718             return
   718         erschema.set_rqlexprs(self.perm, rqlexprs)
   719         erschema.set_rqlexprs(self.perm, rqlexprs)
   719 
   720 
   720 
   721 
       
   722 class MemSchemaSpecializesAdd(MemSchemaOperation):
       
   723 
       
   724     def commit_event(self):
       
   725         eschema = self.session.schema.schema_by_eid(self.etypeeid)
       
   726         parenteschema = self.session.schema.schema_by_eid(self.parentetypeeid)
       
   727         eschema._specialized_type = parenteschema.type
       
   728         parenteschema._specialized_by.append(eschema.type)
       
   729 
       
   730 
       
   731 class MemSchemaSpecializesDel(MemSchemaOperation):
       
   732 
       
   733     def commit_event(self):
       
   734         try:
       
   735             eschema = self.session.schema.schema_by_eid(self.etypeeid)
       
   736             parenteschema = self.session.schema.schema_by_eid(self.parentetypeeid)
       
   737         except KeyError:
       
   738             # etype removed, nothing to do
       
   739             return
       
   740         eschema._specialized_type = None
       
   741         parenteschema._specialized_by.remove(eschema.type)
       
   742 
       
   743 
   721 # deletion hooks ###############################################################
   744 # deletion hooks ###############################################################
   722 
   745 
   723 def before_del_eetype(session, eid):
   746 def before_del_eetype(session, eid):
   724     """before deleting a CWEType entity:
   747     """before deleting a CWEType entity:
   725     * check that we don't remove a core entity type
   748     * check that we don't remove a core entity type
  1013         expr = session.execute('Any EXPR WHERE X eid %(x)s, X expression EXPR',
  1036         expr = session.execute('Any EXPR WHERE X eid %(x)s, X expression EXPR',
  1014                                {'x': object}, 'x')[0][0]
  1037                                {'x': object}, 'x')[0][0]
  1015         MemSchemaPermissionRQLExpressionDel(session, perm, subject, expr)
  1038         MemSchemaPermissionRQLExpressionDel(session, perm, subject, expr)
  1016 
  1039 
  1017 
  1040 
  1018 def rebuild_infered_relations(session, subject, rtype, object):
  1041 def after_add_specializes(session, subject, rtype, object):
  1019     # registering a schema operation will trigger a call to
  1042     MemSchemaSpecializesAdd(session, etypeeid=subject, parentetypeeid=object)
  1020     # repo.set_schema() on commit which will in turn rebuild
  1043 
  1021     # infered relation definitions
  1044 def after_del_specializes(session, subject, rtype, object):
  1022     MemSchemaNotifyChanges(session)
  1045     MemSchemaSpecializesDel(session, etypeeid=subject, parentetypeeid=object)
  1023 
  1046 
  1024 
  1047 
  1025 def _register_schema_hooks(hm):
  1048 def _register_schema_hooks(hm):
  1026     """register schema related hooks on the hooks manager"""
  1049     """register schema related hooks on the hooks manager"""
  1027     # schema synchronisation #####################
  1050     # schema synchronisation #####################
  1041     # before/after delete
  1064     # before/after delete
  1042     hm.register_hook(before_del_eetype, 'before_delete_entity', 'CWEType')
  1065     hm.register_hook(before_del_eetype, 'before_delete_entity', 'CWEType')
  1043     hm.register_hook(after_del_eetype, 'after_delete_entity', 'CWEType')
  1066     hm.register_hook(after_del_eetype, 'after_delete_entity', 'CWEType')
  1044     hm.register_hook(before_del_ertype, 'before_delete_entity', 'CWRType')
  1067     hm.register_hook(before_del_ertype, 'before_delete_entity', 'CWRType')
  1045     hm.register_hook(after_del_relation_type, 'after_delete_relation', 'relation_type')
  1068     hm.register_hook(after_del_relation_type, 'after_delete_relation', 'relation_type')
  1046     hm.register_hook(rebuild_infered_relations, 'after_add_relation', 'specializes')
  1069     hm.register_hook(after_add_specializes, 'after_add_relation', 'specializes')
  1047     hm.register_hook(rebuild_infered_relations, 'after_delete_relation', 'specializes')
  1070     hm.register_hook(after_del_specializes, 'after_delete_relation', 'specializes')
  1048     # constraints synchronization hooks
  1071     # constraints synchronization hooks
  1049     hm.register_hook(after_add_econstraint, 'after_add_entity', 'CWConstraint')
  1072     hm.register_hook(after_add_econstraint, 'after_add_entity', 'CWConstraint')
  1050     hm.register_hook(after_update_econstraint, 'after_update_entity', 'CWConstraint')
  1073     hm.register_hook(after_update_econstraint, 'after_update_entity', 'CWConstraint')
  1051     hm.register_hook(before_delete_constrained_by, 'before_delete_relation', 'constrained_by')
  1074     hm.register_hook(before_delete_constrained_by, 'before_delete_relation', 'constrained_by')
  1052     hm.register_hook(after_add_constrained_by, 'after_add_relation', 'constrained_by')
  1075     hm.register_hook(after_add_constrained_by, 'after_add_relation', 'constrained_by')