view.py
changeset 9256 697a8181ba30
parent 8976 aeb7d400ee92
child 9492 c7fc56eecd1a
equal deleted inserted replaced
9255:46f41c3e1443 9256:697a8181ba30
   556 class Adapter(AppObject):
   556 class Adapter(AppObject):
   557     """base class for adapters"""
   557     """base class for adapters"""
   558     __registry__ = 'adapters'
   558     __registry__ = 'adapters'
   559 
   559 
   560 
   560 
   561 def implements_adapter_compat(iface):
       
   562     def _pre39_compat(func):
       
   563         def decorated(self, *args, **kwargs):
       
   564             entity = self.entity
       
   565             if hasattr(entity, func.__name__):
       
   566                 warn('[3.9] %s method is deprecated, define it on a custom '
       
   567                      '%s for %s instead' % (func.__name__, iface,
       
   568                                             entity.__class__),
       
   569                      DeprecationWarning)
       
   570                 member = getattr(entity, func.__name__)
       
   571                 if callable(member):
       
   572                     return member(*args, **kwargs)
       
   573                 return member
       
   574             return func(self, *args, **kwargs)
       
   575         decorated.decorated = func
       
   576         return decorated
       
   577     return _pre39_compat
       
   578 
       
   579 
       
   580 def unwrap_adapter_compat(cls):
       
   581     parent = cls.__bases__[0]
       
   582     for member_name in dir(parent):
       
   583         member = getattr(parent, member_name)
       
   584         if isinstance(member, types.MethodType) and hasattr(member.im_func, 'decorated') and not member_name in cls.__dict__:
       
   585             method = new.instancemethod(member.im_func.decorated, None, cls)
       
   586             setattr(cls, member_name, method)
       
   587 
       
   588 
       
   589 class auto_unwrap_bw_compat(type):
   561 class auto_unwrap_bw_compat(type):
   590     def __new__(mcs, name, bases, classdict):
   562     def __new__(mcs, name, bases, classdict):
   591         cls = type.__new__(mcs, name, bases, classdict)
   563         cls = type.__new__(mcs, name, bases, classdict)
   592         if not classdict.get('__needs_bw_compat__'):
   564         if not classdict.get('__needs_bw_compat__'):
   593             unwrap_adapter_compat(cls)
   565             unwrap_adapter_compat(cls)
   594         return cls
   566         return cls
   595 
   567 
   596 
   568 
   597 class EntityAdapter(Adapter):
   569 class EntityAdapter(Adapter):
   598     """base class for entity adapters (eg adapt an entity to an interface)"""
   570     """base class for entity adapters (eg adapt an entity to an interface)"""
   599     __metaclass__ = auto_unwrap_bw_compat
       
   600     def __init__(self, _cw, **kwargs):
   571     def __init__(self, _cw, **kwargs):
   601         try:
   572         try:
   602             self.entity = kwargs.pop('entity')
   573             self.entity = kwargs.pop('entity')
   603         except KeyError:
   574         except KeyError:
   604             self.entity = kwargs['rset'].get_entity(kwargs.get('row') or 0,
   575             self.entity = kwargs['rset'].get_entity(kwargs.get('row') or 0,