diff --git a/app/main/forms.py b/app/main/forms.py new file mode 100644 index 0000000000000000000000000000000000000000..d209a6ba20a9dcb3652e7b95a454ec11a82502bd --- /dev/null +++ b/app/main/forms.py @@ -0,0 +1,12 @@ +from flask_wtf import FlaskForm +from wtforms import DecimalField, StringField, SubmitField, TextAreaField +from wtforms.validators import DataRequired, Email, Length, NumberRange + + +class FeedbackForm(FlaskForm): + email = StringField('Email', validators=[DataRequired(), Email()]) + feedback = TextAreaField('Feedback', validators=[Length(0, 255)]) + like_range = DecimalField('How would you rate nopaque?', + validators=[DataRequired(), + NumberRange(min=1, max=10)]) + submit = SubmitField('Send feedback') diff --git a/app/main/views.py b/app/main/views.py index 65f0254805c8b9df4e363bb411944fd2eab01f57..8f85539920c6abdb438a6b3041945dd2255b99e2 100644 --- a/app/main/views.py +++ b/app/main/views.py @@ -1,8 +1,10 @@ +from app import logger from app.auth.forms import LoginForm from app.models import User from flask import flash, redirect, render_template, url_for from flask_login import login_required, login_user from . import main +from .forms import FeedbackForm @main.route('/', methods=['GET', 'POST']) @@ -26,6 +28,18 @@ def dashboard(): return render_template('main/dashboard.html.j2', title='Dashboard') +@main.route('/feedback', methods=['GET', 'POST']) +@login_required +def feedback(): + feedback_form = FeedbackForm(prefix='feedback-form') + if feedback_form.validate_on_submit(): + logger.warning(feedback_form.email) + logger.warning(feedback_form.feedback) + logger.warning(feedback_form.like_range) + return render_template('main/feedback.html.j2', + feedback_form=feedback_form, title='Feedback') + + @main.route('/poster', methods=['GET', 'POST']) def poster(): login_form = LoginForm(prefix='login-form') diff --git a/app/templates/auth/login.html.j2 b/app/templates/auth/login.html.j2 index ce6ab69f932c4d85adacbab77b7fd91706aea08d..6f57d20923aba71892a458ddda3e6f70dd5137fe 100644 --- a/app/templates/auth/login.html.j2 +++ b/app/templates/auth/login.html.j2 @@ -26,8 +26,8 @@ <div class="col s12 m8"> <div class="card medium"> <form method="POST"> + {{ login_form.hidden_tag() }} <div class="card-content"> - {{ login_form.hidden_tag() }} <div class="input-field"> <i class="material-icons prefix">person</i> {{ login_form.user(class='validate') }} diff --git a/app/templates/auth/register.html.j2 b/app/templates/auth/register.html.j2 index 35ff2436c19a1cc9a48d20e36e800fc99c8ac4c1..8b38326ad782d838cae767243ab68596adb945f4 100644 --- a/app/templates/auth/register.html.j2 +++ b/app/templates/auth/register.html.j2 @@ -24,8 +24,8 @@ <div class="col s12 m8"> <div class="card medium"> <form method="POST"> + {{ registration_form.hidden_tag() }} <div class="card-content"> - {{ registration_form.hidden_tag() }} <div class="input-field"> <i class="material-icons prefix">person</i> {{ registration_form.username(class='validate', data_length='64') }} @@ -50,7 +50,7 @@ <span class="helper-text red-text">{{ error }}</span> {% endfor %} </div> - <div class="input-field "> + <div class="input-field"> <i class="material-icons prefix">email</i> {{ registration_form.email(class='validate', type='email') }} {{ registration_form.email.label }} diff --git a/app/templates/auth/reset_password.html.j2 b/app/templates/auth/reset_password.html.j2 index 6b947b699ae885570f12bfef5e5c033b36409885..5c6740cf37c4ae4f1506bcc74765c6a13306ac38 100644 --- a/app/templates/auth/reset_password.html.j2 +++ b/app/templates/auth/reset_password.html.j2 @@ -9,8 +9,8 @@ <div class="col s12 m8"> <div class="card"> <form method="POST"> + {{ reset_password_form.hidden_tag() }} <div class="card-content"> - {{ reset_password_form.hidden_tag() }} <div class="input-field"> {{ reset_password_form.password(class='validate') }} {{ reset_password_form.password.label }} diff --git a/app/templates/auth/reset_password_request.html.j2 b/app/templates/auth/reset_password_request.html.j2 index 9145e52fff5d16d850c0adecff805122bec6ba8d..9ea8d8ea390167169eb478c48485216a589a74c2 100644 --- a/app/templates/auth/reset_password_request.html.j2 +++ b/app/templates/auth/reset_password_request.html.j2 @@ -8,8 +8,8 @@ <div class="col s12 m8"> <div class="card"> <form method="POST"> + {{ reset_password_request_form.hidden_tag() }} <div class="card-content"> - {{ reset_password_request_form.hidden_tag() }} <div class="input-field"> {{ reset_password_request_form.email(class='validate', type='email') }} {{ reset_password_request_form.email.label }} diff --git a/app/templates/corpora/add_corpus.html.j2 b/app/templates/corpora/add_corpus.html.j2 index a93a7088a000caaa4ea11bc81440bf4e11e6bd82..39e33abfc28def7a52bf91f5a0ccb6c6fa2d360c 100644 --- a/app/templates/corpora/add_corpus.html.j2 +++ b/app/templates/corpora/add_corpus.html.j2 @@ -9,8 +9,8 @@ <div class="col s12 m8"> <div class="card"> <form method="POST"> + {{ add_corpus_form.hidden_tag() }} <div class="card-content"> - {{ add_corpus_form.hidden_tag() }} <div class="row"> <div class="col s12 m4"> <div class="input-field"> diff --git a/app/templates/corpora/add_corpus_file.html.j2 b/app/templates/corpora/add_corpus_file.html.j2 index 479b4b625429fb136f989464faf7520a3cfeeac4..f792f0fe76201010ca5b77f6daa7823598a56485 100644 --- a/app/templates/corpora/add_corpus_file.html.j2 +++ b/app/templates/corpora/add_corpus_file.html.j2 @@ -9,10 +9,10 @@ <div class="col s12 m8"> <form method="POST" enctype="multipart/form-data"> - <div class="card"> + {{ add_corpus_file_form.hidden_tag() }} + <div class="card"> <div class="card-content"> <span class="card-title">Required metadata</span> - {{ add_corpus_file_form.hidden_tag() }} <div class="row"> <div class="col s12 m4"> <div class="input-field"> diff --git a/app/templates/corpora/edit_corpus_file.html.j2 b/app/templates/corpora/edit_corpus_file.html.j2 index 7a07855a028643d24a6ab4da163288b55ccb3b06..1c7ef7efe9b04be8a08c337ff01472264c6e4873 100644 --- a/app/templates/corpora/edit_corpus_file.html.j2 +++ b/app/templates/corpora/edit_corpus_file.html.j2 @@ -9,9 +9,9 @@ <div class="col s12 m8"> <form method="POST"> - <div class="card"> + {{ edit_corpus_file_form.hidden_tag() }} + <div class="card"> <div class="card-content"> - {{ edit_corpus_file_form.hidden_tag() }} <div class="row"> <div class="col s12 m4"> <div class="input-field"> diff --git a/app/templates/main/feedback.html.j2 b/app/templates/main/feedback.html.j2 new file mode 100644 index 0000000000000000000000000000000000000000..eef11d7ef7bebd6dafa4faf0f3481a7a7fa0205c --- /dev/null +++ b/app/templates/main/feedback.html.j2 @@ -0,0 +1,35 @@ +{% extends "nopaque.html.j2" %} + +{% block page_content %} + +<div class="col s12"> + <div class="card"> + <form method="POST"> + {{ feedback_form.hidden_tag() }} + <div class="card-content"> + <p class="range-field"> + {{ feedback_form.like_range.label }} + {{ feedback_form.like_range(class='validate', type='range', min=1, max=10) }} + </p> + <div class="input-field"> + <i class="material-icons prefix">email</i> + {{ feedback_form.email(class='validate', type='email') }} + {{ feedback_form.email.label }} + {% for error in feedback_form.email.errors %} + <span class="helper-text red-text">{{ error }}</span> + {% endfor %} + </div> + <div class="input-field"> + <i class="material-icons prefix">mode_edit</i> + {{ feedback_form.feedback(class='materialize-textarea', data_length=255) }} + {{ feedback_form.feedback.label }} + </div> + </div> + <div class="card-action right-align"> + {{ macros.submit_button(feedback_form.submit) }} + </div> + </form> + </div> +</div> + +{% endblock %} diff --git a/app/templates/main/poster.html.j2 b/app/templates/main/poster.html.j2 index 735715d924efdd28221fff529b7632e5643c9492..ee5b0a9e9fe577d084c1a2ff5a31deb3e21dd4ef 100644 --- a/app/templates/main/poster.html.j2 +++ b/app/templates/main/poster.html.j2 @@ -163,9 +163,9 @@ <div class="col s12"> <div class="card"> <form method="POST"> + {{ login_form.hidden_tag() }} <div class="card-content"> <span class="card-title">Registration and Log in</span> - {{ login_form.hidden_tag() }} <div class="input-field"> <i class="material-icons prefix">person</i> {{ login_form.user(class='validate') }} diff --git a/app/templates/main/poster2.html.j2 b/app/templates/main/poster2.html.j2 deleted file mode 100644 index 0173042daf40236ac47a043dc4c8dc1b930a71a9..0000000000000000000000000000000000000000 --- a/app/templates/main/poster2.html.j2 +++ /dev/null @@ -1,264 +0,0 @@ -{% extends "nopaque.html.j2" %} - -{% block page_content %} -<style> - input::placeholder { - color: black; - font-style: italic; - } -</style> - -<div class="col s9"> - <div class="card"> - <div class="card-content"> - <span class="card-title"><i class="material-icons left">burst_mode</i>File Setup</span> - <p> - Häufig liegen Digitalisate textueller Foschungsdaten (Bücher, Briefe etc.) in mehreren Dateien und Formaten vor. Nopaque ermöglicht die Konvertierung und Zusammenfassung in ein einheitliches Datenformat, was eine vereinfachte Weiterverarbeitung mit weiteren Services ermöglicht. - </p> - <div class="row"> - <div class="col s9"> - <div class="file-field input-field"> - <div class="btn"> - <span>File</span> - <input type="file" multiple> - </div> - <div class="file-path-wrapper"> - <input class="file-path validate" type="text" placeholder="Bilder, Fotos, Scans…"> - </div> - </div> - </div> - <div class="col s3 right-align"> - <p> </p> - <button class="btn waves-effect waves-light"type="submit">Submit<i class="material-icons right">send</i></button> - </div> - </div> - </div> - </div> - <br> - <br> - <br> -</div> - -<div class="col s3"> - <div class="card"> - <div class="card-content"> - <span class="card-title">Ausgabe</span> - <p>Nach Eingabeateinamen sortierte Multipage-TIFF-Dateien.</p> - </div> - </div> - <p> - <blockquote> - Umgesetzt mit <i>ImageMagick</i><br> - als Docker Swarm Service - </blockquote> - </p> - <br> - <br> - <br> -</div> - -<div class="col s12"></div> - -<div class="col s9"> - <div class="card"> - <div class="card-content"> - <span class="card-title"><i class="material-icons left">find_in_page</i>Optical Character Recognition</span> - <p> - Durch optische Analysemethoden werden aus Bilddaten, wie Fotos oder - Scans, Textdateien erzeugt. Erst dieser Vorverarbeitungsschritt - ermöglicht eine weitere computergestützte Verarbeitung von Dokumenten. - </p> - <div class="row"> - <div class="col s9"> - <div class="file-field input-field"> - <div class="btn"> - <span>File</span> - <input type="file" multiple> - </div> - <div class="file-path-wrapper"> - <input class="file-path validate" type="text" placeholder="Multipage-TIFF- oder PDF-Dateien"> - </div> - </div> - </div> - <div class="col s3 right-align"> - <p> </p> - <button class="btn waves-effect waves-light"type="submit">Submit<i class="material-icons right">send</i></button> - </div> - </div> - </div> - </div> - <br> - <br> - <br> -</div> - -<div class="col s3"> - <div class="card"> - <div class="card-content"> - <span class="card-title">Ausgabe</span> - <p> - Textdateien, PDF-Dateien und TEI P5 konforme XML-Dateien. - </p> - </div> - </div> - <p> - <blockquote> - Pipelineumsetzung mit <i>Tesseract OCR</i><br> - als Docker Swarm Service - </blockquote> - </p> - <br> - <br> - <br> -</div> - -<div class="col s12"></div> - -<div class="col s9"> - <div class="card"> - <div class="card-content"> - <span class="card-title"><i class="material-icons left">format_textdirection_l_to_r</i>Natural Language Processing</span> - <p> - Mit Hilfe computergestützter linguistischer Datenverarbeitungsmethoden - (Tokenisierung, Lemmatisierung, Part-of-speech-Tagging und - Eigennamenerkennung) werden Textdateien mit weiteren Informationen ausgezeichnet. - </p> - <div class="row"> - <div class="col s9"> - <div class="file-field input-field"> - <div class="btn"> - <span>File</span> - <input type="file" multiple> - </div> - <div class="file-path-wrapper"> - <input class="file-path validate" type="text" placeholder="Textdateien"> - </div> - </div> - </div> - <div class="col s3 right-align"> - <p> </p> - <button class="btn waves-effect waves-light"type="submit">Submit<i class="material-icons right">send</i></button> - </div> - </div> - </div> - </div> - <br> - <br> - <br> -</div> - -<div class="col s3"> - <div class="card"> - <div class="card-content"> - <span class="card-title">Ausgabe</span> - <p>Korpusdateien im <i>verticalized text</i>-Format (XML-Dialekt, Ähnelt CoNLL).</p> - </div> - </div> - <p> - <blockquote> - Pipelineumsetzung mit <i>spaCy</i><br> - als Docker Swarm Service - </blockquote> - </p> - <br> - <br> - <br> -</div> - -<div class="col s12"></div> - -<div class="col s9"> - <div class="card"> - <div class="card-content"> - <span class="card-title"><i class="material-icons left">search</i>Corpus Analysis</span> - <p> - Mittels CQP Query Language können komplexe Suchanfragen unter - Zuhilfenahme von Metadaten und NLP-Auszeichnungen an eigens erstellte - Korpora gestellt werden. Ergebnisse können als Text oder in abstrakter Darstellung ausgewertet werden. - </p> - <div class="input-field"> - <i class="material-icons prefix">search</i> - <input class="search" placeholder='"fox" "jumps" "over" []* "dog"' type="search"></input> - </div> - <i class="material-icons left" style="padding-left: 10px;">subdirectory_arrow_right</i> - <p> - <span class="chip">The | DET</span> - <span class="chip">quick | ADJ</span> - <span class="chip">brown | ADJ</span> - <span class="chip light-green">fox | PROPN</span> - <span class="chip light-green">jumps | VERB</span> - <span class="chip light-green">over | ADP</span> - <span class="chip light-green">the | DET</span> - <span class="chip light-green">lazy | ADJ</span> - <span style="padding-left:48px;"> - <span class="chip light-green" id="tooltipped">dog | NOUN</span> - </span> - <span class="chip">. | PUNCT</span> - </p> - </div> - </div> - <br> - <br> - <br> -</div> - -<div class="col s3"> - <div class="card"> - <div class="card-content"> - <span class="card-title">Ausgabe</span> - <p> - Export der Ergebnisse in JSON. (Zunkünftig angedacht: CSV, Excel und - HTML) - </p> - </div> - </div> - <p> - <blockquote> - Umgesetzt mit <i>IMS Open Corpus Workbench</i><br> - als lokaler Docker-Container - </blockquote> - </p> -</div> - -<div class="col s12"> - <p> </p> - <p> </p> - <p> </p> - <p> </p> -</div> - -<script> - // document.addEventListener("DOMContentLoaded", function() { - // tooltippedElement = document.getElementById("tooltipped"); - // tooltip = M.Tooltip.init( - // tooltippedElement, - // {"html": `<table> - // <tr> - // <th>Token information</th> - // <th>Source information</th> - // </tr> - // <tr> - // <td class="left-align"> - // Word: dog<br> - // Lemma: dog<br> - // POS: NN<br> - // Simple POS: NOUN<br> - // NER: NULL - // </td> - // <td class="left-align"> - // Title: Current Notes<br> - // Author: Unknown<br> - // Publishing year: 1885 - // </td> - // </tr> - // </table>`, - // "inDuration": 1500, - // "margin": 15, - // "position": "bottom", - // "transitionMovement": 0} - // ); - // tooltip.open(); - // }); - //DarkReader.enable({"brightness": 100, "contrast": 100, "sepia": 0}); -</script> -{% endblock %} diff --git a/app/templates/nopaque.html.j2 b/app/templates/nopaque.html.j2 index 67c8abd681d63523c75e6e4c734003a9a64afc21..5a33e27d0d0a5c78e1cc008d9faf6c9d48803ef5 100644 --- a/app/templates/nopaque.html.j2 +++ b/app/templates/nopaque.html.j2 @@ -59,7 +59,7 @@ <a href="#" data-target="sidenav-main" class="sidenav-trigger"><i class="material-icons">menu</i></a> {% endif %} <ul class="right"> - <li><a id="nav-notifications" class="dropdown-trigger no-autoinit" href="#!" data-target="nav-notifications-dropdown"><i class="material-icons">notifications</i></a></li> + <!--<li><a id="nav-notifications" class="dropdown-trigger no-autoinit" href="#!" data-target="nav-notifications-dropdown"><i class="material-icons">notifications</i></a></li>--> <li> <a id="nav-account" class="dropdown-trigger no-autoinit" href="#!" data-target="nav-account-dropdown"> {% if current_user.is_authenticated %} diff --git a/app/templates/profile/settings.html.j2 b/app/templates/profile/settings.html.j2 index a2994afd779857e06a0e2030d54ecc6861d668af..1289e5b06c6e6e5812842a1bbd397e69d1a7a836 100644 --- a/app/templates/profile/settings.html.j2 +++ b/app/templates/profile/settings.html.j2 @@ -7,9 +7,9 @@ <div class="col s12 m8"> <br class="hide-on-small-only"> <div class="card"> - <div class="card-content"> - <form method="POST"> - {{ edit_general_settings_form.hidden_tag() }} + <form method="POST"> + {{ edit_general_settings_form.hidden_tag() }} + <div class="card-content"> <div class="row"> <div class="col s9"> <p><i class="material-icons left">brightness_3</i>{{ edit_general_settings_form.dark_mode.label.text }}</p> @@ -48,8 +48,8 @@ <br class="hide-on-small-only"> <div class="card"> <form method="POST"> + {{ edit_password_form.hidden_tag() }} <div class="card-content"> - {{ edit_password_form.hidden_tag() }} <div class="input-field "> <i class="material-icons prefix">vpn_key</i> {{ edit_password_form.current_password() }} @@ -93,8 +93,8 @@ <br class="hide-on-small-only"> <div class="card"> <form method="POST"> + {{ edit_email_form.hidden_tag() }} <div class="card-content"> - {{ edit_email_form.hidden_tag() }} <div class="input-field"> <i class="material-icons prefix">mail</i> {{ edit_email_form.email() }} diff --git a/app/templates/services/nlp.html.j2 b/app/templates/services/nlp.html.j2 index a7db5a836ea67e8a84c8733187d26ded42cedc44..ee2073c13cc53de69f5dd5f2eec2a594d1c1f37a 100644 --- a/app/templates/services/nlp.html.j2 +++ b/app/templates/services/nlp.html.j2 @@ -44,8 +44,8 @@ <h3>Submit a job</h3> <div class="card"> <form class="nopaque-job-form" data-progress-modal="progress-modal"> + {{ add_job_form.hidden_tag() }} <div class="card-content"> - {{ add_job_form.hidden_tag() }} <div class="row"> <div class="col s12 l4"> <div class="input-field"> diff --git a/app/templates/services/ocr.html.j2 b/app/templates/services/ocr.html.j2 index 78e4d54ec55254ef69dd0fbcd3c1fd636fcaef9a..f84b81e0ddc34279e09da9ce5fbd7a6274f5ad03 100644 --- a/app/templates/services/ocr.html.j2 +++ b/app/templates/services/ocr.html.j2 @@ -26,8 +26,8 @@ <h3>Submit a job</h3> <div class="card"> <form class="nopaque-job-form" data-progress-modal="progress-modal"> + {{ add_job_form.hidden_tag() }} <div class="card-content"> - {{ add_job_form.hidden_tag() }} <div class="row"> <div class="col s12 l4"> <div class="input-field"> diff --git a/app/templates/services/setup_files.html.j2 b/app/templates/services/setup_files.html.j2 index cbe6e877f3f222248af3d5be2cfe839028ebb132..31651ccdc4bfebd36103ac49c0a55f65623c18f5 100644 --- a/app/templates/services/setup_files.html.j2 +++ b/app/templates/services/setup_files.html.j2 @@ -26,8 +26,8 @@ <h3>Submit a job</h3> <div class="card"> <form class="nopaque-job-form" data-progress-modal="progress-modal"> + {{ add_job_form.hidden_tag() }} <div class="card-content"> - {{ add_job_form.hidden_tag() }} <div class="row"> <div class="col s12 l4"> <div class="input-field">