Guest User

Untitled

a guest
Jul 19th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.25 KB | None | 0 0
  1. class ModelMetaclass (type):
  2. """
  3. ModelMetaclass makes changes to Model sub-classes to make them more user friendly.
  4. """
  5.  
  6. def __init__ (cls, name, bases, members):
  7. """
  8. Create a new ModelMetaclass instance.
  9.  
  10. @param cls: The metaclass instance.
  11. @param name: The class name.
  12. @param bases: The class base class and interfaces.
  13. @param members: The class members.
  14.  
  15. @raise ModelException: If the class cannot be built for any reason.
  16. """
  17.  
  18. if name == "Model" and ModelMetaclass.__module__ == cls.__module__:
  19. return type.__init__(cls, name, bases, members)
  20.  
  21. if Model not in bases:
  22. raise ModelException("%s must sub-class Model in order to use Metaclass" % name)
  23.  
  24. # meta details
  25. if not hasattr(cls, "Meta"):
  26. cls.Meta = new.classobj("Meta", (object,), {})
  27.  
  28. if not hasattr(cls.Meta, "required") or type(cls.Meta.required) != bool:
  29. cls.Meta.required = True
  30.  
  31. cls.Meta.default = {}
  32. cls.Meta.fields = {}
  33. cls.Meta.groups = {}
  34. cls.Meta.read_only = []
  35.  
  36. # iterate class instances
  37. for field_name in dir(cls):
  38. field_inst = getattr(cls, field_name)
  39.  
  40. if not isinstance(field_inst, Field):
  41. continue
  42.  
  43. field_inst.field = field_name
  44. field_inst.model = cls
  45.  
  46. if field_inst.default is None:
  47. cls.Meta.default[field_name] = field_inst.default
  48.  
  49. if field_inst.read_only:
  50. field_inst.required = False
  51.  
  52. cls.Meta.read_only.append(field_name)
  53.  
  54. if field_inst.required is None:
  55. field_inst.required = cls.Meta.required
  56.  
  57. if field_inst.group and field_inst.group not in cls.Meta.groups:
  58. if not hasattr(cls, "group_" + field_inst.group):
  59. raise ModelException("%s is missing group validator group_%s()" % (name, field_inst.group))
  60.  
  61. cls.Meta.groups[field_inst.group] = None
  62.  
  63. cls.Meta.fields[field_name] = field_inst
  64.  
  65. delattr(cls, field_name)
  66.  
  67. return type.__init__(cls, name, bases, members)
Add Comment
Please, Sign In to add comment