forked from MIRRI/mirri_tools
129 lines
4.2 KiB
Python
129 lines
4.2 KiB
Python
import string
|
|
import random
|
|
import os.path
|
|
from typing import OrderedDict
|
|
import uuid
|
|
from datetime import datetime
|
|
|
|
from django.template.loader import get_template
|
|
from django.shortcuts import render
|
|
from django.template.context_processors import csrf
|
|
from django.conf import settings as global_settings
|
|
|
|
from xhtml2pdf import pisa
|
|
|
|
from mirri.validation.excel_validator import validate_mirri_excel
|
|
from mirri.validation.error_logging.error import Entity
|
|
|
|
from web_tools import settings
|
|
from web_tools.forms import ValidationUploadForm
|
|
from web_tools.send_mail import send_mail
|
|
|
|
|
|
def random_choice():
|
|
alphabet = string.ascii_lowercase + string.digits
|
|
return ''.join(random.choices(alphabet, k=8))
|
|
|
|
|
|
def render_to_pdf(template_name, context, out_fhand):
|
|
template = get_template(template_name)
|
|
html = template.render(context)
|
|
# print(html)
|
|
return pisa.CreatePDF(html.strip(), dest=out_fhand)
|
|
|
|
|
|
def validation_view(request):
|
|
context = {}
|
|
context.update(csrf(request))
|
|
if request.method == "GET":
|
|
request_data = request.GET
|
|
elif request.method == "POST":
|
|
request_data = request.POST
|
|
else:
|
|
request_data = None
|
|
form = None
|
|
|
|
if request_data:
|
|
form = ValidationUploadForm(request_data, request.FILES)
|
|
if form.is_valid():
|
|
fhand = form.cleaned_data["file"]
|
|
fname = fhand.name
|
|
do_upload = form.cleaned_data['do_upload']
|
|
version = '5.1.2'
|
|
|
|
error_log = validate_mirri_excel(fhand, version=version)
|
|
all_errors = error_log.get_errors()
|
|
total_num_errors = sum(len(errors) for errors in all_errors.values())
|
|
errors_filtered_by_size = prepare_dict_to_show(all_errors,
|
|
limit=settings.NUM_ERROR_LIMIT)
|
|
|
|
uploaded = False
|
|
valid = not total_num_errors
|
|
|
|
if valid and do_upload:
|
|
out_dir = settings.VALID_EXCEL_UPLOAD_DIR
|
|
date_uuid = datetime.now().strftime('%Y%m%d-%H:%M:%S')
|
|
path = out_dir / f'{date_uuid}_{fname}'
|
|
|
|
with path.open('wb') as out_fhand:
|
|
fhand.seek(0)
|
|
out_fhand.write(fhand.read())
|
|
uploaded = True
|
|
|
|
if settings.NOTIFICATION_RECEIVERS:
|
|
send_mail(settings.NOTIFICATION_RECEIVERS, path.name)
|
|
|
|
context['uploaded'] = uploaded
|
|
context['fname'] = fname
|
|
context["valid"] = valid
|
|
context["all_errors"] = errors_filtered_by_size
|
|
context['total_errors'] = total_num_errors
|
|
context['error_limited_to'] = settings.NUM_ERROR_LIMIT
|
|
|
|
if not valid:
|
|
_uuid = str(uuid.uuid4())
|
|
error_fname = f'out_pdf/{_uuid}mirri_validator_output.pdf'
|
|
|
|
error_pdf_fpath = os.path.join(global_settings.MEDIA_ROOT,
|
|
error_fname)
|
|
|
|
error_pdf_url = global_settings.MEDIA_URL + error_fname
|
|
|
|
with open(error_pdf_fpath, 'wb') as out_fhand:
|
|
result = render_to_pdf("validation_pdf_output.html", context,
|
|
out_fhand)
|
|
if result.err == 0:
|
|
pdf_creation_error = True
|
|
context['error_pdf_url'] = error_pdf_url
|
|
|
|
context["validation_done"] = True
|
|
|
|
else:
|
|
form = ValidationUploadForm()
|
|
context["validation_done"] = False
|
|
context["form"] = form
|
|
|
|
template = "validation_html_output.html"
|
|
content_type = None
|
|
return render(request, template, context=context, content_type=content_type)
|
|
|
|
def prepare_dict_to_show(dictionary, limit):
|
|
new_dict = OrderedDict()
|
|
remaining = limit
|
|
for key, values in dictionary.items():
|
|
new_values = values[:remaining] if len(values) >= remaining else values
|
|
remaining -= len(new_values)
|
|
key = Entity(key).name
|
|
new_dict[key] = new_values
|
|
if remaining <= 0:
|
|
break
|
|
return new_dict
|
|
|
|
|
|
def index(request):
|
|
return render(request, "index.html")
|
|
|
|
|
|
def tool_list_view(request):
|
|
return render(request, "tools_index.html")
|