cwvreg.py
branchstable
changeset 2772 33f71848f7a7
parent 2761 7c583d02917b
child 2771 8074dd88e21b
child 2906 677fa98659a8
equal deleted inserted replaced
2768:3111abdad3b2 2772:33f71848f7a7
   248     def values(self):
   248     def values(self):
   249         return [value for key, value in self.items()]
   249         return [value for key, value in self.items()]
   250     def itervalues(self):
   250     def itervalues(self):
   251         return (value for key, value in self.items())
   251         return (value for key, value in self.items())
   252 
   252 
   253     def reset(self):
   253     def reset(self, path=None, force_reload=None):
   254         super(CubicWebVRegistry, self).reset()
   254         super(CubicWebVRegistry, self).reset(path, force_reload)
   255         self._needs_iface = {}
   255         self._needs_iface = {}
   256         # two special registries, propertydefs which care all the property
   256         # two special registries, propertydefs which care all the property
   257         # definitions, and propertyvals which contains values for those
   257         # definitions, and propertyvals which contains values for those
   258         # properties
   258         # properties
   259         self['propertydefs'] = {}
   259         self['propertydefs'] = {}
   260         self['propertyvalues'] = self.eprop_values = {}
   260         self['propertyvalues'] = self.eprop_values = {}
   261         for key, propdef in self.config.eproperty_definitions():
   261         for key, propdef in self.config.eproperty_definitions():
   262             self.register_property(key, **propdef)
   262             self.register_property(key, **propdef)
       
   263         if path is not None and force_reload:
       
   264             cleanup_sys_modules(path)
       
   265             cubes = self.config.cubes()
       
   266             # if the fs code use some cubes not yet registered into the instance
       
   267             # we should cleanup sys.modules for those as well to avoid potential
       
   268             # bad class reference pb after reloading
       
   269             cfg = self.config
       
   270             for cube in cfg.expand_cubes(cubes, with_recommends=True):
       
   271                 if not cube in cubes:
       
   272                     cpath = cfg.build_vregistry_cube_path([cfg.cube_dir(cube)])
       
   273                     cleanup_sys_modules(cpath)
   263 
   274 
   264     def set_schema(self, schema):
   275     def set_schema(self, schema):
   265         """set instance'schema and load application objects"""
   276         """set instance'schema and load application objects"""
   266         self.schema = schema
   277         self.schema = schema
   267         clear_cache(self, 'rqlhelper')
   278         clear_cache(self, 'rqlhelper')
   268         # now we can load application's web objects
   279         # now we can load application's web objects
   269         self.register_objects(self.config.vregistry_path())
   280         searchpath = self.config.vregistry_path()
       
   281         self.reset(searchpath, force_reload=False)
       
   282         self.register_objects(searchpath, force_reload=False)
   270         # map lowered entity type names to their actual name
   283         # map lowered entity type names to their actual name
   271         self.case_insensitive_etypes = {}
   284         self.case_insensitive_etypes = {}
   272         for etype in self.schema.entities():
   285         for etype in self.schema.entities():
   273             etype = str(etype)
   286             etype = str(etype)
   274             self.case_insensitive_etypes[etype.lower()] = etype
   287             self.case_insensitive_etypes[etype.lower()] = etype
   300         if ifaces:
   313         if ifaces:
   301             self._needs_iface[obj] = ifaces
   314             self._needs_iface[obj] = ifaces
   302 
   315 
   303     def register_objects(self, path, force_reload=None):
   316     def register_objects(self, path, force_reload=None):
   304         """overriden to remove objects requiring a missing interface"""
   317         """overriden to remove objects requiring a missing interface"""
       
   318         if force_reload is None:
       
   319             force_reload = self.config.mode == 'dev'
   305         try:
   320         try:
   306             self._register_objects(path, force_reload)
   321             self._register_objects(path, force_reload)
   307         except RegistryOutOfDate:
   322         except RegistryOutOfDate:
   308             CW_EVENT_MANAGER.emit('before-registry-reload')
   323             CW_EVENT_MANAGER.emit('before-registry-reload')
   309             # modification detected, reset and reload
   324             # modification detected, reset and reload
   310             self.reset()
   325             self.reset(path, force_reload)
   311             cleanup_sys_modules(path)
       
   312             self._register_objects(path, force_reload)
   326             self._register_objects(path, force_reload)
   313             CW_EVENT_MANAGER.emit('after-registry-reload')
   327             CW_EVENT_MANAGER.emit('after-registry-reload')
   314 
   328 
   315     def _register_objects(self, path, force_reload=None):
   329     def _register_objects(self, path, force_reload=None):
   316         """overriden to remove objects requiring a missing interface"""
   330         """overriden to remove objects requiring a missing interface"""