Ejemplo n.º 1
0
 def _column2relation(
     self,
     datamodel: SQLAInterface,
     column: TreeNode,
     nested: bool = False,
     parent_schema_name: Optional[str] = None,
 ):
     if nested:
         required = not datamodel.is_nullable(column.data)
         nested_model = datamodel.get_related_model(column.data)
         lst = [item.data for item in column.childs]
         nested_schema = self.convert(
             lst, nested_model, nested=False, parent_schema_name=parent_schema_name
         )
         if datamodel.is_relation_many_to_one(column.data):
             many = False
         elif datamodel.is_relation_many_to_many(column.data):
             many = True
             required = False
         elif datamodel.is_relation_one_to_many(column.data):
             many = True
         else:
             many = False
         field = fields.Nested(nested_schema, many=many, required=required)
         field.unique = datamodel.is_unique(column.data)
         return field
     # Handle bug on marshmallow-sqlalchemy
     # https://github.com/marshmallow-code/marshmallow-sqlalchemy/issues/163
     if datamodel.is_relation_many_to_many(
         column.data
     ) or datamodel.is_relation_one_to_many(column.data):
         if datamodel.get_info(column.data).get("required", False):
             required = True
         else:
             required = False
     else:
         required = not datamodel.is_nullable(column.data)
     field = field_for(datamodel.obj, column.data)
     field.required = required
     field.unique = datamodel.is_unique(column.data)
     return field
Ejemplo n.º 2
0
 def _column2enum(
     self,
     datamodel: SQLAInterface,
     column: TreeNode,
     enum_dump_by_name: bool = False,
 ):
     required = not datamodel.is_nullable(column.data)
     enum_class = datamodel.list_columns[column.data].info.get(
         "enum_class", datamodel.list_columns[column.data].type
     )
     if enum_dump_by_name:
         enum_dump_by = EnumField.NAME
     else:
         enum_dump_by = EnumField.VALUE
     field = EnumField(enum_class, dump_by=enum_dump_by, required=required)
     field.unique = datamodel.is_unique(column.data)
     return field
Ejemplo n.º 3
0
    def _column2field(
        self,
        datamodel: SQLAInterface,
        column: TreeNode,
        nested: bool = True,
        enum_dump_by_name: bool = False,
        parent_schema_name: Optional[str] = None,
    ) -> Field:
        """

        :param datamodel: SQLAInterface
        :param column: TreeNode column (childs are dotted columns)
        :param nested: Boolean if will create nested fields
        :param enum_dump_by_name:
        :return: Schema.field
        """
        # Handle relations
        if datamodel.is_relation(column.data):
            return self._column2relation(
                datamodel, column, nested=nested, parent_schema_name=parent_schema_name
            )
        # Handle Enums
        elif datamodel.is_enum(column.data):
            return self._column2enum(
                datamodel, column, enum_dump_by_name=enum_dump_by_name
            )
        # is custom property method field?
        if hasattr(getattr(datamodel.obj, column.data), "fget"):
            return fields.Raw(dump_only=True)
        # its a model function
        if hasattr(getattr(datamodel.obj, column.data), "__call__"):
            return fields.Function(getattr(datamodel.obj, column.data), dump_only=True)
        # is a normal model field not a function?
        if not hasattr(getattr(datamodel.obj, column.data), "__call__"):
            field = field_for(datamodel.obj, column.data)
            field.unique = datamodel.is_unique(column.data)
            if column.data in self.validators_columns:
                if field.validate is None:
                    field.validate = []
                field.validate.append(self.validators_columns[column.data])
                field.validators.append(self.validators_columns[column.data])
            return field