# import copy import os # import sys import glob from lxml import etree import subprocess from datetime import datetime import docing import filing from nitpo import Nitpo from surks import Surks from profile import Profile from xpaths import Xpaths class Chapro(Nitpo): def __init__(self, do_verbose=False): """mail notifications from the web interface""" super().__init__() if not self.has_conf('folders', 'chapro'): raise Exception('chapro needs ะค[folders][chapro]') self.folder = self.conf['folders']['chapro'] self.profile = Profile() self.N = "{%s}" % self.const['ns'] self.surks = Surks() # self.profile = Profile() # self.event = {} self.xpaths = Xpaths() self.emad = None ## mtime of the profile fufi before changes self.mtime = None ## the chapro documnet self.web_ele = None self.do_verbose = do_verbose def dump(self, ele, emad=None): """has to be called before the new profile is saved""" if emad is None: raise Exception("I don't handle a None emad (yet)") self.emad = emad self.web_ele = ele relfi = self.profile.relfi_from_emad(emad) profile_fufi = self.profile.fufi_from_emad(emad) self.mtime = self.add_mtime(profile_fufi) self.fidate = self.add_fidate() digest = self.add_digest() now = self.add_now() out_fufi = self.folder + '/' + relfi string = docing.show(self.web_ele) if self.is_dev(): ## temporary digest = 'aaaaaaaaaaaaaaaaaaaaaa' out_fufi = filing.write_verfi(out_fufi, string, self.folder, dig=digest) self.emad = None self.mtime = None self.web_ele = None return out_fufi def token(self, fufi): bana = os.path.basename(fufi) if bana.endswith('.gz'): bana = bana[0:-3] if bana.endswith('.xml'): bana = bana[0:-4] token = bana[-22:] return token def add_mtime(self, fufi): mtime_ele = self.xpaths.none_or_one(self.web_ele, '/*/n:mtime') if mtime_ele is None: mtime_ele = etree.SubElement(self.web_ele, self.N + 'mtime') mtime = filing.mtime(fufi) mtime_ele.text = mtime self.mtime = mtime return mtime def add_fidate(self): fidate_ele = self.xpaths.none_or_one(self.web_ele, '/*/n:fidate') if fidate_ele is None: fidate_ele = etree.SubElement(self.web_ele, self.N + 'fidate') profile_ele = self.xpaths.none_or_one(self.web_ele, '/n:web/n:profile[1]') fidate = self.surks.get_fidate(profile_ele) fidate_ele.text = fidate return fidate def add_digest(self): digest = filing.digest(self.emad + '_' + self.mtime) digest_ele = self.xpaths.none_or_one(self.web_ele, '/*/n:digest') if digest_ele is None: digest_ele = etree.SubElement(self.web_ele, self.N + 'digest') digest_ele.text = digest return digest def add_now(self): now_ele = self.xpaths.none_or_one(self.web_ele, '/*/n:now') if now_ele is None: now_ele = etree.SubElement(self.web_ele, self.N + 'now') now = self.now() now_ele.text = now return now def get_asar(self): """associative array of chaid and fufis, chaid given in URL""" glob_string = self.folder + '/??????????????????????' asar = {} links = glob.glob(glob_string) for link in links: fufi = self.folder + '/' + os.readlink(link) chaid = link[-22:] asar[chaid] = fufi return asar def read_timeset(self, web_ele): """get as atime to chapros mtime and mtime to fidate""" self.web_ele = web_ele tf = self.const['tf'] mtime_ele = self.xpaths.none_or_one(self.web_ele, '/*/n:mtime') mtime = int(datetime.strptime(mtime_ele.text, tf).strftime("%s")) fidate_ele = self.xpaths.none_or_one(self.web_ele, '/*/n:fidate') fidate = int(datetime.strptime(fidate_ele.text, tf).strftime("%s")) self.web_ele = None return (mtime, fidate) def clear(self, chaid): asar = self.get_asar() if chaid not in asar: return False fufi = asar[chaid] if os.path.isfile(fufi): subprocess.run(f"/bin/gzip {fufi}", shell=True) return True