Created Sample verification before import.
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user