Code cleanup for excel.writers complete.

This commit is contained in:
lwark
2025-09-04 14:46:25 -05:00
parent b6e1c0dee2
commit 0c20ade65a
4 changed files with 15 additions and 60 deletions

View File

@@ -1,11 +1,12 @@
"""
Module for default excel writers
"""
from __future__ import annotations
import logging, sys import logging, sys
from datetime import datetime, date from datetime import datetime, date
from pprint import pformat from pprint import pformat
from types import NoneType
from typing import Any, Literal from typing import Any, Literal
from openpyxl.styles import Alignment, PatternFill from openpyxl.styles import Alignment, PatternFill
from openpyxl.utils import get_column_letter
from openpyxl.workbook.workbook import Workbook from openpyxl.workbook.workbook import Workbook
from openpyxl.worksheet.worksheet import Worksheet from openpyxl.worksheet.worksheet import Worksheet
from pandas import DataFrame from pandas import DataFrame
@@ -47,7 +48,6 @@ class DefaultWriter(object):
case _: case _:
value = str(value) value = str(value)
# logger.debug(f"Returning value: {value}")
return value return value
@classmethod @classmethod
@@ -60,7 +60,6 @@ class DefaultWriter(object):
def write_to_workbook(self, workbook: Workbook, sheet: str | None = None, def write_to_workbook(self, workbook: Workbook, sheet: str | None = None,
start_row: int | None = None, *args, **kwargs): start_row: int | None = None, *args, **kwargs):
logger.debug(f"Writing to workbook with {self.__class__.__name__}")
if not start_row: if not start_row:
try: try:
start_row = self.__class__.start_row start_row = self.__class__.start_row
@@ -81,14 +80,11 @@ class DefaultWriter(object):
self.worksheet = self.prewrite(self.worksheet, start_row=start_row) self.worksheet = self.prewrite(self.worksheet, start_row=start_row)
self.start_row = self.delineate_start_row(start_row=start_row) self.start_row = self.delineate_start_row(start_row=start_row)
self.end_row = self.delineate_end_row(start_row=start_row) self.end_row = self.delineate_end_row(start_row=start_row)
logger.debug(f"{self.__class__.__name__} Start row: {self.start_row}, end row: {self.end_row}")
return workbook return workbook
def delineate_start_row(self, start_row: int = 1): def delineate_start_row(self, start_row: int = 1):
logger.debug(f"Attempting to find start row from {start_row}")
for iii, row in enumerate(self.worksheet.iter_rows(min_row=start_row), start=start_row): for iii, row in enumerate(self.worksheet.iter_rows(min_row=start_row), start=start_row):
if all([item.value is None for item in row]): if all([item.value is None for item in row]):
logger.debug(f"Returning {iii} for start row.")
return iii return iii
if self.worksheet.max_row == 1: if self.worksheet.max_row == 1:
return self.worksheet.max_row + 1 return self.worksheet.max_row + 1
@@ -109,7 +105,7 @@ class DefaultWriter(object):
if len(str(cell.value)) > setlen: if len(str(cell.value)) > setlen:
setlen = len(str(cell.value)) setlen = len(str(cell.value))
set_col_width = setlen + 5 set_col_width = setlen + 5
# Setting the column width # Note: Setting the column width
worksheet.column_dimensions[column].width = set_col_width worksheet.column_dimensions[column].width = set_col_width
return worksheet return worksheet
@@ -130,7 +126,6 @@ class DefaultKEYVALUEWriter(DefaultWriter):
@classmethod @classmethod
def check_location(cls, locations: list, sheet: str): def check_location(cls, locations: list, sheet: str):
logger.debug(f"Checking for location against {sheet}")
return any([item['sheet'] == sheet for item in locations]) return any([item['sheet'] == sheet for item in locations])
def write_to_workbook(self, workbook: Workbook, sheet: str | None = None, def write_to_workbook(self, workbook: Workbook, sheet: str | None = None,
@@ -193,7 +188,6 @@ class DefaultTABLEWriter(DefaultWriter):
start_row: int | None = None, *args, **kwargs) -> Workbook: start_row: int | None = None, *args, **kwargs) -> Workbook:
workbook = super().write_to_workbook(workbook=workbook, sheet=sheet, start_row=start_row, *args, **kwargs) workbook = super().write_to_workbook(workbook=workbook, sheet=sheet, start_row=start_row, *args, **kwargs)
self.header_list = self.sort_header_row(list(set(flatten_list([item.fields for item in self.pydant_obj])))) self.header_list = self.sort_header_row(list(set(flatten_list([item.fields for item in self.pydant_obj]))))
logger.debug(f"Header row: {self.header_list}")
self.worksheet = self.write_header_row(worksheet=self.worksheet) self.worksheet = self.write_header_row(worksheet=self.worksheet)
for iii, object in enumerate(self.pydant_obj, start=1): for iii, object in enumerate(self.pydant_obj, start=1):
write_row = self.start_row + iii write_row = self.start_row + iii
@@ -219,7 +213,6 @@ class DefaultTABLEWriter(DefaultWriter):
@classmethod @classmethod
def sort_header_row(cls, header_list: list) -> list: def sort_header_row(cls, header_list: list) -> list:
output = [] output = []
logger.debug(cls.exclude)
for item in cls.header_order: for item in cls.header_order:
if item in [header for header in header_list if header not in cls.exclude]: if item in [header for header in header_list if header not in cls.exclude]:
output.append(header_list.pop(header_list.index(item))) output.append(header_list.pop(header_list.index(item)))

View File

@@ -1,3 +1,6 @@
"""
Module for ClientSubmission writing
"""
from __future__ import annotations from __future__ import annotations
import logging import logging
from pprint import pformat from pprint import pformat
@@ -17,10 +20,8 @@ class ClientSubmissionInfoWriter(DefaultKEYVALUEWriter):
def __init__(self, pydant_obj, *args, **kwargs): def __init__(self, pydant_obj, *args, **kwargs):
super().__init__(pydant_obj=pydant_obj, *args, **kwargs) super().__init__(pydant_obj=pydant_obj, *args, **kwargs)
logger.debug(f"{self.__class__.__name__} recruited!")
def prewrite(self, worksheet: Worksheet, start_row: int) -> Worksheet: def prewrite(self, worksheet: Worksheet, start_row: int) -> Worksheet:
# worksheet.merge_cells(start_row=start_row, start_column=1, end_row=start_row, end_column=4)
worksheet.cell(row=start_row, column=1, value="Submitter Info") worksheet.cell(row=start_row, column=1, value="Submitter Info")
worksheet.cell(row=start_row, column=1).alignment = Alignment(horizontal="center") worksheet.cell(row=start_row, column=1).alignment = Alignment(horizontal="center")
return worksheet return worksheet

View File

@@ -1,14 +1,11 @@
"""
Default
"""
from __future__ import annotations from __future__ import annotations
import logging import logging, sys
import sys
from pprint import pformat from pprint import pformat
from openpyxl.workbook import Workbook from openpyxl.workbook import Workbook
from backend.excel.writers import DefaultKEYVALUEWriter, DefaultTABLEWriter from backend.excel.writers import DefaultKEYVALUEWriter, DefaultTABLEWriter
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from backend.db.models import ProcedureType
logger = logging.getLogger(f"submissions.{__name__}") logger = logging.getLogger(f"submissions.{__name__}")
@@ -25,10 +22,6 @@ class ProcedureInfoWriter(DefaultKEYVALUEWriter):
super().__init__(pydant_obj=pydant_obj, *args, **kwargs) super().__init__(pydant_obj=pydant_obj, *args, **kwargs)
self.fill_dictionary = {k: v for k, v in self.fill_dictionary.items() if k not in self.__class__.exclude} self.fill_dictionary = {k: v for k, v in self.fill_dictionary.items() if k not in self.__class__.exclude}
# logger.debug(pformat(self.fill_dictionary))
# for rng in self.range_dict:
# if "sheet" not in rng or rng['sheet'] == "":
# rng['sheet'] = f"{pydant_obj.proceduretype.name} Quality"
def write_to_workbook(self, workbook: Workbook, sheet: str | None = None, def write_to_workbook(self, workbook: Workbook, sheet: str | None = None,
start_row: int = 1, *args, **kwargs) -> Workbook: start_row: int = 1, *args, **kwargs) -> Workbook:
@@ -48,7 +41,6 @@ class ProcedureReagentWriter(DefaultTABLEWriter):
def write_to_workbook(self, workbook: Workbook, sheet: str | None = None, def write_to_workbook(self, workbook: Workbook, sheet: str | None = None,
start_row: int = 1, *args, **kwargs) -> Workbook: start_row: int = 1, *args, **kwargs) -> Workbook:
logger.debug(self.pydant_obj)
workbook = super().write_to_workbook(workbook=workbook, sheet=self.sheet) workbook = super().write_to_workbook(workbook=workbook, sheet=self.sheet)
return workbook return workbook
@@ -65,7 +57,6 @@ class ProcedureEquipmentWriter(DefaultTABLEWriter):
def write_to_workbook(self, workbook: Workbook, sheet: str | None = None, def write_to_workbook(self, workbook: Workbook, sheet: str | None = None,
start_row: int = 1, *args, **kwargs) -> Workbook: start_row: int = 1, *args, **kwargs) -> Workbook:
logger.debug(self.pydant_obj)
workbook = super().write_to_workbook(workbook=workbook, sheet=self.sheet) workbook = super().write_to_workbook(workbook=workbook, sheet=self.sheet)
return workbook return workbook
@@ -78,11 +69,9 @@ class ProcedureSampleWriter(DefaultTABLEWriter):
def __init__(self, pydant_obj, range_dict: dict | None = None, *args, **kwargs): def __init__(self, pydant_obj, range_dict: dict | None = None, *args, **kwargs):
super().__init__(pydant_obj=pydant_obj, range_dict=range_dict, *args, **kwargs) super().__init__(pydant_obj=pydant_obj, range_dict=range_dict, *args, **kwargs)
self.sheet = f"{self.pydant_obj.proceduretype.name} Quality" self.sheet = f"{self.pydant_obj.proceduretype.name} Quality"
# self.pydant_obj = self.pydant_obj.sample
self.pydant_obj = self.pad_samples_to_length(row_count=pydant_obj.max_sample_rank, mode="procedure") self.pydant_obj = self.pad_samples_to_length(row_count=pydant_obj.max_sample_rank, mode="procedure")
def write_to_workbook(self, workbook: Workbook, sheet: str | None = None, def write_to_workbook(self, workbook: Workbook, sheet: str | None = None,
start_row: int = 1, *args, **kwargs) -> Workbook: start_row: int = 1, *args, **kwargs) -> Workbook:
logger.debug(self.pydant_obj)
workbook = super().write_to_workbook(workbook=workbook, sheet=self.sheet) workbook = super().write_to_workbook(workbook=workbook, sheet=self.sheet)
return workbook return workbook

View File

@@ -1,12 +1,12 @@
"""
"""
from __future__ import annotations from __future__ import annotations
import logging import logging
from pathlib import Path
from pprint import pformat from pprint import pformat
from typing import Generator, TYPE_CHECKING from typing import Generator, TYPE_CHECKING
from openpyxl import Workbook from openpyxl import Workbook
from openpyxl.styles import Alignment from openpyxl.styles import Alignment
from backend.excel.writers import DefaultKEYVALUEWriter, DefaultTABLEWriter from backend.excel.writers import DefaultKEYVALUEWriter, DefaultTABLEWriter
from tools import flatten_list from tools import flatten_list
if TYPE_CHECKING: if TYPE_CHECKING:
@@ -21,26 +21,10 @@ class PCRInfoWriter(DefaultKEYVALUEWriter):
def __init__(self, pydant_obj, proceduretype: "ProcedureType" | None = None, *args, **kwargs): def __init__(self, pydant_obj, proceduretype: "ProcedureType" | None = None, *args, **kwargs):
super().__init__(pydant_obj=pydant_obj, proceduretype=proceduretype, *args, **kwargs) super().__init__(pydant_obj=pydant_obj, proceduretype=proceduretype, *args, **kwargs)
self.fill_dictionary = self.pydant_obj.improved_dict()['result'] self.fill_dictionary = self.pydant_obj.improved_dict()['result']
logger.debug(pformat(self.fill_dictionary))
def write_to_workbook(self, workbook: Workbook, sheet: str | None = None, def write_to_workbook(self, workbook: Workbook, sheet: str | None = None,
start_row: int | None = None, *args, **kwargs) -> Workbook: start_row: int | None = None, *args, **kwargs) -> Workbook:
workbook = super().write_to_workbook(workbook=workbook, sheet=f"{self.proceduretype.name} Results") workbook = super().write_to_workbook(workbook=workbook, sheet=f"{self.proceduretype.name} Results")
# if not start_row:
# try:
# start_row = self.__class__.start_row
# except AttributeError as e:
# logger.error(f"Couldn't get start row due to {e}")
# start_row = 1
# # worksheet = workbook[f"{self.proceduretype.name} Results"]
# self.worksheet = workbook.create_sheet(f"{self.proceduretype.name} Results")
# self.worksheet = self.prewrite(self.worksheet, start_row=start_row)
# # self.start_row = self.delineate_start_row(start_row=start_row)
# # self.end_row = self.delineate_end_row(start_row=start_row)
# # for key, value in self.fill_dictionary['result'].items():
# # # logger.debug(f"Filling in {key} with {value}")
# # self.worksheet.cell(value['location']['row'], value['location']['key_column'], value=key.replace("_", " ").title())
# # self.worksheet.cell(value['location']['row'], value['location']['value_column'], value=value['value'])
return workbook return workbook
@@ -56,7 +40,6 @@ class PCRSampleWriter(DefaultTABLEWriter):
columns.append((iii, header)) columns.append((iii, header))
columns = sorted(columns, key=lambda x: x[0]) columns = sorted(columns, key=lambda x: x[0])
columns = proto_columns + columns columns = proto_columns + columns
# logger.debug(columns)
all_results = flatten_list([[item for item in self.rearrange_results(result)] for result in self.pydant_obj]) all_results = flatten_list([[item for item in self.rearrange_results(result)] for result in self.pydant_obj])
if len(all_results) > 0 : if len(all_results) > 0 :
worksheet.cell(row=header_row, column=1, value="Sample") worksheet.cell(row=header_row, column=1, value="Sample")
@@ -83,21 +66,10 @@ class PCRSampleWriter(DefaultTABLEWriter):
def column_headers(self): def column_headers(self):
output = [] output = []
for item in self.pydant_obj: for item in self.pydant_obj:
# logger.debug(item)
dicto: dict = item.result dicto: dict = item.result
for value in dicto.values(): for value in dicto.values():
if not isinstance(value, dict): if not isinstance(value, dict):
# logger.debug(f"Will not include {value} in column headers.")
continue continue
for key in value.keys(): for key in value.keys():
output.append(key) output.append(key)
return sorted(list(set(output))) return sorted(list(set(output)))