#!/usr/bin/python3 import datetime import os from lxml import etree import filer from nitpo import Nitpo class Kapro(Nitpo): def __init__(self, do_verbose=False): """subscription krapos""" super().__init__() ns = self.const['ns'] self.nsmap = {None: ns} self.N = "{%s}" % self.const['ns'] self.check_conf('folders', 'profile') self.check_conf('folders', 'kapro') self.to_print = '' self.event = {} self.d = {} self.dirs = {} self.dirs['profile'] = self.conf['folders']['profile'] self.dirs['kapro'] = self.conf['folders']['kapro'] self.parser = etree.XMLParser(remove_blank_text=True) self.start_time = datetime.datetime.now().timestamp() self.do_verbose = do_verbose def all(self): """do all reports from scratch""" for root, dirs, banas in os.walk(self.dirs['profile']): for bana in banas: if(bana.endswith(".xml.gz")): continue fufi = root + '/' + bana doc = etree.parse(fufi, self.parser) self.get_all(doc) self.dump_all() def dump_all(self): for repcode in self.d: self.dump(repcode) def dump(self, repcode): out_fufi = self.get_fufi(repcode) filer.dump(out_fufi, self.d[repcode]) os.utime(out_fufi, (self.start_time, self.start_time)) def get_all(self, doc): xp = '/n:profile/n:live/n:surk' surk_eles = doc.xpath(xp, namespaces={'n': self.const['ns']}) if len(surk_eles) == 0: return xp = '/n:profile/@emad' emad = doc.xpath(xp, namespaces={'n': self.const['ns']})[0] for surk_ele in surk_eles: self.from_surk(surk_ele, emad) def from_surk(self, surk_ele, emad): repcode = surk_ele.attrib['repcode'] if repcode not in self.d: self.d[repcode] = {} self.d[repcode][emad] = surk_ele.attrib['spro'] def start(self, repcode): """start a kapro with no data""" self.d[repcode] = {} self.dump(repcode) def get_fufi(self, repcode): out_fufi = self.dirs['kapro'] + '/' + repcode + '.json.gz' return out_fufi def update(self, repcode): """update for a report""" out_fufi = self.get_fufi(repcode) out_time = os.path.getmtime(out_fufi) fufis = [] for root, dirs, banas in os.walk(self.dirs['profile']): for bana in banas: fufi = root + '/' + bana if(os.path.getmtime(fufi) < out_time): continue # print(f"I have to read {fufi}") fufis.append(fufi) if len(fufis) == 0: if self.do_verbose: print(f"kapro found no files to update for {repcode}") return False self.indat = filer.load(out_fufi) self.repcode = repcode count_updates = 0 for fufi in fufis: needs_update = self.update_for_fufi(fufi) count_updates += needs_update print(count_updates) self.indat = None self.repcode = None def update_for_fufi(self, fufi): doc = etree.parse(fufi) # print(etree.tostring(doc, pretty_print=True).decode()) xp = f"/n:profile/n:live/n:surk[@repcode={self.repcode}]" print(xp) surk_eles = doc.xpath(xp, namespaces={'n': self.const['ns']}) print(len(surk_eles)) emad = self.emad_from_doc(doc) if len(surk_eles) == 0: if emad not in self.indat: return 0 print(f"del {emad}") del self.indat[emad] return 1 if len(surk_eles) == 1: if emad in self.indat: return 0 print(f"add {emad}") surk_ele = surk_eles[0] self.indat[emad] = surk_ele.attrib['spro'] return 1 def emad_from_doc(self, doc): """should move to prodo""" xp = '@emad' emad = doc.xpath(xp, namespaces={'n': self.const['ns']})[0] return emad