Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 20th, 2012  |  syntax: None  |  size: 1.28 KB  |  hits: 11  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. import types
  2. from signals_ahoy.signals import form_init
  3.  
  4. class ExtraHandler(object):
  5.  
  6.     signal = None
  7.  
  8.     @classmethod
  9.     def hook(cls, form_class):
  10.         cls.signal.connect(cls(), sender=form_class)
  11.  
  12.     def __call__(self, **kwargs):
  13.         pass
  14.  
  15.  
  16. class metainitializer(type):
  17.  
  18.     def __call__(cls, *args, **kwargs):
  19.         dict_ = dict(cls.__dict__.items())
  20.         if len(args) > 0:
  21.             dict_['name'] = args[0]
  22.         if len(args) > 1:
  23.             dict_['instance'] = args[1]
  24.         dict_.update(kwargs)
  25.         return type.__new__(metainitializer, cls.__name__, cls.__bases__, dict_)
  26.  
  27.  
  28. class ExtraBase(ExtraHandler):
  29.     __metaclass__ = metainitializer
  30.     signal = form_init
  31.  
  32.  
  33. class ExtraField(ExtraBase):
  34.  
  35.     def __call__(self, **kwargs):
  36.         form.fields[self.name] = self.instance
  37.  
  38.  
  39. class ExtraMethod(ExtraBase):
  40.  
  41.     def __call__(self, **kwargs):
  42.         form = kwargs['form']
  43.         form_class = kwargs['sender']
  44.         form.__dict__[self.name] = types.MethodType(
  45.             self.instance,
  46.             form,
  47.             form_class
  48.         )
  49.  
  50.  
  51. def add_to_form(form_class, *args):
  52.     for arg in args:
  53.         if isinstance(arg, type) and issubclass(arg, ExtraHandler):
  54.             arg.hook(form_class)
  55.         else:
  56.             raise ValueError("Must be an ExtraHandler class")