mirror of
https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
synced 2024-11-15 01:05:42 +00:00
102 lines
3.7 KiB
Python
102 lines
3.7 KiB
Python
from flask import (
|
|
abort,
|
|
flash,
|
|
Markup,
|
|
redirect,
|
|
render_template,
|
|
send_from_directory
|
|
)
|
|
from flask_login import current_user, login_required
|
|
import os
|
|
from app import db
|
|
from app.models import Corpus, CorpusFile, CorpusStatus
|
|
from ..decorators import corpus_follower_permission_required
|
|
from . import bp, TEMPLATE_FOLDER
|
|
from .forms import CreateCorpusFileForm, UpdateCorpusFileForm
|
|
|
|
|
|
##############################################################################
|
|
# IMPORTANT NOTE: These routes are prefixed by the blueprint #
|
|
# Prefix: <hashid:corpus_id>/files #
|
|
# This implies that the corpus_id is always in the kwargs of #
|
|
# a route that is registered to this blueprint. #
|
|
##############################################################################
|
|
|
|
|
|
@bp.route('/create', methods=['GET', 'POST'])
|
|
@login_required
|
|
@corpus_follower_permission_required('ADD_CORPUS_FILE')
|
|
def create_corpus_file(corpus_id):
|
|
corpus = Corpus.query.get_or_404(corpus_id)
|
|
form = CreateCorpusFileForm()
|
|
if form.is_submitted():
|
|
if not form.validate():
|
|
response = {'errors': form.errors}
|
|
return response, 400
|
|
try:
|
|
corpus_file = CorpusFile.create(
|
|
form.vrt.data,
|
|
address=form.address.data,
|
|
author=form.author.data,
|
|
booktitle=form.booktitle.data,
|
|
chapter=form.chapter.data,
|
|
editor=form.editor.data,
|
|
institution=form.institution.data,
|
|
journal=form.journal.data,
|
|
pages=form.pages.data,
|
|
publisher=form.publisher.data,
|
|
publishing_year=form.publishing_year.data,
|
|
school=form.school.data,
|
|
title=form.title.data,
|
|
mimetype='application/vrt+xml',
|
|
corpus=corpus
|
|
)
|
|
except (AttributeError, OSError):
|
|
abort(500)
|
|
corpus.status = CorpusStatus.UNPREPARED
|
|
db.session.commit()
|
|
flash(f'Corpus File "{corpus_file.filename}" added', category='corpus')
|
|
return '', 201, {'Location': corpus.url}
|
|
return render_template(
|
|
f'{TEMPLATE_FOLDER}/create_corpus_file.html.j2',
|
|
corpus=corpus,
|
|
form=form,
|
|
title='Add corpus file'
|
|
)
|
|
|
|
|
|
@bp.route('/<hashid:corpus_file_id>', methods=['GET', 'POST'])
|
|
@login_required
|
|
@corpus_follower_permission_required('UPDATE_CORPUS_FILE')
|
|
def corpus_file(corpus_id, corpus_file_id):
|
|
corpus_file = CorpusFile.query.filter_by(corpus_id=corpus_id, id=corpus_file_id).first_or_404()
|
|
form = UpdateCorpusFileForm(data=corpus_file.to_json_serializeable())
|
|
if form.validate_on_submit():
|
|
form.populate_obj(corpus_file)
|
|
if db.session.is_modified(corpus_file):
|
|
corpus_file.corpus.status = CorpusStatus.UNPREPARED
|
|
db.session.commit()
|
|
flash(f'Corpus file "{corpus_file.filename}" updated', category='corpus')
|
|
return redirect(corpus_file.corpus.url)
|
|
return render_template(
|
|
f'{TEMPLATE_FOLDER}/corpus_file.html.j2',
|
|
corpus=corpus_file.corpus,
|
|
corpus_file=corpus_file,
|
|
form=form,
|
|
title='Edit corpus file'
|
|
)
|
|
|
|
|
|
@bp.route('/<hashid:corpus_file_id>/download')
|
|
@login_required
|
|
@corpus_follower_permission_required('VIEW')
|
|
def download_corpus_file(corpus_id, corpus_file_id):
|
|
corpus_file = CorpusFile.query.filter_by(corpus_id=corpus_id, id=corpus_file_id).first_or_404()
|
|
return send_from_directory(
|
|
os.path.dirname(corpus_file.path),
|
|
os.path.basename(corpus_file.path),
|
|
as_attachment=True,
|
|
attachment_filename=corpus_file.filename,
|
|
mimetype=corpus_file.mimetype
|
|
)
|