Bug fixes.

This commit is contained in:
lwark
2024-08-02 14:58:01 -05:00
parent 88f3e92069
commit 1a55b52f31
2 changed files with 75 additions and 4 deletions

View File

@@ -2,6 +2,9 @@
All kit and reagent related models All kit and reagent related models
""" """
from __future__ import annotations from __future__ import annotations
from pprint import pprint
from sqlalchemy import Column, String, TIMESTAMP, JSON, INTEGER, ForeignKey, Interval, Table, FLOAT, BLOB from sqlalchemy import Column, String, TIMESTAMP, JSON, INTEGER, ForeignKey, Interval, Table, FLOAT, BLOB
from sqlalchemy.orm import relationship, validates, Query from sqlalchemy.orm import relationship, validates, Query
from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy.ext.associationproxy import association_proxy
@@ -253,6 +256,32 @@ class KitType(BaseClass):
super().save() super().save()
def to_export_dict(self, submission_type: SubmissionType):
base_dict = {}
base_dict['reagent roles'] = []
base_dict['equipment roles'] = []
for k, v in self.construct_xl_map_for_use(submission_type=submission_type):
logger.debug(f"Value: {v}")
try:
assoc = [item for item in self.kit_reagentrole_associations if item.reagent_role.name == k][0]
except IndexError as e:
continue
for kk, vv in assoc.to_export_dict().items():
v[kk] = vv
base_dict['reagent roles'].append(v)
for k, v in submission_type.construct_equipment_map():
try:
assoc = [item for item in submission_type.submissiontype_equipmentrole_associations if item.equipment_role.name == k][0]
except IndexError:
continue
for kk, vv in assoc.to_export_dict(kit_type=self).items():
logger.debug(f"{kk}:{vv}")
v[kk] = vv
base_dict['equipment roles'].append(v)
logger.debug(f"KT returning {base_dict}")
return base_dict
class ReagentRole(BaseClass): class ReagentRole(BaseClass):
""" """
Base of reagent type abstract Base of reagent type abstract
@@ -351,6 +380,9 @@ class ReagentRole(BaseClass):
from backend.validators.pydant import PydReagent from backend.validators.pydant import PydReagent
return PydReagent(lot=None, role=self.name, name=self.name, expiry=date.today()) return PydReagent(lot=None, role=self.name, name=self.name, expiry=date.today())
def to_export_dict(self):
return dict(role=self.name, extension_of_life=self.eol_ext.days)
@check_authorization @check_authorization
def save(self): def save(self):
super().save() super().save()
@@ -665,7 +697,7 @@ class SubmissionType(BaseClass):
self.template_file = data self.template_file = data
self.save() self.save()
def construct_info_map(self, mode: Literal['read', 'write']) -> dict: def construct_info_map(self, mode: Literal['read', 'write', 'export']) -> dict:
""" """
Make of map of where all fields are located in Excel sheet Make of map of where all fields are located in Excel sheet
@@ -683,6 +715,8 @@ class SubmissionType(BaseClass):
case "write": case "write":
output = {k: v[mode] + v['read'] for k, v in info.items() if v[mode] or v['read']} output = {k: v[mode] + v['read'] for k, v in info.items() if v[mode] or v['read']}
output = {k: v for k, v in output.items() if all([isinstance(item, dict) for item in v])} output = {k: v for k, v in output.items() if all([isinstance(item, dict) for item in v])}
case "export":
return self.info_map
case _: case _:
output = {} output = {}
output['custom'] = self.info_map['custom'] output['custom'] = self.info_map['custom']
@@ -810,6 +844,17 @@ class SubmissionType(BaseClass):
pass pass
return cls.execute_query(query=query, limit=limit) return cls.execute_query(query=query, limit=limit)
def to_dict(self):
base_dict = {}
base_dict['info'] = self.construct_info_map(mode='export')
# base_dict['excel location maps']['kits'] = [{k: v for k, v in item.kit_type.construct_xl_map_for_use(submission_type=self)} for item in
# self.submissiontype_kit_associations]
base_dict['samples'] = self.construct_sample_map()
# base_dict['excel location maps']['equipment_roles'] = {k: v for k, v in self.construct_equipment_map()}
base_dict['kits'] = [item.to_export_dict() for item in self.submissiontype_kit_associations]
return base_dict
@check_authorization @check_authorization
def save(self): def save(self):
""" """
@@ -895,6 +940,13 @@ class SubmissionTypeKitTypeAssociation(BaseClass):
limit = query.count() limit = query.count()
return cls.execute_query(query=query, limit=limit) return cls.execute_query(query=query, limit=limit)
def to_export_dict(self):
exclude = ['_sa_instance_state', 'submission_types_id', 'kits_id', 'submission_type', 'kit_type']
base_dict = {k:v for k,v in self.__dict__.items() if k not in exclude}
base_dict['kit_type'] = self.kit_type.to_export_dict(submission_type=self.submission_type)
logger.debug(f"STKTA returning: {base_dict}")
return base_dict
class KitTypeReagentRoleAssociation(BaseClass): class KitTypeReagentRoleAssociation(BaseClass):
""" """
@@ -1008,6 +1060,13 @@ class KitTypeReagentRoleAssociation(BaseClass):
limit = 1 limit = 1
return cls.execute_query(query=query, limit=limit) return cls.execute_query(query=query, limit=limit)
def to_export_dict(self):
base_dict={}
base_dict['required'] = self.required
for k, v in self.reagent_role.to_export_dict().items():
base_dict[k] = v
return base_dict
class SubmissionReagentAssociation(BaseClass): class SubmissionReagentAssociation(BaseClass):
""" """
@@ -1372,10 +1431,10 @@ class EquipmentRole(BaseClass):
match extraction_kit: match extraction_kit:
case str(): case str():
# logger.debug(f"Filtering processes by extraction_kit str {extraction_kit}") # logger.debug(f"Filtering processes by extraction_kit str {extraction_kit}")
processes = [item for item in processes if extraction_kit in [kit.name for kit in item.kit_type]] processes = [item for item in processes if extraction_kit in [kit.name for kit in item.kit_types]]
case KitType(): case KitType():
# logger.debug(f"Filtering processes by extraction_kit KitType {extraction_kit}") # logger.debug(f"Filtering processes by extraction_kit KitType {extraction_kit}")
processes = [item for item in processes if extraction_kit in [kit for kit in item.kit_type]] processes = [item for item in processes if extraction_kit in [kit for kit in item.kit_types]]
case _: case _:
pass pass
output = [item.name for item in processes] output = [item.name for item in processes]
@@ -1384,6 +1443,12 @@ class EquipmentRole(BaseClass):
else: else:
return output return output
def to_export_dict(self, submission_type: SubmissionType, kit_type: KitType):
base_dict = {}
base_dict['role'] = self.name
base_dict['processes'] = self.get_processes(submission_type=submission_type, extraction_kit=kit_type)
return base_dict
class SubmissionEquipmentAssociation(BaseClass): class SubmissionEquipmentAssociation(BaseClass):
""" """
@@ -1492,6 +1557,12 @@ class SubmissionTypeEquipmentRoleAssociation(BaseClass):
def save(self): def save(self):
super().save() super().save()
def to_export_dict(self, kit_type: KitType):
base_dict = dict(static=self.static)
for k, v in self.equipment_role.to_export_dict(submission_type=self.submission_type, kit_type=kit_type).items():
base_dict[k] = v
return base_dict
class Process(BaseClass): class Process(BaseClass):
""" """

View File

@@ -851,7 +851,7 @@ class PydSubmission(BaseModel, extra='allow'):
# logger.debug(f"Template rendered as: {render}") # logger.debug(f"Template rendered as: {render}")
return render return render
@report_result # @report_result
def check_kit_integrity(self, extraction_kit: str | dict | None = None) -> Tuple[List[PydReagent], Report]: def check_kit_integrity(self, extraction_kit: str | dict | None = None) -> Tuple[List[PydReagent], Report]:
""" """
Ensures all reagents expected in kit are listed in Submission Ensures all reagents expected in kit are listed in Submission