from flask import render_template, request, jsonify from www import app import json, logging, os, glob from lxml import etree as et import config def list_all(d, ext): if not os.path.isdir(d): logging.error(d + " is not a valid directory.") return None return [os.path.basename(f) for f in glob.glob(os.path.join(d, "*." + ext))] def read_xml(d, fn): fp = os.path.join(d, fn) if not os.path.isfile(fp): return None root = et.parse(fp).getroot() xml_data = [] for m in root.findall('mails/mail'): nbr_str = m.find('nbr').text date_str = m.find('date').text from_str = m.find('from').text subject_str = m.find('subject').text xml_data.append({'nbr': nbr_str, 'date': date_str, 'from': from_str, 'subject': subject_str}) # sort xml_data[:] = sorted(xml_data, key=lambda x: parse_nbr_xml(x['nbr'])) return xml_data def parse_nbr_xml(nbr_str): if '-' in nbr_str: nbr_str = nbr_str.split('-')[0] # split number and return a tuple # ex. 15.4 -> (15, 4) tok = nbr_str.split('.') tup = (int(tok[0]), int(tok[1])) return tup def update_nbr_xml(d, fn, nbr, new_nbr, date): fp = os.path.join(d, fn) if not os.path.isfile(fp): return False tr = et.parse(fp) m = tr.xpath(".//nbr[text()='" + nbr + "']") if m is None: return False mm = None for k in m: if k.getparent().find('date').text == date: mm = k break if mm is None: return False # replace nbr mm.text = new_nbr # order all mails according to their nbr mails = tr.find('mails') mails[:] = sorted(mails, key=lambda x: parse_nbr_xml(x.find('nbr').text)) tr.write(fp) return True def delete_nbr_xml(d, fn, nbr, date): fp = os.path.join(d, fn) if not os.path.isfile(fp): return False tr = et.parse(fp) m = tr.xpath(".//nbr[text()='" + nbr + "']") if m is None: return False mm = None for k in m: if k.getparent().find('date').text == date: mm = k break if mm is None: return False mail = mm.getparent() mail.getparent().remove(mail) tr.write(fp) return True @app.route('/') def index(): return render_template("index.html") @app.route('/xml', methods = ['GET', 'POST']) def xml(): if request.method == 'GET': li = list_all(config.xml['path'], 'xml') li = sorted(li, key=lambda x: int(x.split('.')[0])) return render_template("xml_all.html", files=li) @app.route('/xml/', methods = ['GET', 'POST']) def xmlfn(fn): if request.method == 'GET': data = read_xml(config.xml['path'], fn) if data is not None: return render_template("xml.html", fn=fn, data=data) else: return "File: " + fn + "does not exist." elif request.method == 'POST': data = request.form a = data.get('action') if a == "update": logging.info("POST UPDATE " + fn + " -- " + data.get('nbr') + " ++ " + data.get('new_nbr')) if update_nbr_xml(config.xml['path'], fn, data.get('nbr'), data.get('new_nbr'), data.get('date')): return "ok" elif a == "delete": logging.info("POST DELETE " + fn + " -- " + data.get('nbr')) if delete_nbr_xml(config.xml['path'], fn, data.get('nbr'), data.get('date')): return "ok" return "-"