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