New Excel writer.

This commit is contained in:
lwark
2024-05-06 14:51:47 -05:00
parent 61c1a613e2
commit f30f6403d6
10 changed files with 1003 additions and 430 deletions

View File

@@ -7,13 +7,17 @@ from jinja2 import Template
logger = logging.getLogger(f"submissions.{__name__}")
class RSLNamer(object):
"""
Object that will enforce proper formatting on RSL plate names.
"""
def __init__(self, filename:str, sub_type:str|None=None, data:dict|None=None):
def __init__(self, filename: str, sub_type: str | None = None, data: dict | None = None):
# NOTE: Preferred method is path retrieval, but might also need validation for just string.
filename = Path(filename) if Path(filename).exists() else filename
self.submission_type = sub_type
if self.submission_type == None:
if self.submission_type is None:
# logger.debug("Creating submission type because none exists")
self.submission_type = self.retrieve_submission_type(filename=filename)
logger.debug(f"got submission type: {self.submission_type}")
@@ -21,14 +25,14 @@ class RSLNamer(object):
# logger.debug("Retrieving BasicSubmission subclass")
enforcer = BasicSubmission.find_polymorphic_subclass(polymorphic_identity=self.submission_type)
self.parsed_name = self.retrieve_rsl_number(filename=filename, regex=enforcer.get_regex())
if data == None:
if data is None:
data = dict(submission_type=self.submission_type)
if "submission_type" not in data.keys():
data['submission_type'] = self.submission_type
self.parsed_name = enforcer.enforce_name(instr=self.parsed_name, data=data)
@classmethod
def retrieve_submission_type(cls, filename:str|Path) -> str:
def retrieve_submission_type(cls, filename: str | Path) -> str:
"""
Gets submission type from excel file properties or sheet names or regex pattern match or user input
@@ -37,7 +41,7 @@ class RSLNamer(object):
Returns:
str: parsed submission type
"""
"""
match filename:
case Path():
logger.debug(f"Using path method for {filename}.")
@@ -47,8 +51,8 @@ class RSLNamer(object):
submission_type = [item.strip().title() for item in wb.properties.category.split(";")][0]
except AttributeError:
try:
sts = {item.name:item.get_template_file_sheets() for item in SubmissionType.query()}
for k,v in sts.items():
sts = {item.name: item.get_template_file_sheets() for item in SubmissionType.query()}
for k, v in sts.items():
# This gets the *first* submission type that matches the sheet names in the workbook
if wb.sheetnames == v:
submission_type = k.title()
@@ -69,28 +73,30 @@ class RSLNamer(object):
case _:
submission_type = None
try:
check = submission_type == None
check = submission_type is None
except UnboundLocalError:
check = True
if check:
# logger.debug("Final option, ask the user for submission type")
from frontend.widgets import ObjectSelector
dlg = ObjectSelector(title="Couldn't parse submission type.", message="Please select submission type from list below.", obj_type=SubmissionType)
dlg = ObjectSelector(title="Couldn't parse submission type.",
message="Please select submission type from list below.", obj_type=SubmissionType)
if dlg.exec():
submission_type = dlg.parse_form()
submission_type = submission_type.replace("_", " ")
return submission_type
@classmethod
def retrieve_rsl_number(cls, filename:str|Path, regex:str|None=None):
def retrieve_rsl_number(cls, filename: str | Path, regex: str | None = None):
"""
Uses regex to retrieve the plate number and submission type from an input string
Args:
in_str (str): string to be parsed
"""
regex (str): string to construct pattern
filename (str): string to be parsed
"""
logger.debug(f"Input string to be parsed: {filename}")
if regex == None:
if regex is None:
regex = BasicSubmission.construct_regex()
else:
regex = re.compile(rf'{regex}', re.IGNORECASE | re.VERBOSE)
@@ -102,19 +108,19 @@ class RSLNamer(object):
logger.debug(f"Using string method.")
m = regex.search(filename)
case _:
pass
if m != None:
m = None
if m is not None:
try:
parsed_name = m.group().upper().strip(".")
except:
parsed_name = None
else:
else:
parsed_name = None
logger.debug(f"Got parsed submission name: {parsed_name}")
return parsed_name
@classmethod
def construct_new_plate_name(cls, data:dict) -> str:
def construct_new_plate_name(cls, data: dict) -> str:
"""
Make a brand new plate name from submission data.
@@ -123,7 +129,7 @@ class RSLNamer(object):
Returns:
str: Output filename
"""
"""
if "submitted_date" in data.keys():
if isinstance(data['submitted_date'], dict):
if data['submitted_date']['value'] != None:
@@ -144,9 +150,9 @@ class RSLNamer(object):
previous = BasicSubmission.query(start_date=today, end_date=today, submission_type=data['submission_type'])
plate_number = len(previous) + 1
return f"RSL-{data['abbreviation']}-{today.year}{str(today.month).zfill(2)}{str(today.day).zfill(2)}-{plate_number}"
@classmethod
def construct_export_name(cls, template:Template, **kwargs) -> str:
def construct_export_name(cls, template: Template, **kwargs) -> str:
"""
Make export file name from jinja template. (currently unused)
@@ -155,11 +161,13 @@ class RSLNamer(object):
Returns:
str: output file name.
"""
"""
logger.debug(f"Kwargs: {kwargs}")
logger.debug(f"Template: {template}")
environment = jinja_template_loading()
template = environment.from_string(template)
return template.render(**kwargs)
from .pydant import *
from .pydant import PydSubmission, PydKit, PydContact, PydOrganization, PydSample, PydReagent, PydReagentType, \
PydEquipment, PydEquipmentRole