80 lines
3.5 KiB
Python
80 lines
3.5 KiB
Python
"""
|
|
A pane to show info e.g. cost reports and turnaround times.
|
|
"""
|
|
from datetime import date, datetime
|
|
from PyQt6.QtCore import QSignalBlocker
|
|
from PyQt6.QtWebEngineWidgets import QWebEngineView
|
|
from PyQt6.QtWidgets import QWidget, QGridLayout
|
|
from tools import Report, report_result, Result
|
|
from .misc import StartEndDatePicker
|
|
from .functions import select_save_file, save_pdf
|
|
import logging
|
|
|
|
logger = logging.getLogger(f"submissions.{__name__}")
|
|
|
|
|
|
class InfoPane(QWidget):
|
|
|
|
def __init__(self, parent: QWidget) -> None:
|
|
super().__init__(parent)
|
|
self.app = self.parent().parent()
|
|
self.report = Report()
|
|
self.datepicker = StartEndDatePicker(default_start=-180)
|
|
self.webview = QWebEngineView()
|
|
self.datepicker.start_date.dateChanged.connect(self.update_data)
|
|
self.datepicker.end_date.dateChanged.connect(self.update_data)
|
|
self.layout = QGridLayout(self)
|
|
self.layout.addWidget(self.datepicker, 0, 0, 1, 2)
|
|
# NOTE: Placed in lower row to allow for addition of custom rows.
|
|
self.layout.addWidget(self.webview, 5, 0, 1, 4)
|
|
self.setLayout(self.layout)
|
|
|
|
@report_result
|
|
def update_data(self, *args, **kwargs):
|
|
report = Report()
|
|
# self.start_date = self.datepicker.start_date.date().toPyDate()
|
|
# self.end_date = self.datepicker.end_date.date().toPyDate()
|
|
self.start_date = self.datepicker.start_date.date().toPyDate()
|
|
self.end_date = self.datepicker.end_date.date().toPyDate()
|
|
logger.debug(f"Start date: {self.start_date}, End date: {self.end_date}")
|
|
if self.datepicker.start_date.date() > self.datepicker.end_date.date():
|
|
lastmonth = self.datepicker.end_date.date().addDays(-31)
|
|
msg = f"Start date after end date is not allowed! Setting to {lastmonth.toString()}."
|
|
logger.warning(msg)
|
|
# NOTE: block signal that will rerun controls getter and set start date without triggering this function again
|
|
with QSignalBlocker(self.datepicker.start_date) as blocker:
|
|
self.datepicker.start_date.setDate(lastmonth)
|
|
self.update_data()
|
|
report.add_result(Result(owner=self.__str__(), msg=msg, status="Warning"))
|
|
return report
|
|
|
|
@classmethod
|
|
def diff_month(self, d1: date, d2: date) -> float:
|
|
"""
|
|
Gets the number of months difference between two different dates
|
|
|
|
Args:
|
|
d1 (date): Start date.
|
|
d2 (date): End date.
|
|
|
|
Returns:
|
|
float: Number of months difference
|
|
"""
|
|
return abs((d1.year - d2.year) * 12 + d1.month - d2.month)
|
|
|
|
def save_excel(self):
|
|
fname = select_save_file(self, default_name=f"{self.__class__.__name__} Report {self.start_date.strftime('%Y%m%d')} - {self.end_date.strftime('%Y%m%d')}", extension="xlsx")
|
|
self.report_obj.write_report(fname, obj=self)
|
|
|
|
def save_pdf(self):
|
|
fname = select_save_file(obj=self,
|
|
default_name=f"{self.__class__.__name__} Report {self.start_date.strftime('%Y%m%d')} - {self.end_date.strftime('%Y%m%d')}",
|
|
extension="pdf")
|
|
save_pdf(obj=self.webview, filename=fname)
|
|
|
|
def save_png(self):
|
|
fname = select_save_file(obj=self,
|
|
default_name=f"Plotly {self.start_date.strftime('%Y%m%d')} - {self.end_date.strftime('%Y%m%d')}",
|
|
extension="png")
|
|
self.fig.write_image(fname.absolute().__str__(), engine="kaleido")
|