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 = """
Datei | Bericht | Schicht |
Stand | Empfänger |
{% for row in reports %}
{{row.Name}} | {{row.Report}} | {{row.Schicht}} |
{{row.Stand}} | {{row.Empfaenger}} |
{% endfor %}
"""
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")