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""" |