server/schemahooks.py
branch3.5
changeset 2967 e7d348134006
parent 2920 64322aa83a1d
parent 2963 12ad88615a12
child 3526 dfb2ebb765e2
equal deleted inserted replaced
2966:0aeb81eb179c 2967:e7d348134006
   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
  1012         expr = session.execute('Any EXPR WHERE X eid %(x)s, X expression EXPR',
  1035         expr = session.execute('Any EXPR WHERE X eid %(x)s, X expression EXPR',
  1013                                {'x': object}, 'x')[0][0]
  1036                                {'x': object}, 'x')[0][0]
  1014         MemSchemaPermissionRQLExpressionDel(session, perm, subject, expr)
  1037         MemSchemaPermissionRQLExpressionDel(session, perm, subject, expr)
  1015 
  1038 
  1016 
  1039 
  1017 def rebuild_infered_relations(session, subject, rtype, object):
  1040 def after_add_specializes(session, subject, rtype, object):
  1018     # registering a schema operation will trigger a call to
  1041     MemSchemaSpecializesAdd(session, etypeeid=subject, parentetypeeid=object)
  1019     # repo.set_schema() on commit which will in turn rebuild
  1042 
  1020     # infered relation definitions
  1043 def after_del_specializes(session, subject, rtype, object):
  1021     MemSchemaNotifyChanges(session)
  1044     MemSchemaSpecializesDel(session, etypeeid=subject, parentetypeeid=object)
  1022 
  1045 
  1023 
  1046 
  1024 def _register_schema_hooks(hm):
  1047 def _register_schema_hooks(hm):
  1025     """register schema related hooks on the hooks manager"""
  1048     """register schema related hooks on the hooks manager"""
  1026     # schema synchronisation #####################
  1049     # schema synchronisation #####################
  1040     # before/after delete
  1063     # before/after delete
  1041     hm.register_hook(before_del_eetype, 'before_delete_entity', 'CWEType')
  1064     hm.register_hook(before_del_eetype, 'before_delete_entity', 'CWEType')
  1042     hm.register_hook(after_del_eetype, 'after_delete_entity', 'CWEType')
  1065     hm.register_hook(after_del_eetype, 'after_delete_entity', 'CWEType')
  1043     hm.register_hook(before_del_ertype, 'before_delete_entity', 'CWRType')
  1066     hm.register_hook(before_del_ertype, 'before_delete_entity', 'CWRType')
  1044     hm.register_hook(after_del_relation_type, 'after_delete_relation', 'relation_type')
  1067     hm.register_hook(after_del_relation_type, 'after_delete_relation', 'relation_type')
  1045     hm.register_hook(rebuild_infered_relations, 'after_add_relation', 'specializes')
  1068     hm.register_hook(after_add_specializes, 'after_add_relation', 'specializes')
  1046     hm.register_hook(rebuild_infered_relations, 'after_delete_relation', 'specializes')
  1069     hm.register_hook(after_del_specializes, 'after_delete_relation', 'specializes')
  1047     # constraints synchronization hooks
  1070     # constraints synchronization hooks
  1048     hm.register_hook(after_add_econstraint, 'after_add_entity', 'CWConstraint')
  1071     hm.register_hook(after_add_econstraint, 'after_add_entity', 'CWConstraint')
  1049     hm.register_hook(after_update_econstraint, 'after_update_entity', 'CWConstraint')
  1072     hm.register_hook(after_update_econstraint, 'after_update_entity', 'CWConstraint')
  1050     hm.register_hook(before_delete_constrained_by, 'before_delete_relation', 'constrained_by')
  1073     hm.register_hook(before_delete_constrained_by, 'before_delete_relation', 'constrained_by')
  1051     hm.register_hook(after_add_constrained_by, 'after_add_relation', 'constrained_by')
  1074     hm.register_hook(after_add_constrained_by, 'after_add_relation', 'constrained_by')