from datetime import datetime
from typing import List
import sqlalchemy as sql
from sqlalchemy.orm import (
Mapped,
mapped_column,
relationship,
validates,
)
from sqlalchemy.schema import FetchedValue
from sqlalchemy_utc.sqltypes import UtcDateTime
from app.model.orm.orm_base import OrmBase
[docs]
VALID_TYPES = [
'easy_linear',
'logistic',
'baranyi_roberts',
]
[docs]
VALID_STATES = [
'pending',
'in_progress',
'ready',
'error',
]
[docs]
MODEL_NAMES = {
'easy_linear': '"Easy linear" method',
'logistic': 'Logistic model',
'baranyi_roberts': 'Baranyi-Roberts model',
}
[docs]
class ModelingRequest(OrmBase):
[docs]
__tablename__ = "ModelingRequests"
[docs]
id: Mapped[int] = mapped_column(primary_key=True)
[docs]
type: Mapped[str] = mapped_column(sql.String(100), nullable=False)
[docs]
studyId: Mapped[str] = mapped_column(sql.ForeignKey('Studies.studyId'), nullable=False)
[docs]
study: Mapped['Study'] = relationship(back_populates='modelingRequests')
[docs]
jobUuid: Mapped[str] = mapped_column(sql.String(100))
[docs]
state: Mapped[str] = mapped_column(sql.String(100), default='pending')
[docs]
error: Mapped[str] = mapped_column(sql.String)
[docs]
createdAt: Mapped[datetime] = mapped_column(UtcDateTime, server_default=FetchedValue())
[docs]
updatedAt: Mapped[datetime] = mapped_column(UtcDateTime, server_default=FetchedValue())
[docs]
results: Mapped[List['ModelingResult']] = relationship(
back_populates='request',
cascade='all, delete-orphan'
)
@validates('type')
[docs]
def _validate_type(self, key, value):
return self._validate_inclusion(key, value, VALID_TYPES)
@validates('state')
[docs]
def _validate_state(self, key, value):
return self._validate_inclusion(key, value, VALID_STATES)
@property
[docs]
def long_name(self):
return MODEL_NAMES[self.type]