cwvreg.py
branchtls-sprint
changeset 785 e4f9fa3c891a
parent 777 39695e98ba35
child 816 9cd49a910fce
equal deleted inserted replaced
784:33db07c66789 785:e4f9fa3c891a
    92 
    92 
    93     def register_if_interface_found(self, obj, ifaces, **kwargs):
    93     def register_if_interface_found(self, obj, ifaces, **kwargs):
    94         """register an object but remove it if no entity class implements one of
    94         """register an object but remove it if no entity class implements one of
    95         the given interfaces
    95         the given interfaces
    96         """
    96         """
       
    97         self.register(obj, **kwargs)
    97         if not isinstance(ifaces,  (tuple, list)):
    98         if not isinstance(ifaces,  (tuple, list)):
    98             self._needs_iface[obj] = frozenset((ifaces,))
    99             self._needs_iface[obj] = (ifaces,)
    99         else:
   100         else:
   100             self._needs_iface[obj] = frozenset(ifaces)
   101             self._needs_iface[obj] = ifaces
   101         self.register(obj, **kwargs)
       
   102 
   102 
   103     def register(self, obj, **kwargs):
   103     def register(self, obj, **kwargs):
   104         if kwargs.get('registryname', obj.__registry__) == 'etypes':
   104         if kwargs.get('registryname', obj.__registry__) == 'etypes':
   105             kwargs['clear'] = True
   105             kwargs['clear'] = True
   106         super(CubicWebRegistry, self).register(obj, **kwargs)
   106         super(CubicWebRegistry, self).register(obj, **kwargs)
   107         # XXX bw compat
   107         # XXX bw compat
   108         ifaces = use_interfaces(obj)
   108         ifaces = use_interfaces(obj)
   109         if ifaces:
   109         if ifaces:
   110             self._needs_iface[obj] = frozenset(ifaces)
   110             self._needs_iface[obj] = ifaces
   111         
   111         
   112     def register_objects(self, path, force_reload=None):
   112     def register_objects(self, path, force_reload=None):
   113         """overriden to remove objects requiring a missing interface"""
   113         """overriden to remove objects requiring a missing interface"""
   114         if super(CubicWebRegistry, self).register_objects(path, force_reload):
   114         if super(CubicWebRegistry, self).register_objects(path, force_reload):
   115             # clear etype cache if you don't want to run into deep weirdness
   115             # clear etype cache if you don't want to run into deep weirdness
   122             interfaces = set()
   122             interfaces = set()
   123             for classes in self.get('etypes', {}).values():
   123             for classes in self.get('etypes', {}).values():
   124                 for cls in classes:
   124                 for cls in classes:
   125                     for iface in cls.__implements__:
   125                     for iface in cls.__implements__:
   126                         interfaces.update(expand_parent_classes(iface))
   126                         interfaces.update(expand_parent_classes(iface))
       
   127                     interfaces.update(expand_parent_classes(cls))
   127             for obj, ifaces in self._needs_iface.items():
   128             for obj, ifaces in self._needs_iface.items():
       
   129                 ifaces = frozenset(isinstance(iface, basestring) and self.etype_class(iface) or iface
       
   130                                    for iface in ifaces)
   128                 if not ifaces & interfaces:
   131                 if not ifaces & interfaces:
   129                     self.debug('kicking vobject %s (unsupported interface)', obj)
   132                     self.debug('kicking vobject %s (unsupported interface)', obj)
   130                     self.unregister(obj)
   133                     self.unregister(obj)
   131             
   134             
   132         
   135