-
-
Save simonedeponti/1559472 to your computer and use it in GitHub Desktop.
utils.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import types | |
from signals_ahoy.signals import form_init | |
class ExtraHandler(object): | |
signal = None | |
@classmethod | |
def hook(cls, form_class): | |
cls.signal.connect(cls(), sender=form_class) | |
def __call__(self, **kwargs): | |
pass | |
class metainitializer(type): | |
def __call__(cls, *args, **kwargs): | |
dict_ = dict(cls.__dict__.items()) | |
if len(args) > 0: | |
dict_['name'] = args[0] | |
if len(args) > 1: | |
dict_['instance'] = args[1] | |
dict_.update(kwargs) | |
return type.__new__(metainitializer, cls.__name__, cls.__bases__, dict_) | |
class ExtraBase(ExtraHandler): | |
__metaclass__ = metainitializer | |
signal = form_init | |
class ExtraField(ExtraBase): | |
def __call__(self, **kwargs): | |
form.fields[self.name] = self.instance | |
class ExtraMethod(ExtraBase): | |
def __call__(self, **kwargs): | |
form = kwargs['form'] | |
form_class = kwargs['sender'] | |
form.__dict__[self.name] = types.MethodType( | |
self.instance, | |
form, | |
form_class | |
) | |
def add_to_form(form_class, *args): | |
for arg in args: | |
if isinstance(arg, type) and issubclass(arg, ExtraHandler): | |
arg.hook(form_class) | |
else: | |
raise ValueError("Must be an ExtraHandler class") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment