diff --git a/app/main/forms.py b/app/main/forms.py index a3ff4a639373ee4dc648a7cadffb52f327c20bac..e26c34da547c44ab198c7b1c9579159d855f8e68 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -1,28 +1,28 @@ from flask_wtf import FlaskForm -from wtforms import (MultipleFileField, StringField, SubmitField, +from wtforms import (FileField, StringField, SubmitField, ValidationError, IntegerField, SelectField) -from wtforms.validators import DataRequired, Length, NumberRange - - -class CreateCorpusForm(FlaskForm): - description = StringField('Description', - validators=[DataRequired(), Length(1, 64)]) - submit = SubmitField('Create corpus') - title = StringField('Title', validators=[DataRequired(), Length(1, 32)]) +from wtforms.validators import DataRequired, Length class AddCorpusFileForm(FlaskForm): author = StringField('Author', validators=[DataRequired(), Length(1, 64)]) - files = MultipleFileField('Files', validators=[DataRequired()]) - publishing_year = IntegerField('Publishing year', validators=[DataRequired()]) + file = FileField('File', validators=[DataRequired()]) + publishing_year = IntegerField('Publishing year', + validators=[DataRequired()]) submit = SubmitField() title = StringField('Title', validators=[DataRequired(), Length(1, 64)]) - def validate_files(form, field): - for file in field.data: - if not file.filename.lower().endswith('.vrt'): - raise ValidationError('File does not have an approved ' - 'extension: .vrt') + def validate_file(form, field): + if not field.data.filename.lower().endswith('.vrt'): + raise ValidationError('File does not have an approved extension: ' + '.vrt') + + +class CreateCorpusForm(FlaskForm): + description = StringField('Description', + validators=[DataRequired(), Length(1, 64)]) + submit = SubmitField('Create corpus') + title = StringField('Title', validators=[DataRequired(), Length(1, 32)]) class QueryForm(FlaskForm): diff --git a/app/main/views.py b/app/main/views.py index e2202423930e4517fd128408e1de279f1e6270f2..1806fe28a6af5e274493559e1a6e77b3fe93c82d 100644 --- a/app/main/views.py +++ b/app/main/views.py @@ -17,7 +17,7 @@ def index(): return render_template('main/index.html.j2', title='Opaque') -@main.route('/corpora/<int:corpus_id>') +@main.route('/corpora/<int:corpus_id>', methods=['GET', 'POST']) @login_required def corpus(corpus_id): corpus = Corpus.query.get_or_404(corpus_id) @@ -26,6 +26,29 @@ def corpus(corpus_id): 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', diff --git a/app/templates/main/corpora/corpus.html.j2 b/app/templates/main/corpora/corpus.html.j2 index 5896af60245c232a3ef8d7c166e40cf8c9ac8853..df3025483cb93ba3eec241e5423e6fc0f239f31c 100644 --- a/app/templates/main/corpora/corpus.html.j2 +++ b/app/templates/main/corpora/corpus.html.j2 @@ -69,7 +69,7 @@ <td>{{ file.publishing_year }}</td> <td class="right-align"> <a class="waves-effect waves-light btn-small"><i class="material-icons">edit</i></a> - <a class="waves-effect waves-light btn-small"><i class="material-icons">file_download</i></a> + <a class="waves-effect waves-light btn-small" href="{{ url_for('main.corpus_download', corpus_file_id=file.id, corpus_id=corpus.id) }}"><i class="material-icons">file_download</i></a> <a class="waves-effect waves-light btn-small red"><i class="material-icons">delete</i></a> </td> </tr> @@ -87,7 +87,7 @@ <form method="POST" enctype="multipart/form-data"> {{ add_corpus_file_form.hidden_tag() }} <div class="row"> - <div class="col s12 m8"> + <div class="col s12 m4"> <div class="input-field"> <i class="material-icons prefix">person</i> {{ add_corpus_file_form.author(data_length='64') }} @@ -107,16 +107,26 @@ {% endfor %} </div> </div> + <div class="col s12 m4"> + <div class="input-field"> + <i class="material-icons prefix">access_time</i> + {{ add_corpus_file_form.publishing_year() }} + {{ add_corpus_file_form.publishing_year.label }} + {% for error in add_corpus_file_form.publishing_year.errors %} + <span class="helper-text red-text">{{ error }}</span> + {% endfor %} + </div> + </div> <div class="col s12"> <div class="file-field input-field"> <div class="btn"> - <span>{{ add_corpus_file_form.files.label.text }}</span> - {{ add_corpus_file_form.files(accept='.vrt') }} + <span>{{ add_corpus_file_form.file.label.text }}</span> + {{ add_corpus_file_form.file(accept='.vrt') }} </div> <div class="file-path-wrapper"> <input class="file-path validate" type="text"> </div> - {% for error in add_corpus_file_form.files.errors %} + {% for error in add_corpus_file_form.file.errors %} <span class="helper-text red-text">{{ error }}</span> {% endfor %} </div> diff --git a/app/utils.py b/app/utils.py index e68d068262fde893d3f164b55a7fec3f1bb887b0..2abecee22d5052707ef3d7e93a3f677d939467ee 100644 --- a/app/utils.py +++ b/app/utils.py @@ -63,5 +63,7 @@ def background_delete_corpus(app, corpus_id): logger.warning('Called by delete_thread.') logger.warning('Corpus id is: {}.'.format(corpus_id)) corpus = Corpus.query.filter_by(id=corpus_id).first() - logger.warning('Corpus object is: {}'.format(corpus)) + for corpus_file in corpus.files: + db.session.delete(corpus_file) + logger.warning('Corpus object is: {}'.format(corpus)) corpus.delete_corpus()