views.py 3.59 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
#!/usr/bin/env python3
"""
    Routes
"""
import json
import os
from collections import OrderedDict
from pathlib import Path

from validata_ui_next import app
from validata_ui_next.util import flash_error, flash_info, flash_success, flash_warning
from validata_ui_next.validate import ValidatorHelper

Pierre Dittgen's avatar
Pierre Dittgen committed
14
from flask import Flask, jsonify, redirect, render_template, request, url_for
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
import tabulator


def compute_source_preview(source, max_rows=5):
    """ Computes table preview """
    header = None
    nb_rows = 0
    rows = []
    with tabulator.Stream(source) as stream:
        for row in stream:
            if header is None:
                header = row
            else:
                rows.append(row)
                if len(rows) == max_rows:
                    break
    return {'header': header, 'data_rows': rows}


def validate(schema_code, source, source_type):
    """ Validate source and display report """

    report = ValidatorHelper.validate(schema_code, source, source_type)
    preview = compute_source_preview(source)

    return render_template('validation_report.html', title='Rapport de validation',
                           val_info=ValidatorHelper.schema_info(schema_code), report=report,
                           source=source, source_type=source_type, preview=preview,
                           report_str=json.dumps(report, sort_keys=True, indent=2))
44 45 46 47 48 49 50 51


# Routes


@app.route('/')
def home():
    """ Home page """
Pierre Dittgen's avatar
Pierre Dittgen committed
52
    validators = ValidatorHelper.schema_info_list()
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
    return render_template('home.html', title='Accueil', validators=validators)


@app.route('/about')
def about():
    """ Help -> About page """
    return render_template('about.html', title='À propos',
                           breadcrumbs=[{'url': url_for('home'), 'title': 'Accueil'}, ])


@app.route('/validators')
def validators():
    """ No validators page """
    return redirect(url_for('home'))


@app.route('/validators/<val_code>', methods=['GET', 'POST'])
def scdl_validator(val_code):
    """ Validator page """

    if not ValidatorHelper.schema_exist(val_code):
        flash_error('Validateur [{}] inconnu'.format(val_code))
        return redirect(url_for('home'))

    if request.method == 'GET':

Pierre Dittgen's avatar
Pierre Dittgen committed
79
        val_info = ValidatorHelper.schema_info(val_code)
80 81 82 83 84 85 86 87 88 89 90 91 92 93
        input_param = request.args.get('input')

        # First form display
        if input_param is None or input_param not in ('url', 'example'):
            return render_template('validator.html', title=val_info['title'],
                                   val_info=val_info,
                                   breadcrumbs=[{'url': url_for('home'), 'title': 'Accueil'}, ])

        # Process URL
        else:
            url = request.args.get('url')
            if url is None or url == '':
                flash_error("Vous n'avez pas indiqué d'url à valider")
                return redirect(url_for('scdl_validator', val_code=val_code))
Pierre Dittgen's avatar
Pierre Dittgen committed
94
            return validate(val_code, url, 'url')
95 96 97 98 99 100 101 102 103 104 105 106 107

    else:  # POST
        input_param = request.form.get('input')
        if input_param is None:
            flash_error('Source non définie')
            return redirect(url_for('scdl_validator', val_code=val_code))

        # File validation
        if input_param == 'file':
            f = request.files.get('file')
            if f is None:
                flash_warning("Vous n'avez pas indiqué de fichier à valider")
                return redirect(url_for('scdl_validator', val_code=val_code))
Pierre Dittgen's avatar
Pierre Dittgen committed
108 109 110
            fpath = os.path.join('/tmp', f.filename)
            f.save(fpath)
            return validate(val_code, fpath, 'file')
111 112

        return 'Bizarre, vous avez dit bizarre ?'