2020-01-14 10:11:58 +01:00
|
|
|
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})
|
|
|
|
|
|
2020-01-15 15:56:23 +01:00
|
|
|
# sort
|
|
|
|
|
xml_data[:] = sorted(xml_data, key=lambda x: parse_nbr_xml(x['nbr']))
|
2020-01-14 10:11:58 +01:00
|
|
|
return xml_data
|
|
|
|
|
|
|
|
|
|
|
2020-01-15 15:56:23 +01:00
|
|
|
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):
|
2020-01-14 10:11:58 +01:00
|
|
|
fp = os.path.join(d, fn)
|
|
|
|
|
if not os.path.isfile(fp):
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
tr = et.parse(fp)
|
|
|
|
|
m = tr.xpath(".//nbr[text()='" + nbr + "']")
|
|
|
|
|
|
2020-01-15 15:56:23 +01:00
|
|
|
if m is None:
|
2020-01-14 10:11:58 +01:00
|
|
|
return False
|
|
|
|
|
|
2020-01-15 15:56:23 +01:00
|
|
|
mm = None
|
|
|
|
|
for k in m:
|
|
|
|
|
if k.getparent().find('date').text == date:
|
|
|
|
|
mm = k
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
if mm is None:
|
|
|
|
|
return False
|
2020-01-14 10:11:58 +01:00
|
|
|
|
|
|
|
|
# replace nbr
|
2020-01-15 15:56:23 +01:00
|
|
|
mm.text = new_nbr
|
2020-01-14 10:11:58 +01:00
|
|
|
|
|
|
|
|
# order all mails according to their nbr
|
|
|
|
|
mails = tr.find('mails')
|
2020-01-15 15:56:23 +01:00
|
|
|
mails[:] = sorted(mails, key=lambda x: parse_nbr_xml(x.find('nbr').text))
|
2020-01-14 10:11:58 +01:00
|
|
|
|
|
|
|
|
tr.write(fp)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
2020-01-15 15:56:23 +01:00
|
|
|
def delete_nbr_xml(d, fn, nbr, date):
|
|
|
|
|
fp = os.path.join(d, fn)
|
|
|
|
|
if not os.path.isfile(fp):
|
|
|
|
|
return False
|
2020-01-14 10:11:58 +01:00
|
|
|
|
2020-01-15 15:56:23 +01:00
|
|
|
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
|
2020-01-14 10:11:58 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@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/<path:fn>', 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":
|
2020-01-15 15:56:23 +01:00
|
|
|
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')):
|
2020-01-14 10:11:58 +01:00
|
|
|
return "ok"
|
|
|
|
|
return "-"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|