def build_classes(self): """ Build defined types classes and put them into meta.models module. """ # NOTE: trying to import MetaType on the top of the file doesn't work from meta.models import MetaType, BaseType #mtypeObjects = MetaTypeModel.objects.all() mtypeObjects = MetaType.objects.filter(syncready=True) for metatype in mtypeObjects: fields = metatype.field_set.all() def mod_unicode(self): string = "" for f in self._meta.local_fields: string += "%s " % getattr(self, f.name) return string # __module__ param is required by the django model meta class dct = { '__module__': 'meta.models', '__unicode__': mod_unicode } for field in fields: cls = Fields().get_class_by_name(field.ftype) properties = Fields.get_properties_assoc(field) if len(properties) == 0: # TODO: Should never go here. We must always have needed params when build a field. if issubclass(cls, Fields().get_class_by_name('CharField')): obj = cls(max_length = 255) elif issubclass(cls, Fields().get_class_by_name('DecimalField')): obj = cls(max_digits = 20, decimal_places = 4) else: obj = cls() else: #print properties obj = cls(**properties) # unpack properties dct[field.name] = obj if metatype.extend is None: # define the new type obj = type(str(metatype.name), (BaseType,), dct) else: cls = self.get_class(metatype.extend.name) # TODO: cls could not exist here becouse it is not # built still. # TODO: check for valid class names. It seems that # extending from objects with spaces into class name # I have problems obj = type(str(metatype.name), (cls,), dct) if metatype.name_plural != "": obj._meta.verbose_name_plural = metatype.name_plural try: # build a more confortable admin site here inspecting # for fields and adding them to Admin list_display lst =[] i = 0 MAX_FIELDS = 5 father = metatype.extend while father: inherited_fields = father.field_set.all() for field in inherited_fields: lst.append(field.name) i += 1 if i == MAX_FIELDS: break father = father.extend #all_fields += inherited_fields if i < MAX_FIELDS: for field in fields: lst.append(field.name) i += 1 if i == MAX_FIELDS: break class ObjAdmin(admin.ModelAdmin): list_display = lst admin.site.register(obj, ObjAdmin) except AlreadyRegistered: pass self.add_model(obj) # create tables if not already exists self.sync_models()
def build_classes(self): """ Build defined types classes and put them into meta.models module. Return True if at least a class was builded """ # NOTE: trying to import MetaType on the top of the file doesn't work from meta.models import MetaType, BaseType, META_OBJECTS_LABEL from meta.admin import BaseTypeAdmin # is the function redurn value. # will be true if at least an object will be builded class_builded = False #mtypeObjects = MetaTypeModel.objects.all() mtypeObjects = MetaType.objects.filter(syncready=True) for metatype in mtypeObjects: # don't rebuild the model if is already registred if metatype.name in self.__metaClasses.keys(): continue class_builded = True fields = metatype.field_set.all() def mod_unicode(self): cls_name = self._meta.object_name mtype = MetaType.objects.get(name=cls_name) tmp = mtype.field_set.filter(is_preview=True) preview_fields_objects = [] # TODO: find a way to use DateTime and Date in previews exclude_list = ["ManyToManyField", "FileField", "DateTimeField", "DateField"] for f in tmp: if not f.ftype in exclude_list: preview_fields_objects.append(f) preview_fields = [f.name for f in preview_fields_objects] string = "" string = " | ".join([getattr(self, f.name) for f.name in preview_fields]) return string class ModMeta: app_label = META_OBJECTS_LABEL # __module__ param is required by the django model meta class dct = { '__module__': 'meta.models', '__unicode__': mod_unicode, 'Meta': ModMeta } for field in fields: cls = Fields.get_class_by_name(field.ftype) properties = Fields.get_properties_assoc(field) if len(properties) == 0: # TODO: Should never go here. We must always have needed params when build a field. if issubclass(cls, Fields.get_class_by_name('CharField')): obj = cls(max_length = 255) elif issubclass(cls, Fields.get_class_by_name('DecimalField')): obj = cls(max_digits = 20, decimal_places = 4) elif issubclass(cls, Fields.get_class_by_name('FileField')): obj = cls(upload_to='uploads') else: obj = cls() else: #print properties obj = cls(**properties) # unpack properties # use str here to force conversion from unicode dct[str(field.name)] = obj if metatype.extend is None: # define the new type obj = type(str(metatype.name), (BaseType,), dct) else: cls = self.get_class(metatype.extend.name) # TODO: cls could not exist here becouse it is not # built still. # TODO: check for valid class names. It seems that # extending from objects with spaces into class name # I have problems obj = type(str(metatype.name), (cls,), dct) if metatype.name_plural != "": obj._meta.verbose_name_plural = metatype.name_plural try: # build a more confortable admin site here inspecting # for fields and adding them to Admin list_display lst =[] i = 0 MAX_FIELDS = 5 father = metatype.extend while father: inherited_fields = father.field_set.all() for field in inherited_fields: lst.append(field.name) i += 1 if i == MAX_FIELDS: break father = father.extend #all_fields += inherited_fields if i < MAX_FIELDS: for field in fields: # ManyToManyFields are not supported by list_display in # admin and TextFields are generally too large to # fit preview if (field.ftype != "ManyToManyField") and \ (field.ftype != "TextField"): lst.append(field.name) i += 1 if i == MAX_FIELDS: break class ObjAdmin(BaseTypeAdmin): list_display = lst + BaseTypeAdmin.list_display admin.site.register(obj, ObjAdmin) except AlreadyRegistered: pass # self.add_model(obj) # create tables if not already exists self.sync_models() return class_builded