views.py 3.58 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
#!/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
12
from validata_ui_next.validate_helper import ValidatorHelper
13

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
import tabulator


def compute_source_preview(source, max_rows=5):
    """ Computes table preview """
    header = None
    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))
43 44 45 46 47 48 49 50


# Routes


@app.route('/')
def home():
    """ Home page """
Pierre Dittgen's avatar
Pierre Dittgen committed
51
    validators = ValidatorHelper.schema_info_list()
52 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
    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
78
        val_info = ValidatorHelper.schema_info(val_code)
79 80 81 82 83 84 85 86 87 88 89 90 91 92
        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
93
            return validate(val_code, url, 'url')
94 95 96 97 98 99 100 101 102 103 104 105 106

    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
107 108 109
            fpath = os.path.join('/tmp', f.filename)
            f.save(fpath)
            return validate(val_code, fpath, 'file')
110 111

        return 'Bizarre, vous avez dit bizarre ?'