"""announcements to reporters""" from datetime import datetime import glob import random import sys import time from lxml.builder import ElementMaker from lxml import etree import docing import filing from emailer import Emailer from nitpo import Nitpo from kapro import Kapro from sheets import Sheets from profile import Profile class Selan(Nitpo): def __init__(self, do_verbose=False): super().__init__() # a basename for the thing to send self.base = None # current repcode self.date = None # state variable for the current fufi self.selan_fufi = None self.emailer = Emailer(do_verbose=do_verbose) self.sheets = Sheets(do_verbose=do_verbose) self.kapro = Kapro(do_verbose=do_verbose) self.profile = Profile() self.report_docs = {} self.empro = None self.maix_only = False # self.N = {'n': self.const['ns']} self.N = "{%s}" % self.const['ns'] self.E = ElementMaker(nsmap={None: self.const['ns']}) if not self.has_conf('folders', 'mail'): raise Exception("I need a 'mail' folder.") #self.do_verbose = do_verbose def run(self, empro, dont_send=True, send_only_emad=None, do_pause=100, maix_only=False): if maix_only: self.maix_only = True else: self.maix_only = False if not self.has_conf('folders', 'selan'): print("I need a selan folder configured.") quit() if not self.emailer.has_it_empro(empro): print(f"selan has no empro {empro}") return None self.collect() self.empro = empro emads = list(self.report_docs) random.shuffle(emads) for emad in emads: if send_only_emad is not None: if emad != send_only_emad: continue self.send(emad, self.report_docs[emad], dont_send=dont_send) if send_only_emad is not None: return True time.sleep(do_pause) return True def collect(self): """collect the input from the reports""" if not self.has_conf('folders', 'reports'): print("selan: I see no reports directory.") sys.exit(0) reports_fudi = self.conf['folders']['reports'] reports_glob = reports_fudi + '/*' for report_fufi in glob.glob(reports_glob): if report_fufi.endswith('~'): continue test_fufi = report_fufi if report_fufi.endswith('.gz'): test_fufi = report_fufi[:-3] if self.has_conf('ext', 'report') and \ not test_fufi.endswith(self.conf['ext']['report']): continue repdoc = filing.parse_lax(report_fufi) emads = str(self.sheets.get_result('orimas', repdoc)) emad = emads.split('\n')[0].lower() reports_ele = self.get_reports_ele(emad) report_doc = filing.parse_lax(report_fufi) doc_ele = report_doc.getroot() doc_ele.attrib['now'] = datetime.today().strftime(self.const['tf']) report_ele = etree.SubElement(reports_ele, self.N + 'report') report_ele.append(doc_ele) # # now make documents. It's not an elegant way I know for emad in self.report_docs: # print(docing.show(self.report_docs[emad])) self.report_docs[emad] = self.report_docs[emad].getroottree() def get_reports_ele(self, emad): if emad not in self.report_docs: reports_ele = self.E(self.N + 'reports') reports_ele.attrib['emad'] = emad self.report_docs[emad] = reports_ele return self.report_docs[emad] def send(self, emad, doc, dont_send=False): relfi = self.profile.relfi_from_emad(emad) if relfi is None: print(f"selan cant see a relfi for '{emad}'") return False relfi = self.profile.relfi_from_emad(emad)[:-4] base = self.empro + '/' + relfi if self.maix_only: out_fufi = self.conf['folders']['mail'] + '/' + base + '.xml' print(f"selan: {emad} {out_fufi}") filing.install_xml(doc.getroot(), out_fufi) return None if self.empro.endswith('_test'): out_fufi = '/tmp/selan.xml' print(f"selan: I write {out_fufi}") filing.install_xml(doc.getroot(), out_fufi) ## had in_what=selan print("selan: call emailer") out = self.emailer.prepare(doc, dont_send=dont_send, empro=self.empro, base=base) return out