import os import json import datetime as dt import sys import lxml.etree from lxml import etree import win32com.client as win32 from aktion_status import AktionsStatus class App: def __init__(self): self._hide_elements = [] self._path = None self._endline = "\n" self._prefix = "\t" self._delimiter = "\t" self._convert_date = False self._send_outlook = False self._attach_file = False self._text = None self._print_console = True self._autoremove = True self._read_config() if len(sys.argv) > 1: self._path = sys.argv[1] if os.path.isfile(self._path): self.read_xml(self._path) else: files = [file for file in os.listdir(self._path) if os.path.isfile(self._path + os.path.sep + file)] for file in files: self.read_xml(self._path + os.path.sep + file) def read_xml(self, path, hide_empty=True): self._text = "" with open(path, encoding="utf-8") as xml_file: head = xml_file.readline() xml = xml_file.read() root = etree.fromstring(xml) for data in root.getchildren(): for elem in data.getchildren(): self._read_element(elem, hide_empty=hide_empty) if self._send_outlook: outlook = win32.gencache.EnsureDispatch('Outlook.Application') new_mail = outlook.CreateItem(0) new_mail.Subject = "" new_mail.Body = self._text if self._attach_file: abs_path = os.path.abspath(path) new_mail.Attachments.Add(Source=abs_path) new_mail.Display(True) if self._autoremove: os.remove(path) def _read_element(self, element, sign="", hide_empty=True): element_text = element.text if (hide_empty and not element_text or isinstance(element, lxml.etree._Comment) or isinstance(element, lxml.etree._ProcessingInstruction) or element.tag in self._hide_elements): pass elif element.tag.find("AKTION") > -1: num = int(element_text) self._print(sign, self._clean_xmlns(element.tag), self._delimiter, AktionsStatus.get_status(num), end=self._endline) elif self._convert_date and element.tag.find("ZEIT") > -1: time = dt.datetime.strptime(element_text, "%H%M%S") uhrzeit = time.strftime("%H:%M:%S") self._print(sign, self._clean_xmlns(element.tag), self._delimiter, uhrzeit, end=self._endline) elif self._convert_date and element.tag.find("NKDATUM") > -1: date = dt.datetime.strptime(element_text, "%Y%m%d") datum = date.strftime("%d.%m.%Y") self._print(sign, self._clean_xmlns(element.tag), self._delimiter, datum, end=self._endline) elif self._convert_date and element.tag.find("AUFTRDATUM") > -1: date = dt.datetime.strptime(element_text, "%Y%m%d") datum = date.strftime("%d.%m.%Y") self._print(sign, self._clean_xmlns(element.tag), self._delimiter, datum, end=self._endline) else: self._print(sign, self._clean_xmlns(element.tag), self._delimiter, element.text if element.text else "", end=self._endline) if len(element.getchildren()) > 0: for el in element.getchildren(): self._read_element(el, sign + self._prefix) def _print(self, *args, **kwargs): if self._send_outlook: line = "" for arg in args: line += str(arg) line = line + self._endline self._text += line if self._print_console: print(*args, **kwargs) def _clean_xmlns(self, tag_text): if tag_text and tag_text.startswith("{"): return tag_text.split("}")[1] return tag_text def _read_config(self): with open('config.json', 'r') as json_file: json_raw = json.load(json_file) self._path = json_raw.get('path') for element in json_raw.get('hide-elements'): self._hide_elements.append(element) endline = json_raw.get('endline') if endline: self._endline = endline prefix = json_raw.get('prefix') if prefix: self._prefix = prefix delimiter = json_raw.get('delimiter') if delimiter: self._delimiter = delimiter convert = json_raw.get('convert-date') if convert: self._convert_date = convert console = json_raw.get('print-console') if console is not None: self._print_console = console if json_raw.get("outlook"): outlook = json_raw.get('outlook') send = outlook.get('send') attach = outlook.get('attach-file') if send: self._send_outlook = send if attach: self._attach_file = attach autoremove = json_raw.get("autoremove") if autoremove is not None: self._autoremove = autoremove