Example #1
0
    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()
Example #2
0
    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