from config.module import Module from core.field import get_field from core.pydantic_field import get_pydantic_field from sqlalchemy import Column, Integer from yaml import safe_load class Config: """ Base class for ModelConfig, SchemaConfig and CreateSchemaConfig. """ def __init__(self, module_name: str) -> None: """ Initialize configuration. :param module_name: The name of module. """ self.module = Module(module_name) self.project = self.get_project() def get_project(self) -> dict: """ Construct and return dictionary with project attributes from yaml file. """ with open(self.module.config_path, "r") as stream: project = safe_load(stream) return project class Config: orm_mode = True class ModelConfig(Config): """ Configurates sqlalchemy model of module. """ def get_model_attrs(self) -> dict: """ Returns model configuration for the module. """ file_fields = set() model_attrs = { "__tablename__": self.module.title, "id": Column(Integer, primary_key=True, index=True), } for field_name, field_attrs in self.project.get("fields").items(): model_attrs[field_name] = get_field(field_attrs) if field_attrs["type"] == "file": file_fields.add(field_name) model_attrs["_file_fields"] = file_fields return model_attrs class CreateSchemaConfig(Config): """ Configurates pydantic model for creating items of module. """ def get_create_field_defs(self): """ Returns all pydantic model fields. """ create_field_definitions = { field_name: get_pydantic_field(field_attrs) for field_name, field_attrs in self.project.get("fields").items() if field_attrs["type"] != "file" and get_pydantic_field(field_attrs) } return create_field_definitions class SchemaConfig(Config): """ Configurates pydantic model for updating and returning items of module. """ def get_field_defs(self): """ Return all pydantic model fields and ID field. """ field_definitions = {} field_definitions["id"] = (int, ...) for field_name, field_attrs in self.project.get("fields").items(): if get_pydantic_field(field_attrs): field_definitions[field_name] = get_pydantic_field(field_attrs) return field_definitions