Skip to content
Snippets Groups Projects
Commit b98e3002 authored by Patrick Jentsch's avatar Patrick Jentsch
Browse files

restructure corpus routes file and add new decorators

parent 4fb5f2f2
Branches
Tags
No related merge requests found
...@@ -2,20 +2,18 @@ from flask import ( ...@@ -2,20 +2,18 @@ from flask import (
abort, abort,
current_app, current_app,
flash, flash,
jsonify,
Markup, Markup,
redirect, redirect,
render_template, render_template,
request,
url_for url_for
) )
from flask_login import login_required, current_user from flask_login import login_required, current_user
from threading import Thread from threading import Thread
from app import db from app import db
from app.decorators import permission_required from app.decorators import content_negotiation, permission_required
from app.models import ( from app.models import SpaCyNLPPipelineModel, TesseractOCRPipelineModel
Permission,
SpaCyNLPPipelineModel,
TesseractOCRPipelineModel
)
from . import bp from . import bp
from .forms import ( from .forms import (
CreateSpaCyNLPPipelineModelForm, CreateSpaCyNLPPipelineModelForm,
...@@ -39,67 +37,31 @@ def contributions(): ...@@ -39,67 +37,31 @@ def contributions():
) )
@bp.route('/tesseract-ocr-pipeline-models') ##############################################################################
def tesseract_ocr_pipeline_models(): # SpaCy NLP Pipeline Models #
return render_template( ##############################################################################
'contributions/tesseract_ocr_pipeline_models.html.j2', #region spacy-nlp-pipeline-models
title='Tesseract OCR Pipeline Models' @bp.route('/spacy-nlp-pipeline-models')
) def spacy_nlp_pipeline_models():
@bp.route('/tesseract-ocr-pipeline-models/<hashid:tesseract_ocr_pipeline_model_id>', methods=['GET', 'POST'])
def tesseract_ocr_pipeline_model(tesseract_ocr_pipeline_model_id):
tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.query.get_or_404(tesseract_ocr_pipeline_model_id)
form = EditTesseractOCRPipelineModelForm(
data=tesseract_ocr_pipeline_model.to_json_serializeable(),
prefix='edit-tesseract-ocr-pipeline-model-form'
)
if form.validate_on_submit():
form.populate_obj(tesseract_ocr_pipeline_model)
if db.session.is_modified(tesseract_ocr_pipeline_model):
message = Markup(f'Tesseract OCR Pipeline model "<a href="{tesseract_ocr_pipeline_model.url}">{tesseract_ocr_pipeline_model.title}</a>" updated')
flash(message)
db.session.commit()
return redirect(url_for('.tesseract_ocr_pipeline_models'))
return render_template( return render_template(
'contributions/tesseract_ocr_pipeline_model.html.j2', 'contributions/spacy_nlp_pipeline_models.html.j2',
form=form, title='SpaCy NLP Pipeline Models'
tesseract_ocr_pipeline_model=tesseract_ocr_pipeline_model,
title=f'{tesseract_ocr_pipeline_model.title} {tesseract_ocr_pipeline_model.version}'
)
@bp.route('/tesseract-ocr-pipeline-models/<hashid:tesseract_ocr_pipeline_model_id>', methods=['DELETE'])
def delete_tesseract_model(tesseract_ocr_pipeline_model_id):
def _delete_tesseract_ocr_pipeline_model(app, tesseract_ocr_pipeline_model_id):
with app.app_context():
tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.query.get(tesseract_ocr_pipeline_model_id)
tesseract_ocr_pipeline_model.delete()
db.session.commit()
tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.query.get_or_404(tesseract_ocr_pipeline_model_id)
if not (tesseract_ocr_pipeline_model.user == current_user or current_user.is_administrator()):
abort(403)
thread = Thread(
target=_delete_tesseract_ocr_pipeline_model,
args=(current_app._get_current_object(), tesseract_ocr_pipeline_model_id)
) )
thread.start()
return {}, 202
@bp.route('/tesseract-ocr-pipeline-models/create', methods=['GET', 'POST']) @bp.route('/spacy-nlp-pipeline-models/create', methods=['GET', 'POST'])
def create_tesseract_ocr_pipeline_model(): def create_spacy_nlp_pipeline_model():
form = CreateTesseractOCRPipelineModelForm(prefix='create-tesseract-ocr-pipeline-model-form') form = CreateSpaCyNLPPipelineModelForm(prefix='create-spacy-nlp-pipeline-model-form')
if form.is_submitted(): if form.is_submitted():
if not form.validate(): if not form.validate():
response = {'errors': form.errors} response = {'errors': form.errors}
return response, 400 return response, 400
try: try:
tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.create( spacy_nlp_pipeline_model = SpaCyNLPPipelineModel.create(
form.tesseract_model_file.data, form.spacy_model_file.data,
compatible_service_versions=form.compatible_service_versions.data, compatible_service_versions=form.compatible_service_versions.data,
description=form.description.data, description=form.description.data,
pipeline_name=form.pipeline_name.data,
publisher=form.publisher.data, publisher=form.publisher.data,
publisher_url=form.publisher_url.data, publisher_url=form.publisher_url.data,
publishing_url=form.publishing_url.data, publishing_url=form.publishing_url.data,
...@@ -112,35 +74,17 @@ def create_tesseract_ocr_pipeline_model(): ...@@ -112,35 +74,17 @@ def create_tesseract_ocr_pipeline_model():
except OSError: except OSError:
abort(500) abort(500)
db.session.commit() db.session.commit()
tesseract_ocr_pipeline_model_url = url_for( spacy_nlp_pipeline_model_url = url_for(
'.tesseract_ocr_pipeline_model', '.spacy_nlp_pipeline_model',
tesseract_ocr_pipeline_model_id=tesseract_ocr_pipeline_model.id spacy_nlp_pipeline_model_id=spacy_nlp_pipeline_model.id
) )
message = Markup(f'Tesseract OCR Pipeline model "<a href="{tesseract_ocr_pipeline_model_url}">{tesseract_ocr_pipeline_model.title}</a>" created') message = Markup(f'SpaCy NLP Pipeline model "<a href="{spacy_nlp_pipeline_model_url}">{spacy_nlp_pipeline_model.title}</a>" created')
flash(message) flash(message)
return {}, 201, {'Location': tesseract_ocr_pipeline_model_url} return {}, 201, {'Location': spacy_nlp_pipeline_model_url}
return render_template( return render_template(
'contributions/create_tesseract_ocr_pipeline_model.html.j2', 'contributions/create_spacy_nlp_pipeline_model.html.j2',
form=form, form=form,
title='Create Tesseract OCR Pipeline Model' title='Create SpaCy NLP Pipeline Model'
)
@bp.route('/tesseract-ocr-pipeline-models/<hashid:tesseract_ocr_pipeline_model_id>/toggle-public-status', methods=['POST'])
@permission_required(Permission.CONTRIBUTE)
def toggle_tesseract_ocr_pipeline_model_public_status(tesseract_ocr_pipeline_model_id):
tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.query.get_or_404(tesseract_ocr_pipeline_model_id)
if not (tesseract_ocr_pipeline_model.user == current_user or current_user.is_administrator()):
abort(403)
tesseract_ocr_pipeline_model.is_public = not tesseract_ocr_pipeline_model.is_public
db.session.commit()
return {}, 201
@bp.route('/spacy-nlp-pipeline-models')
def spacy_nlp_pipeline_models():
return render_template(
'contributions/spacy_nlp_pipeline_models.html.j2',
title='SpaCy NLP Pipeline Models'
) )
...@@ -165,6 +109,7 @@ def spacy_nlp_pipeline_model(spacy_nlp_pipeline_model_id): ...@@ -165,6 +109,7 @@ def spacy_nlp_pipeline_model(spacy_nlp_pipeline_model_id):
title=f'{spacy_nlp_pipeline_model.title} {spacy_nlp_pipeline_model.version}' title=f'{spacy_nlp_pipeline_model.title} {spacy_nlp_pipeline_model.version}'
) )
@bp.route('/spacy-nlp-pipeline-models/<hashid:spacy_nlp_pipeline_model_id>', methods=['DELETE']) @bp.route('/spacy-nlp-pipeline-models/<hashid:spacy_nlp_pipeline_model_id>', methods=['DELETE'])
def delete_spacy_model(spacy_nlp_pipeline_model_id): def delete_spacy_model(spacy_nlp_pipeline_model_id):
def _delete_spacy_model(app, spacy_nlp_pipeline_model_id): def _delete_spacy_model(app, spacy_nlp_pipeline_model_id):
...@@ -184,19 +129,54 @@ def delete_spacy_model(spacy_nlp_pipeline_model_id): ...@@ -184,19 +129,54 @@ def delete_spacy_model(spacy_nlp_pipeline_model_id):
return {}, 202 return {}, 202
@bp.route('/spacy-nlp-pipeline-models/create', methods=['GET', 'POST']) #region json-routes
def create_spacy_nlp_pipeline_model(): @bp.route('/spacy-nlp-pipeline-models/<hashid:spacy_nlp_pipeline_model_id>/is_public', methods=['PUT'])
form = CreateSpaCyNLPPipelineModelForm(prefix='create-spacy-nlp-pipeline-model-form') @login_required
@permission_required('CONTRIBUTE')
@content_negotiation(consumes='application/json', produces='application/json')
def update_spacy_nlp_pipeline_model_is_public(spacy_nlp_pipeline_model_id):
is_public = request.json
if not isinstance(is_public, bool):
response = jsonify('The request body must be a boolean')
response.status_code = 400
abort(response)
spacy_nlp_pipeline_model = \
SpaCyNLPPipelineModel.query.get_or_404(spacy_nlp_pipeline_model_id)
spacy_nlp_pipeline_model.is_public = is_public
db.session.commit()
response = jsonify(
f'SpaCy NLP Pipeline Model "{spacy_nlp_pipeline_model.title}"'
f' is now {"public" if is_public else "private"}'
)
response.status_code = 200
return response
#endregion json-routes
#endregion spacy-nlp-pipeline-models
##############################################################################
# Tesseract OCR Pipeline Models #
##############################################################################
#region tesseract-ocr-pipeline-models
@bp.route('/tesseract-ocr-pipeline-models')
def tesseract_ocr_pipeline_models():
return render_template(
'contributions/tesseract_ocr_pipeline_models.html.j2',
title='Tesseract OCR Pipeline Models'
)
@bp.route('/tesseract-ocr-pipeline-models/create', methods=['GET', 'POST'])
def create_tesseract_ocr_pipeline_model():
form = CreateTesseractOCRPipelineModelForm(prefix='create-tesseract-ocr-pipeline-model-form')
if form.is_submitted(): if form.is_submitted():
if not form.validate(): if not form.validate():
response = {'errors': form.errors} response = {'errors': form.errors}
return response, 400 return response, 400
try: try:
spacy_nlp_pipeline_model = SpaCyNLPPipelineModel.create( tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.create(
form.spacy_model_file.data, form.tesseract_model_file.data,
compatible_service_versions=form.compatible_service_versions.data, compatible_service_versions=form.compatible_service_versions.data,
description=form.description.data, description=form.description.data,
pipeline_name=form.pipeline_name.data,
publisher=form.publisher.data, publisher=form.publisher.data,
publisher_url=form.publisher_url.data, publisher_url=form.publisher_url.data,
publishing_url=form.publishing_url.data, publishing_url=form.publishing_url.data,
...@@ -209,25 +189,81 @@ def create_spacy_nlp_pipeline_model(): ...@@ -209,25 +189,81 @@ def create_spacy_nlp_pipeline_model():
except OSError: except OSError:
abort(500) abort(500)
db.session.commit() db.session.commit()
spacy_nlp_pipeline_model_url = url_for( tesseract_ocr_pipeline_model_url = url_for(
'.spacy_nlp_pipeline_model', '.tesseract_ocr_pipeline_model',
spacy_nlp_pipeline_model_id=spacy_nlp_pipeline_model.id tesseract_ocr_pipeline_model_id=tesseract_ocr_pipeline_model.id
) )
message = Markup(f'SpaCy NLP Pipeline model "<a href="{spacy_nlp_pipeline_model_url}">{spacy_nlp_pipeline_model.title}</a>" created') message = Markup(f'Tesseract OCR Pipeline model "<a href="{tesseract_ocr_pipeline_model_url}">{tesseract_ocr_pipeline_model.title}</a>" created')
flash(message) flash(message)
return {}, 201, {'Location': spacy_nlp_pipeline_model_url} return {}, 201, {'Location': tesseract_ocr_pipeline_model_url}
return render_template( return render_template(
'contributions/create_spacy_nlp_pipeline_model.html.j2', 'contributions/create_tesseract_ocr_pipeline_model.html.j2',
form=form, form=form,
title='Create SpaCy NLP Pipeline Model' title='Create Tesseract OCR Pipeline Model'
) )
@bp.route('/spacy-nlp-pipeline-models/<hashid:spacy_nlp_pipeline_model_id>/toggle-public-status', methods=['POST'])
@permission_required(Permission.CONTRIBUTE) @bp.route('/tesseract-ocr-pipeline-models/<hashid:tesseract_ocr_pipeline_model_id>', methods=['GET', 'POST'])
def toggle_spacy_nlp_pipeline_model_public_status(spacy_nlp_pipeline_model_id): def tesseract_ocr_pipeline_model(tesseract_ocr_pipeline_model_id):
spacy_nlp_pipeline_model = SpaCyNLPPipelineModel.query.get_or_404(spacy_nlp_pipeline_model_id) tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.query.get_or_404(tesseract_ocr_pipeline_model_id)
if not (spacy_nlp_pipeline_model.user == current_user or current_user.is_administrator()): form = EditTesseractOCRPipelineModelForm(
data=tesseract_ocr_pipeline_model.to_json_serializeable(),
prefix='edit-tesseract-ocr-pipeline-model-form'
)
if form.validate_on_submit():
form.populate_obj(tesseract_ocr_pipeline_model)
if db.session.is_modified(tesseract_ocr_pipeline_model):
message = Markup(f'Tesseract OCR Pipeline model "<a href="{tesseract_ocr_pipeline_model.url}">{tesseract_ocr_pipeline_model.title}</a>" updated')
flash(message)
db.session.commit()
return redirect(url_for('.tesseract_ocr_pipeline_models'))
return render_template(
'contributions/tesseract_ocr_pipeline_model.html.j2',
form=form,
tesseract_ocr_pipeline_model=tesseract_ocr_pipeline_model,
title=f'{tesseract_ocr_pipeline_model.title} {tesseract_ocr_pipeline_model.version}'
)
@bp.route('/tesseract-ocr-pipeline-models/<hashid:tesseract_ocr_pipeline_model_id>', methods=['DELETE'])
def delete_tesseract_model(tesseract_ocr_pipeline_model_id):
def _delete_tesseract_ocr_pipeline_model(app, tesseract_ocr_pipeline_model_id):
with app.app_context():
tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.query.get(tesseract_ocr_pipeline_model_id)
tesseract_ocr_pipeline_model.delete()
db.session.commit()
tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.query.get_or_404(tesseract_ocr_pipeline_model_id)
if not (tesseract_ocr_pipeline_model.user == current_user or current_user.is_administrator()):
abort(403) abort(403)
spacy_nlp_pipeline_model.is_public = not spacy_nlp_pipeline_model.is_public thread = Thread(
target=_delete_tesseract_ocr_pipeline_model,
args=(current_app._get_current_object(), tesseract_ocr_pipeline_model_id)
)
thread.start()
return {}, 202
#region json-routes
@bp.route('/tesseract-ocr-pipeline-models/<hashid:tesseract_ocr_pipeline_model_id>/is_public', methods=['PUT'])
@login_required
@permission_required('CONTRIBUTE')
@content_negotiation(consumes='application/json', produces='application/json')
def update_tesseract_ocr_pipeline_model_is_public(tesseract_ocr_pipeline_model_id):
is_public = request.json
if not isinstance(is_public, bool):
response = jsonify('The request body must be a boolean')
response.status_code = 400
abort(response)
tesseract_ocr_pipeline_model = \
TesseractOCRPipelineModel.query.get_or_404(tesseract_ocr_pipeline_model_id)
tesseract_ocr_pipeline_model.is_public = is_public
db.session.commit() db.session.commit()
return {}, 201 response = jsonify(
f'Tesseract OCR Pipeline Model "{tesseract_ocr_pipeline_model.title}"'
f' is now {"public" if is_public else "private"}'
)
response.status_code = 200
return response
#endregion json-routes
#endregion tesseract-ocr-pipeline-models
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment