from pathlib import Path from dotenv import load_dotenv from jinja2 import Environment, select_autoescape, FileSystemLoader from pdfminer.pdfdocument import PDFDocument from pdfminer.pdfparser import PDFParser from config import ( MENU_CRECHE_PDF_URL, MENU_TYPES, SIGNAL_SENDER, SIGNAL_RECIPIENTS, SIGNAL_API_URL, ) from logging_conf import get_logger from menus import Menus, MenuMessageFormatter from message_sender import SignalMessager from pdf_downloader import download from result_file import ResultFile load_dotenv() logger = get_logger(__name__) def read_pdf_metadata(pdf_file: Path): fp = open(pdf_file, "rb") parser = PDFParser(fp) doc = PDFDocument(parser) return doc.info def main(): logger.info(f"Téléchargement du menu à l'adresse {MENU_CRECHE_PDF_URL}...") menu_pdf_file = download(MENU_CRECHE_PDF_URL, file_name="menu.pdf") try: menus = Menus(menu_pdf_file) except IndexError as err: logger.error(err) menus = None logger.info("Extraction des métadonnées du PDF") pdf_metadata = read_pdf_metadata(menu_pdf_file) creation_date = pdf_metadata[0]["CreationDate"].decode("utf-8").removeprefix("D:") modification_date = pdf_metadata[0]["ModDate"].decode("utf-8").removeprefix("D:") logger.debug( f"Le PDF a été créé le {creation_date} et modifié le {modification_date}" ) result_file = ResultFile(Path.home() / ".cache" / "menu_creche.txt") templates_path = Path(__file__).parent / "templates" env = Environment( loader=FileSystemLoader(templates_path), autoescape=select_autoescape() ) message_formatter = MenuMessageFormatter(env) for menu_type in MENU_TYPES: if result_file.was_already_sent(creation_date, modification_date, menu_type): logger.info(f"Le menu {menu_type} du PDF a déjà été envoyé par le passé.") continue logger.debug(f"Création du message à envoyer pour le menu {menu_type}") message = message_formatter.create_message(menus, menu_type) logger.info( f"Envoi du message aux numéros {SIGNAL_RECIPIENTS} de la part de {SIGNAL_SENDER}" ) logger.debug(f"Le message envoyé a pour contenu :\n\n{message}") signal_messager = SignalMessager(SIGNAL_API_URL, SIGNAL_SENDER) signal_messager.send_message(message, menu_pdf_file, SIGNAL_RECIPIENTS) result_file.write(creation_date, modification_date, menu_type) if __name__ == "__main__": main()