forked from inveniosoftware/invenio-previewer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcsv_dthreejs.py
71 lines (58 loc) · 2.14 KB
/
csv_dthreejs.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# -*- coding: utf-8 -*-
#
# This file is part of Invenio.
# Copyright (C) 2015-2019 CERN.
#
# Invenio is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.
"""Render a CSV file using d3.js."""
import csv
from flask import current_app, render_template
from ..proxies import current_previewer
from ..utils import detect_encoding
previewable_extensions = ["csv", "dsv"]
def validate_csv(file):
"""Return dialect information about given csv file."""
max_file_size = current_app.config.get(
"PREVIEWER_MAX_FILE_SIZE_BYTES", 10 * 1024 * 1024
)
if file.size > max_file_size:
return False
try:
# Detect encoding and dialect
with file.open() as fp:
encoding = detect_encoding(fp, default="utf-8")
sample = fp.read(
current_app.config.get("PREVIEWER_CSV_VALIDATION_BYTES", 1024)
)
allowed_delimiters = current_app.config.get(
"PREVIEWER_CSV_SNIFFER_ALLOWED_DELIMITERS", None
)
delimiter = (
csv.Sniffer()
.sniff(sample=sample.decode(encoding), delimiters=allowed_delimiters)
.delimiter
)
is_valid = True
except Exception as e:
current_app.logger.debug("File {0} is not valid CSV: {1}".format(file.uri, e))
encoding = ""
delimiter = ""
is_valid = False
return {"delimiter": delimiter, "encoding": encoding, "is_valid": is_valid}
def can_preview(file):
"""Determine if the given file can be previewed."""
if file.is_local() and file.has_extensions(".csv", ".dsv"):
return validate_csv(file)["is_valid"]
return False
def preview(file):
"""Render the appropriate template with embed flag."""
file_info = validate_csv(file)
return render_template(
"invenio_previewer/csv_bar.html",
file=file,
delimiter=file_info["delimiter"],
encoding=file_info["encoding"],
js_bundles=current_previewer.js_bundles + ["d3_csv.js"],
css_bundles=current_previewer.css_bundles,
)