diff --git a/docs/images/statistics.png b/docs/images/statistics.png new file mode 100644 index 0000000..55dea3f Binary files /dev/null and b/docs/images/statistics.png differ diff --git a/src/utils/richtext.py b/src/utils/richtext.py index 9ceb250..8da249d 100644 --- a/src/utils/richtext.py +++ b/src/utils/richtext.py @@ -6,22 +6,57 @@ from docx.oxml import OxmlElement from docx.oxml.ns import qn import os from os.path import basename +from loguru import logger as log +import sys + + +logger = log +logger.remove() +logger.add("logs/application.log", rotation="1 week", enqueue=True) +log.add( + f"logs/{datetime.now().strftime('%Y-%m-%d')}.log", + rotation="1 day", + compression="zip", +) + +# logger.add(sys.stderr, format="{time} {level} {message}", level="INFO") +logger.add(sys.stdout) + + +class SemesterError(Exception): + """Custom exception for semester-related errors.""" + + def __init__(self, message): + super().__init__(message) + logger.error(message) + + def __str__(self): + return f"SemesterError: {self.args[0]}" class SemesterDocument: - def __init__(self, apparats: list[tuple[int, str]], semester: str, filename): - assert isinstance(apparats, list), "Apparats must be a list of tuples" - assert all(isinstance(apparat, tuple) for apparat in apparats), ( + def __init__( + self, + apparats: list[tuple[int, str]], + semester: str, + filename, + config, + full: bool = False, + ): + assert isinstance(apparats, list), SemesterError( "Apparats must be a list of tuples" ) - assert all(isinstance(apparat[0], int) for apparat in apparats), ( + assert all(isinstance(apparat, tuple) for apparat in apparats), SemesterError( + "Apparats must be a list of tuples" + ) + assert all(isinstance(apparat[0], int) for apparat in apparats), SemesterError( "Apparat numbers must be integers" ) - assert all(isinstance(apparat[1], str) for apparat in apparats), ( + assert all(isinstance(apparat[1], str) for apparat in apparats), SemesterError( "Apparat names must be strings" ) - assert isinstance(semester, str), "Semester must be a string" - assert "." not in filename and isinstance(filename, str), ( + assert isinstance(semester, str), SemesterError("Semester must be a string") + assert "." not in filename and isinstance(filename, str), SemesterError( "Filename must be a string and not contain an extension" ) self.doc = Document() @@ -35,7 +70,17 @@ class SemesterDocument: self.color_red = RGBColor(255, 0, 0) self.color_blue = RGBColor(0, 0, 255) self.filename = filename - + self.settings = config + if full: + logger.info("Full document generation") + self.make_document() + logger.info("Document created") + self.create_pdf() + logger.info("PDF created") + self.print_document() + logger.info("Document printed") + self.cleanup() + logger.info("Cleanup done") def set_table_border(self, table): """ Adds a full border to the table. @@ -161,8 +206,8 @@ class SemesterDocument: from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication from email.mime.text import MIMEText - from src import settings as config + config = self.settings smtp = config.mail.smtp_server port = config.mail.port sender_email = config.mail.sender @@ -202,7 +247,7 @@ class SemesterDocument: doc.SaveAs(f"{curdir}/{self.filename}.pdf", FileFormat=17) doc.Close() word.Quit() - print("PDF saved") + logger.debug("PDF saved") def cleanup(self): os.remove(f"{self.filename}.docx") @@ -210,14 +255,15 @@ class SemesterDocument: if __name__ == "__main__": - apparat = [(i, f"Item {i}") for i in range(405, 438)] - doc = SemesterDocument( - apparat, - "WiSe 24/25", - "semap", - ) - doc.make_document() - doc.create_pdf() + pass + # apparat = [(i, f"Item {i}") for i in range(405, 438)] + # doc = SemesterDocument( + # apparat, + # "WiSe 24/25", + # "semap", + # ) + # doc.make_document() + # doc.create_pdf() # doc.print_document()