Created Sample verification before import.

This commit is contained in:
lwark
2025-03-27 15:02:18 -05:00
parent f215972b9d
commit e355aee5de
9 changed files with 179 additions and 416 deletions

View File

@@ -714,7 +714,6 @@ class BasicSubmission(BaseClass, LogMixin):
# logger.debug(f"Returning regex: {regex}")
return regex
# NOTE: Polymorphic functions
@classproperty
@@ -1130,13 +1129,13 @@ class BasicSubmission(BaseClass, LogMixin):
case date():
pass
case datetime():
end_date = end_date# + timedelta(days=1)
end_date = end_date # + timedelta(days=1)
# pass
case int():
end_date = datetime.fromordinal(datetime(1900, 1, 1).toordinal() + end_date - 2).date()# \
# + timedelta(days=1)
end_date = datetime.fromordinal(datetime(1900, 1, 1).toordinal() + end_date - 2).date() # \
# + timedelta(days=1)
case _:
end_date = parse(end_date).date()# + timedelta(days=1)
end_date = parse(end_date).date() # + timedelta(days=1)
# end_date = end_date.strftime("%Y-%m-%d")
start_date = datetime.combine(start_date, datetime.min.time()).strftime("%Y-%m-%d %H:%M:%S.%f")
end_date = datetime.combine(end_date, datetime.max.time()).strftime("%Y-%m-%d %H:%M:%S.%f")
@@ -1224,10 +1223,11 @@ class BasicSubmission(BaseClass, LogMixin):
else:
from frontend.widgets.pop_ups import QuestionAsker
logger.warning(f"Found existing instance: {instance}, asking to overwrite.")
# code = 1
# msg = "This submission already exists.\nWould you like to overwrite?"
# report.add_result(Result(msg=msg, code=code))
dlg = QuestionAsker(title="Overwrite?", message="This submission already exists.\nWould you like to overwrite?")
# code = 1
# msg = "This submission already exists.\nWould you like to overwrite?"
# report.add_result(Result(msg=msg, code=code))
dlg = QuestionAsker(title="Overwrite?",
message="This submission already exists.\nWould you like to overwrite?")
if dlg.exec():
pass
else:
@@ -1529,10 +1529,23 @@ class BacterialCulture(BasicSubmission):
main_sheet = xl[lookup_table['sheet']]
for row in main_sheet.iter_rows(min_row=lookup_table['start_row'], max_row=lookup_table['end_row']):
idx = row[0].row
sample = dict(submitter_id=main_sheet.cell(row=idx, column=lookup_table['sample_columns']['submitter_id']).value)
sample['concentration'] = main_sheet.cell(row=idx, column=lookup_table['sample_columns']['concentration']).value
sample = dict(
submitter_id=main_sheet.cell(row=idx, column=lookup_table['sample_columns']['submitter_id']).value)
sample['concentration'] = main_sheet.cell(row=idx,
column=lookup_table['sample_columns']['concentration']).value
yield sample
def get_provisional_controls(self):
if self.controls:
provs = (control.sample for control in self.controls)
else:
regex = re.compile(r"^(ATCC)|(MCS)|(EN)")
provs = (sample for sample in self.samples if bool(regex.match(sample.submitter_id)))
for prov in provs:
prov.submission = self.rsl_plate_num
prov.submitted_date = self.submitted_date
yield prov
class Wastewater(BasicSubmission):
"""
@@ -1827,7 +1840,7 @@ class WastewaterArtic(BasicSubmission):
artic_date = Column(TIMESTAMP) #: Date Artic Performed
ngs_date = Column(TIMESTAMP) #: Date submission received
gel_date = Column(TIMESTAMP) #: Date submission received
gel_barcode = Column(String(16)) #: Identifier for the used gel.
gel_barcode = Column(String(16)) #: Identifier for the used gel.
__mapper_args__ = dict(polymorphic_identity="Wastewater Artic",
polymorphic_load="inline",
@@ -2767,10 +2780,14 @@ class BacterialCultureSample(BasicSample):
sample = super().to_sub_dict(full_data=full_data)
sample['name'] = self.submitter_id
sample['organism'] = self.organism
sample['concentration'] = self.concentration
try:
sample['concentration'] = f"{float(self.concentration):.2f}"
except TypeError:
sample['concentration'] = 0.0
if self.control is not None:
sample['colour'] = [0, 128, 0]
target = next((v for k,v in self.control.controltype.targets.items() if k == self.control.subtype), "Not Available")
target = next((v for k, v in self.control.controltype.targets.items() if k == self.control.subtype),
"Not Available")
try:
target = ", ".join(target)
except:

View File

@@ -202,19 +202,21 @@ class ConcentrationMaker(ReportArchetype):
# NOTE: Set page size to zero to override limiting query size.
self.subs = BasicSubmission.query(start_date=start_date, end_date=end_date,
submission_type_name=submission_type, page_size=0)
self.controls = list(itertools.chain.from_iterable([sub.controls for sub in self.subs]))
# self.known_controls = list(itertools.chain.from_iterable([sub.controls for sub in self.subs]))
self.controls = list(itertools.chain.from_iterable([sub.get_provisional_controls() for sub in self.subs]))
self.records = [self.build_record(control) for control in self.controls]
self.df = DataFrame.from_records(self.records)
self.sheet_name = "Concentration"
@classmethod
def build_record(cls, control: IridaControl) -> dict:
positive = control.is_positive_control
concentration = control.sample.concentration
if not concentration:
concentration = 0
return dict(name=control.name,
submission=str(control.submission.rsl_plate_num), concentration=concentration,
def build_record(cls, control) -> dict:
positive = not control.submitter_id.lower().startswith("en")
try:
concentration = float(control.concentration)
except (TypeError, ValueError):
concentration = 0.0
return dict(name=control.submitter_id,
submission=str(control.submission), concentration=concentration,
submitted_date=control.submitted_date, positive=positive)

View File

@@ -195,16 +195,6 @@ class PydSample(BaseModel, extra='allow'):
pass
return value
def improved_dict(self) -> dict:
"""
Constructs a dictionary consisting of model.fields and model.extras
Returns:
dict: Information dictionary
"""
fields = list(self.model_fields.keys()) + list(self.model_extra.keys())
return {k: getattr(self, k) for k in fields}
@report_result
def to_sql(self, submission: BasicSubmission | str = None) -> Tuple[
BasicSample, List[SubmissionSampleAssociation], Result | None]:
@@ -1010,6 +1000,18 @@ class PydSubmission(BaseModel, extra='allow'):
for r in worksheet.rows:
c.writerow([cell.value for cell in r])
@property
def sample_list(self) -> List[dict]:
samples = []
for sample in self.samples:
sample = sample.improved_dict()
sample['row'] = sample['row'][0]
sample['column'] = sample['column'][0]
sample['submission_rank'] = sample['submission_rank'][0]
samples.append(sample)
samples = sorted(samples, key=itemgetter("submission_rank"))
return samples
class PydContact(BaseModel):
name: str