import csv from datetime import datetime from itertools import groupby from pathlib import Path import jinja2 from mail import mail import config cfg = config.Config("GAPS3.ini") html = """ {% for row in reports %} {% endfor %}
DateiBerichtSchicht StandEmpfänger
{{row.Name}}{{row.Report}}{{row.Schicht}} {{row.Stand}}{{row.Empfaenger}}
""" def dispatch(xml_filename, recipient=None, report=None, cube=None): publish_subdir = config.joinpath(cfg.cognos7.publish_dir, xml_filename[:-4]) with open(cfg.xml_dir + "/info/versand.csv", "r") as frh: csv_reader = csv.DictReader(frh, delimiter=";") dispatch_list = [x for x in csv_reader] def dispatch_filter(x): return all( [ x["Datei"].lower() == xml_filename, x["Versand"] == "J", (recipient is None or x["Empfaenger"] == recipient), (report is None or x["Report"].lower() == report.lower()), (cube is None or x["Cube"].lower() == cube.lower()), ] ) dispatch_list = list(filter(dispatch_filter, dispatch_list)) dispatch_group = groupby(dispatch_list, lambda x: x["Report"] + "_" + x["PDF-Schicht"]) report_mails = {} for k, v in dispatch_group: report_mails[k] = "
".join([x["Empfaenger"] for x in v]) template = jinja2.Template(html) mail_batch = [] for group_name, v in groupby(dispatch_list, lambda x: x["Empfaenger"]): group_filenames = [] d_group = list(v) for row in d_group: ext = ".xls" if row["XLS"] == "J" else ".pdf" filename = f"{publish_subdir}/{row['Report']}_{row['PDF-Schicht']}{ext}" row["Empfaenger"] = report_mails[row["Report"] + "_" + row["PDF-Schicht"]] row["Dateiname"] = [] row["Stand"] = "nicht verfügbar" row["Schicht"] = row["PDF-Schicht"] if row["PDF-Schicht"] != "0" else "komplett" if Path(filename).exists(): mtime = datetime.fromtimestamp(Path(filename).stat().st_mtime) row["Stand"] = mtime.strftime("%d.%m.%Y, %H:%M") if (datetime.now() - mtime).total_seconds() <= 60 * 60 * 12: row["Dateiname"].append((row["Name"] + ext, filename)) group_filenames.append((row["Name"] + ext, filename)) if cfg.versand_separat: mail_batch.append((group_name, row["Name"], template.render(reports=[row]), row["Dateiname"])) if not cfg.versand_separat: mail_batch.append((group_name, "GAPS-Versand", template.render(reports=d_group), group_filenames)) return mail_batch def send_mail(mail_batch): with mail(cfg) as m: for e in mail_batch: m.send(*e) def main(xml_filename, recipient=None, report=None, cube=None): xml_filename = xml_filename.lower() if xml_filename[-4:] != ".xml": xml_filename = xml_filename + ".xml" mail_batch = dispatch(xml_filename, recipient, report, cube) for m in mail_batch: print(m[0]) send_mail([mail_batch[0]]) if __name__ == "__main__": main("GAPS_Vers_Tag", "robert.bedner@gmail.com")