Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class ModelMetaclass (type):
- """
- ModelMetaclass makes changes to Model sub-classes to make them more user friendly.
- """
- def __init__ (cls, name, bases, members):
- """
- Create a new ModelMetaclass instance.
- @param cls: The metaclass instance.
- @param name: The class name.
- @param bases: The class base class and interfaces.
- @param members: The class members.
- @raise ModelException: If the class cannot be built for any reason.
- """
- if name == "Model" and ModelMetaclass.__module__ == cls.__module__:
- return type.__init__(cls, name, bases, members)
- if Model not in bases:
- raise ModelException("%s must sub-class Model in order to use Metaclass" % name)
- # meta details
- if not hasattr(cls, "Meta"):
- cls.Meta = new.classobj("Meta", (object,), {})
- if not hasattr(cls.Meta, "required") or type(cls.Meta.required) != bool:
- cls.Meta.required = True
- cls.Meta.default = {}
- cls.Meta.fields = {}
- cls.Meta.groups = {}
- cls.Meta.read_only = []
- # iterate class instances
- for field_name in dir(cls):
- field_inst = getattr(cls, field_name)
- if not isinstance(field_inst, Field):
- continue
- field_inst.field = field_name
- field_inst.model = cls
- if field_inst.default is None:
- cls.Meta.default[field_name] = field_inst.default
- if field_inst.read_only:
- field_inst.required = False
- cls.Meta.read_only.append(field_name)
- if field_inst.required is None:
- field_inst.required = cls.Meta.required
- if field_inst.group and field_inst.group not in cls.Meta.groups:
- if not hasattr(cls, "group_" + field_inst.group):
- raise ModelException("%s is missing group validator group_%s()" % (name, field_inst.group))
- cls.Meta.groups[field_inst.group] = None
- cls.Meta.fields[field_name] = field_inst
- delattr(cls, field_name)
- return type.__init__(cls, name, bases, members)
Add Comment
Please, Sign In to add comment