From e9d1734364ce91f7f3ea24e2528b227ea318228b Mon Sep 17 00:00:00 2001 From: Patrick Jentsch Date: Wed, 30 Oct 2019 13:12:31 +0100 Subject: [PATCH] enhance routing for corpus actions --- app/main/forms.py | 9 ++ app/main/views.py | 167 ++++++++++++++-------- app/models.py | 4 +- app/templates/main/corpora/corpus.html.j2 | 30 ++-- app/templates/main/dashboard.html.j2 | 2 +- 5 files changed, 135 insertions(+), 77 deletions(-) diff --git a/app/main/forms.py b/app/main/forms.py index e26c34da..04885cae 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -25,6 +25,15 @@ class CreateCorpusForm(FlaskForm): title = StringField('Title', validators=[DataRequired(), Length(1, 32)]) +class EditCorpusFileForm(FlaskForm): + author = StringField('Author', validators=[DataRequired(), Length(1, 64)]) + corpus_file_id = IntegerField('', validators=[DataRequired()]) + publishing_year = IntegerField('Publishing year', + validators=[DataRequired()]) + submit = SubmitField() + title = StringField('Title', validators=[DataRequired(), Length(1, 64)]) + + class QueryForm(FlaskForm): query = StringField('CQP Query', validators=[DataRequired(), (Length(1, 1024))]) hits_per_page = SelectField('Hits per page', diff --git a/app/main/views.py b/app/main/views.py index 0d138b2d..25c9d28f 100644 --- a/app/main/views.py +++ b/app/main/views.py @@ -1,4 +1,4 @@ -from app.utils import background_delete_job, background_delete_corpus +from app.utils import background_delete_job from flask import (abort, current_app, flash, redirect, request, render_template, url_for, send_from_directory) from flask_login import current_user, login_required @@ -17,73 +17,18 @@ def index(): return render_template('main/index.html.j2', title='Opaque') -@main.route('/corpora/', methods=['GET', 'POST']) +@main.route('/corpora/') @login_required def corpus(corpus_id): corpus = Corpus.query.get_or_404(corpus_id) - if not (corpus.creator == current_user - or current_user.is_administrator()): + if not (corpus.creator == current_user or current_user.is_administrator()): abort(403) - add_corpus_file_form = AddCorpusFileForm() - if add_corpus_file_form.validate_on_submit(): - filename = secure_filename(add_corpus_file_form.file.data.filename) - for corpus_file in corpus.files: - if filename == corpus_file.filename: - flash('File already registered to this corpus.') - return redirect(url_for('main.corpus', corpus_id=corpus_id)) - # Gather information to create new corpus file database entry - author = add_corpus_file_form.author.data - dir = os.path.join(str(corpus.user_id), 'corpora', str(corpus.id)) - file = add_corpus_file_form.file.data - publishing_year = add_corpus_file_form.publishing_year.data - title = add_corpus_file_form.title.data - # Save the file - file_dir = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'], - dir) - file.save(os.path.join(file_dir, filename)) - corpus_file = CorpusFile(author=author, - corpus=corpus, - dir=dir, - filename=filename, - publishing_year=publishing_year, - title=title) - db.session.add(corpus_file) - db.session.commit() - flash('Corpus file added!') - return redirect(url_for('main.corpus', corpus_id=corpus_id)) return render_template('main/corpora/corpus.html.j2', - add_corpus_file_form=add_corpus_file_form, + add_corpus_file_form=AddCorpusFileForm(), corpus=corpus, title='Corpus') -@main.route('/corpora//delete') -@login_required -def delete_corpus(corpus_id): - corpus = Corpus.query.filter_by(id=corpus_id).first() - delete_thread = threading.Thread(corpus.delete()) - delete_thread.start() - flash('Corpus has been deleted!') - return redirect(url_for('main.dashboard')) - - -@main.route('/corpora//download') -@login_required -def corpus_download(corpus_id): - corpus_file_id = request.args.get('corpus_file_id') - corpus_file = CorpusFile.query.get_or_404(corpus_file_id) - if not corpus_file.corpus_id == corpus_id: - abort(404) - if not (corpus_file.corpus.creator == current_user - or current_user.is_administrator()): - abort(403) - dir = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'], - corpus_file.dir) - return send_from_directory(as_attachment=True, - directory=dir, - filename=corpus_file.filename) - - @main.route('/corpora//analysis', methods=['GET', 'POST']) @login_required def corpus_analysis(corpus_id): @@ -109,6 +54,110 @@ def corpus_analysis(corpus_id): title='Corpus: ' + corpus.title) +@main.route('/corpora/new', methods=['POST']) +@login_required +def corpus_new(): + create_corpus_form = CreateCorpusForm() + if create_corpus_form.validate_on_submit(): + corpus = Corpus(creator=current_user, + description=create_corpus_form.description.data, + title=create_corpus_form.title.data) + db.session.add(corpus) + db.session.commit() + dir = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'], + str(corpus.user_id), + 'corpora', + str(corpus.id)) + try: + os.makedirs(dir) + except OSError: + flash('OSError!') + db.session.remove(corpus) + db.session.commit() + flash('Corpus created!') + return redirect(url_for('main.corpus', corpus_id=corpus.id)) + + +@main.route('/corpora//delete') +@login_required +def corpus_delete(corpus_id): + corpus = Corpus.query.get_or_404(corpus_id) + if not (corpus.creator == current_user or current_user.is_administrator()): + abort(403) + delete_thread = threading.Thread(corpus.delete()) + delete_thread.start() + flash('Corpus has been deleted!') + return redirect(url_for('main.dashboard')) + + +@main.route('/corpora//files/new', methods=['POST']) +@login_required +def corpus_file_new(corpus_id): + corpus = Corpus.query.get_or_404(corpus_id) + if not (corpus.creator == current_user or current_user.is_administrator()): + abort(403) + add_corpus_file_form = AddCorpusFileForm() + if not add_corpus_file_form.validate_on_submit(): + abort(400) + file = add_corpus_file_form.file.data + filename = secure_filename(file.filename) + for corpus_file in corpus.files: + if filename == corpus_file.filename: + flash('File already registered to this corpus.') + return redirect(url_for('main.corpus', corpus_id=corpus_id)) + # Save the file + dir = os.path.join(str(corpus.user_id), 'corpora', str(corpus.id)) + file_path = os.path.join( + current_app.config['OPAQUE_STORAGE_DIRECTORY'], dir, filename + ) + file.save(file_path) + # Gather information to create new corpus file database entry + author = add_corpus_file_form.author.data + publishing_year = add_corpus_file_form.publishing_year.data + title = add_corpus_file_form.title.data + corpus_file = CorpusFile(author=author, + corpus=corpus, + dir=dir, + filename=filename, + publishing_year=publishing_year, + title=title) + db.session.add(corpus_file) + db.session.commit() + flash('Corpus file added!') + return redirect(url_for('main.corpus', corpus_id=corpus_id)) + + +@main.route('/corpora//files//delete') +@login_required +def corpus_file_delete(corpus_id, corpus_file_id): + corpus_file = CorpusFile.query.get_or_404(corpus_file_id) + if not corpus_file.corpus_id == corpus_id: + abort(404) + if not (corpus_file.corpus.creator == current_user + or current_user.is_administrator()): + abort(403) + delete_thread = threading.Thread(corpus_file.delete()) + delete_thread.start() + flash('Corpus file deleted!') + return redirect(url_for('main.corpus', corpus_id=corpus_id)) + + +@main.route('/corpora//files//download') +@login_required +def corpus_file_download(corpus_id, corpus_file_id): + corpus_file = CorpusFile.query.get_or_404(corpus_file_id) + if not corpus_file.corpus_id == corpus_id: + abort(404) + if not (corpus_file.corpus.creator == current_user + or current_user.is_administrator()): + abort(403) + dir = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'], + corpus_file.dir) + return send_from_directory(as_attachment=True, + directory=dir, + filename=corpus_file.filename) + + @main.route('/dashboard', methods=['GET', 'POST']) @login_required def dashboard(): diff --git a/app/models.py b/app/models.py index 962aee73..6322b2e0 100644 --- a/app/models.py +++ b/app/models.py @@ -468,9 +468,9 @@ class Corpus(db.Model): logger.warning('user_id: {}'.format(self.user_id)) logger.warning('id: {}'.format(self.id)) path = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'], - self.user_id, + str(self.user_id), 'corpora', - self.id) + str(self.id)) logger.warning(path) try: logger.warning('Try to remove {}'.format(path)) diff --git a/app/templates/main/corpora/corpus.html.j2 b/app/templates/main/corpora/corpus.html.j2 index df302548..47a6428f 100644 --- a/app/templates/main/corpora/corpus.html.j2 +++ b/app/templates/main/corpora/corpus.html.j2 @@ -4,18 +4,6 @@

{{ corpus.title }}

{{ corpus.description }}

- -
@@ -69,8 +57,8 @@ {{ file.publishing_year }} edit - file_download - delete + file_download + delete {% endfor %} @@ -84,7 +72,7 @@