Writer beginnings

This commit is contained in:
lwark
2025-07-08 12:17:32 -05:00
parent 0472afd9a5
commit 432854e76f
12 changed files with 141 additions and 129 deletions

View File

@@ -27,6 +27,7 @@ logger = logging.getLogger(f"procedure.{__name__}")
class PydBaseClass(BaseModel, extra='allow', validate_assignment=True):
_sql_object: ClassVar = None
# _misc_info: dict|None = None
@model_validator(mode="before")
@classmethod
@@ -67,6 +68,10 @@ class PydBaseClass(BaseModel, extra='allow', validate_assignment=True):
def __init__(self, **data):
# NOTE: Grab the sql model for validation purposes.
self.__class__._sql_object = getattr(models, self.__class__.__name__.replace("Pyd", ""))
# try:
# self.template_file = self.__class__._sql_object.template_file
# except AttributeError:
# pass
super().__init__(**data)
def filter_field(self, key: str) -> Any:
@@ -105,6 +110,12 @@ class PydBaseClass(BaseModel, extra='allow', validate_assignment=True):
output = {k: getattr(self, k) for k in fields}
else:
output = {k: self.filter_field(k) for k in fields}
if hasattr(self, "misc_info") and "info_placement" in self.misc_info:
for k, v in output.items():
try:
output[k]['location'] = [item['location'] for item in self.misc_info['info_placement'] if item['name'] == k]
except (TypeError, KeyError):
continue
return output
def to_sql(self):
@@ -301,6 +312,7 @@ class PydSample(PydBaseClass):
sql._misc_info["submission_rank"] = self.submission_rank
return sql
class PydTips(BaseModel):
name: str
lot: str | None = Field(default=None)
@@ -1662,7 +1674,7 @@ class PydProcedure(PydBaseClass, arbitrary_types_allowed=True):
class PydClientSubmission(PydBaseClass):
# sql_object: ClassVar = ClientSubmission
filepath: Path
filepath: Path | None = Field(default=None)
submissiontype: dict | None
submitted_date: dict | None = Field(default=dict(value=date.today(), missing=True), validate_default=True)
clientlab: dict | None
@@ -1673,6 +1685,39 @@ class PydClientSubmission(PydBaseClass):
contact: dict | None = Field(default=dict(value=None, missing=True), validate_default=True)
submitter_plate_id: dict | None = Field(default=dict(value=None, missing=True), validate_default=True)
@field_validator("submitted_date", mode="before")
@classmethod
def enforce_submitted_date(cls, value):
match value:
case str():
value = dict(value=datetime.strptime(value, "%Y-%m-%d %H:%M:%S"), missing=False)
case date() | datetime():
value = dict(value=value, missing=False)
case _:
pass
return value
@field_validator("submitter_plate_id", mode="before")
@classmethod
def enforce_submitter_plate_id(cls, value):
if isinstance(value, str):
value = dict(value=value, missing=False)
return value
@field_validator("submission_category", mode="before")
@classmethod
def enforce_submission_category_id(cls, value):
if isinstance(value, str):
value = dict(value=value, missing=False)
return value
@field_validator("sample_count", mode="before")
@classmethod
def enforce_sample_count(cls, value):
if isinstance(value, str) or isinstance(value, int):
value = dict(value=value, missing=False)
return value
@field_validator("sample_count")
@classmethod
def enforce_integer(cls, value):
@@ -1700,7 +1745,7 @@ class PydClientSubmission(PydBaseClass):
except TypeError:
check = True
if check:
return dict(value=date.today(), missing=True)
value.update(dict(value=date.today(), missing=True))
else:
match value['value']:
case str():
@@ -1735,6 +1780,29 @@ class PydClientSubmission(PydBaseClass):
from frontend.widgets.submission_widget import ClientSubmissionFormWidget
return ClientSubmissionFormWidget(parent=parent, clientsubmission=self, samples=samples, disable=disable)
def to_sql(self):
sql = super().to_sql()
if "info_placement" not in sql._misc_info:
sql._misc_info['info_placement'] = []
info_placement = []
for k in list(self.model_fields.keys()) + list(self.model_extra.keys()):
attribute = getattr(self, k)
match k:
case "filepath":
sql._misc_info[k] = attribute.__str__()
continue
case _:
pass
logger.debug(f"Setting {k} to {attribute}")
if isinstance(attribute, dict):
if "location" in attribute:
info_placement.append(dict(name=k, location=attribute['location']))
else:
info_placement.append(dict(name=k, location=None))
max_row = max([value['location']['row'] for value in info_placement if value])
sql._misc_info['info_placement'] = info_placement
return sql
class PydResults(PydBaseClass, arbitrary_types_allowed=True):
results: dict = Field(default={})