100 lines
2.5 KiB
Python
100 lines
2.5 KiB
Python
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
|