Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
# own
.pre-commit-config.yaml
.vs

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
Expand Down
9 changes: 9 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM docker.io/python:3.8

RUN apt-get -y update && apt-get install -y apt-utils gcc g++
RUN apt-get -y upgrade
RUN git clone https://github.com/Mat-O-Lab/KnowledgeUI /src
RUN pip install -r /src/requirements.txt
WORKDIR /src

CMD ["gunicorn", "-b", "0.0.0.0:5000", "wsgi:app", "--workers=3"]
2 changes: 0 additions & 2 deletions README.md

This file was deleted.

126 changes: 126 additions & 0 deletions app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
import os
import base64

from flask import Flask, flash, request, jsonify, render_template
from flask_swagger_ui import get_swaggerui_blueprint
from flask_wtf import FlaskForm
from flask_bootstrap import Bootstrap

from wtforms import URLField, SelectField
from wtforms.validators import DataRequired

from config import config
#from annotator import CSV_Annotator

config_name = os.environ.get("APP_MODE") or "development"

app = Flask(__name__)
app.config.from_object(config[config_name])

bootstrap = Bootstrap(app)


SWAGGER_URL = "/api/docs"
API_URL = "/static/swagger.json"
swaggerui_blueprint = get_swaggerui_blueprint(
SWAGGER_URL,
API_URL,
config={
"app_name": "CSVtoCSVW"
}
)

app.register_blueprint(swaggerui_blueprint, url_prefix=SWAGGER_URL)
separators = ["auto", ";", ",", "\\t", "\\t+",
"|", "\s+", "\s+|\\t+|\s+\\t+|\\t+\s+"]
encodings = ['auto', 'ISO-8859-1', 'UTF-8', 'ascii', 'latin-1', 'cp273']


class StartForm(FlaskForm):
data_url = URLField(
'URL Data File',
validators=[DataRequired()],
description='Paste URL to a data file, e.g. csv, TRA'
)
separator_sel = SelectField(
'Choose Separator, default: auto detect',
choices=separators,
description='select a separator for your data manually',
default='auto'
)
encoding_sel = SelectField(
'Choose Encoding, default: auto detect',
choices=encodings,
description='select an encoding for your data manually',
default='auto'
)


@app.route('/', methods=['GET', 'POST'])
def index():
logo = './static/resources/MatOLab-Logo.svg'
start_form = StartForm()
message = ''
result = ''
return render_template(
"index.html",
logo=logo,
start_form=start_form,
message=message,
result=result
)


@app.route('/create_annotator', methods=['POST'])
def create_annotator():
logo = './static/resources/MatOLab-Logo.svg'
start_form = StartForm()
message = ''
result = ''

if start_form.validate_on_submit():
annotator = CSV_Annotator(
separator=start_form.separator_sel.data,
encoding=start_form.encoding_sel.data
)

try:
meta_file_name, result = annotator.process(
start_form.data_url.data)
except (ValueError, TypeError) as error:
flash(str(error))
else:
b64 = base64.b64encode(result.encode())
payload = b64.decode()

return render_template(
"index.html",
logo=logo,
start_form=start_form,
message=message,
result=result,
payload=payload,
filename=meta_file_name
)
return render_template(
"index.html",
logo=logo,
start_form=start_form,
message=message,
result=result
)


@app.route("/api", methods=["GET", "POST"])
def api():
if request.method == "POST":
content = request.get_json()
annotator = CSV_Annotator(
encoding=content['encoding'], separator=content['separator'])
filename, file_data = annotator.process(content['data_url'])
return jsonify({"filename": filename, "filedata": file_data})


if __name__ == "__main__":
port = int(os.environ.get("PORT", 5000))
app.run(host="0.0.0.0", port=port, debug=app.config["DEBUG"])
18 changes: 18 additions & 0 deletions config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import os

class Config:
SECRET_KEY = os.environ.get("SECRET_KEY") or "harder to guess string"
TEMPORAL_FOLDER = os.environ.get("TEMPORAL_FOLDER") or "tmp"
TEMPLATES_AUTORELOAD = True

class DevelopmentConfig(Config):
DEBUG = True

class ProductionConfig(Config):
DEBUG = False

config = {
"development": DevelopmentConfig,
"production": ProductionConfig,
"default": DevelopmentConfig
}
17 changes: 17 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
version: "3"
services:
knowledgeui:
build: .
container_name: knowledgeui
volumes:
- .:/src
ports:
- 5000:5000
restart: always
networks:
- knowledgeui_net

networks:
knowledgeui_net:
name: knowledgeui
driver: bridge
5 changes: 5 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
gunicorn
chardet
rdflib
flask
flask-bootstrap
58 changes: 58 additions & 0 deletions templates/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
</header>
<main class="bg-light rounded-3 px-3">
<div class="container-fluid mb-3">
<h1 class="display-5 fw-bold">CSVtoCSVW</h1>
<h1 class="display-5 fw-bold">KnowledgeUI</h1>
<p class="col-md-12 ps-0 fs-4">
Tool for mapping data files to json-ld metadata.
Mat-o-Lab Demonstrator App for the aluminium use case.
</p>
<form class='pb-3' method="post" action="{{ url_for('create_annotator') }}">
<div class="mb-3">
{{ start_form.csrf_token }}
{{ start_form.data_url.label }}
{{ start_form.data_url(class="form-control", **{'aria-describedby': 'urlHelp'}) }}
<div id="urlHelp" class="form-text">{{ start_form.data_url.description }}</div>
<div class="invalid-feedback">
{% if start_form.data_url.errors %}
<ul class="errors">
{% for error in start_form.data_url.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</div>
{{ start_form.separator_sel.label }}
{{ start_form.separator_sel(class="form-control", **{'aria-describedby': 'sep_help'}) }}
<div id="sep_help" class="form-text">{{ start_form.separator_sel.description }}</div>

{{ start_form.encoding_sel.label }}
{{ start_form.encoding_sel(class="form-control", **{'aria-describedby': 'enc_help'}) }}
<div id="enc_help" class="form-text">{{ start_form.encoding_sel.description }}</div>

</div>
<button class="form-group btn btn-primary btn-lg" type="submit">Start Conversion</button>
</form>

{% block tab %}
{% endblock %}
</div>
{% with messages = get_flashed_messages() %}
<div class="container-fluid collapse {% if messages or result %} show {% endif %}" id="mappingForm">
@@ -75,10 +50,13 @@ <h5 class="card-title">Result</h5>
</div>
{% endwith %}
</main>
{% block footer %}
<footer class="pt-3 my-4 text-center text-muted border-top">
<span class="site-footer-owner"><a href="https://github.com/Mat-O-Lab/CSVtoCSVW">CSVtoCSVW</a> is maintained by <a href="https://matolab.org"><img src="{{ logo }}" width="5%" alt="mat-o-lab-logo"/></a>.</span>
<span class="site-footer-owner"><a href="https://github.com/Mat-O-Lab/KnowledgeUI">KnowledgeUI</a> is maintained by <a href="https://matolab.org"><img src="{{ logo }}" width="5%" alt="mat-o-lab-logo"/></a>.</span>
</footer>

{% endblock %}


{% block scripts %}
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>

{% endblock %}