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 ?'