from flask import abort, current_app, flash, Markup, render_template, url_for from flask_login import login_required, current_user from threading import Thread from app import db from app.decorators import admin_required, permission_required from app.models import Permission, SpaCyNLPPipelineModel, TesseractOCRPipelineModel from . import bp from .forms import TesseractOCRModelContributionForm, EditForm, SpacyNLPModelContributionForm @bp.before_request @login_required @permission_required(Permission.CONTRIBUTE) def before_request(): pass @bp.route('/') @login_required @admin_required def contributions(): tesseract_ocr_user_models = [ x for x in current_user.tesseract_ocr_pipeline_models ] spacy_nlp_user_models = [ x for x in current_user.spacy_nlp_pipeline_models ] return render_template( 'contributions/contribution_overview.html.j2', tesseract_ocr_user_models=tesseract_ocr_user_models, spacy_nlp_user_models=spacy_nlp_user_models, userId = current_user.hashid, title='Contribution Overview' ) @bp.route('/edit-tesseract-model/', methods=['GET', 'POST']) @login_required 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 = EditForm(prefix='tesseract-ocr-model-edit-form') if form.validate_on_submit(): if tesseract_ocr_pipeline_model.title != form.title.data: tesseract_ocr_pipeline_model.title = form.title.data if tesseract_ocr_pipeline_model.description != form.description.data: tesseract_ocr_pipeline_model.description = form.description.data if tesseract_ocr_pipeline_model.publisher != form.publisher.data: tesseract_ocr_pipeline_model.publisher = form.publisher.data if tesseract_ocr_pipeline_model.publishing_year != form.publishing_year.data: tesseract_ocr_pipeline_model.publishing_year = form.publishing_year.data if tesseract_ocr_pipeline_model.publisher_url != form.publisher_url.data: tesseract_ocr_pipeline_model.publisher_url = form.publisher_url.data if tesseract_ocr_pipeline_model.publishing_url != form.publishing_url.data: tesseract_ocr_pipeline_model.publishing_url = form.publishing_url.data if tesseract_ocr_pipeline_model.version != form.version.data: tesseract_ocr_pipeline_model.version = form.version.data if tesseract_ocr_pipeline_model.shared != form.shared.data: tesseract_ocr_pipeline_model.shared = form.shared.data db.session.commit() message = Markup(f'Model "{tesseract_ocr_pipeline_model.title}" updated') flash(message, category='corpus') return {}, 201, {'Location': url_for('contributions.contributions')} form.prefill(tesseract_ocr_pipeline_model) return render_template( 'contributions/tesseract_ocr_pipeline_model.html.j2', tesseract_ocr_pipeline_model=tesseract_ocr_pipeline_model, form=form, title='Edit your Tesseract OCR model' ) @bp.route('/edit-tesseract-model/', methods=['DELETE']) @login_required def delete_tesseract_model(tesseract_ocr_pipeline_model_id): def _delete_tesseract_model(app, tesseract_ocr_pipeline_model_id): with app.app_context(): model = TesseractOCRPipelineModel.query.get(tesseract_ocr_pipeline_model_id) model.delete() db.session.commit() model = TesseractOCRPipelineModel.query.get_or_404(tesseract_ocr_pipeline_model_id) if not (model.user == current_user or current_user.is_administrator()): abort(403) thread = Thread( target=_delete_tesseract_model, args=(current_app._get_current_object(), tesseract_ocr_pipeline_model_id) ) thread.start() return {}, 202 @bp.route('/add-tesseract-ocr-pipeline-model', methods=['GET', 'POST']) def add_tesseract_ocr_pipeline_model(): form = TesseractOCRModelContributionForm( prefix='contribute-tesseract-ocr-pipeline-model-form' ) if form.is_submitted(): if not form.validate(): response = {'errors': form.errors} return response, 400 try: tesseract_ocr_model = TesseractOCRPipelineModel.create( form.tesseract_model_file.data, compatible_service_versions=form.compatible_service_versions.data, description=form.description.data, publisher=form.publisher.data, publisher_url=form.publisher_url.data, publishing_url=form.publishing_url.data, publishing_year=form.publishing_year.data, shared=form.shared.data, title=form.title.data, version=form.version.data, user=current_user ) except OSError: abort(500) db.session.commit() message = Markup(f'Model "{tesseract_ocr_model.title}" created') flash(message) return {}, 201, {'Location': url_for('contributions.contributions')} tesseract_ocr_pipeline_models = [ x for x in TesseractOCRPipelineModel.query.all() ] return render_template( 'contributions/contribute_tesseract_ocr_models.html.j2', form=form, tesseract_ocr_pipeline_models=tesseract_ocr_pipeline_models, title='Tesseract OCR Model Contribution' ) @bp.route('/edit-spacy-model//', methods=['GET', 'POST']) @login_required def spacy_nlp_pipeline_model(spacy_nlp_pipeline_model_id): spacy_nlp_pipeline_model = SpaCyNLPPipelineModel.query.get_or_404( spacy_nlp_pipeline_model_id ) form = EditForm(prefix='spacy-nlp-model-edit-form') if form.validate_on_submit(): if spacy_nlp_pipeline_model.title != form.title.data: spacy_nlp_pipeline_model.title = form.title.data if spacy_nlp_pipeline_model.description != form.description.data: spacy_nlp_pipeline_model.description = form.description.data if spacy_nlp_pipeline_model.publisher != form.publisher.data: spacy_nlp_pipeline_model.publisher = form.publisher.data if spacy_nlp_pipeline_model.publishing_year != form.publishing_year.data: spacy_nlp_pipeline_model.publishing_year = form.publishing_year.data if spacy_nlp_pipeline_model.publisher_url != form.publisher_url.data: spacy_nlp_pipeline_model.publisher_url = form.publisher_url.data if spacy_nlp_pipeline_model.publishing_url != form.publishing_url.data: spacy_nlp_pipeline_model.publishing_url = form.publishing_url.data if spacy_nlp_pipeline_model.version != form.version.data: spacy_nlp_pipeline_model.version = form.version.data if spacy_nlp_pipeline_model.shared != form.shared.data: spacy_nlp_pipeline_model.shared = form.shared.data db.session.commit() message = Markup(f'Model "{spacy_nlp_pipeline_model.title}" updated') flash(message, category='corpus') return {}, 201, {'Location': url_for('contributions.contributions')} form.prefill(spacy_nlp_pipeline_model) return render_template( 'contributions/spacy_nlp_pipeline_model.html.j2', spacy_nlp_pipeline_model=spacy_nlp_pipeline_model, form=form, title='Edit your spaCy NLP model' ) @bp.route('/edit-spacy-model/', methods=['DELETE']) @login_required def delete_spacy_model(spacy_nlp_pipeline_model_id): def _delete_spacy_model(app, spacy_nlp_pipeline_model_id): with app.app_context(): model = SpaCyNLPPipelineModel.query.get(spacy_nlp_pipeline_model_id) model.delete() db.session.commit() model = SpaCyNLPPipelineModel.query.get_or_404(spacy_nlp_pipeline_model_id) if not (model.user == current_user or current_user.is_administrator()): abort(403) thread = Thread( target=_delete_spacy_model, args=(current_app._get_current_object(), spacy_nlp_pipeline_model_id) ) thread.start() return {}, 202 @bp.route('/add-spacy-nlp-pipeline-model', methods=['GET', 'POST']) def add_spacy_nlp_pipeline_model(): form = SpacyNLPModelContributionForm(prefix='contribute-spacy-nlp-pipeline-model-form') if form.is_submitted(): if not form.validate(): response = {'errors': form.errors} return response, 400 try: spacy_nlp_model = SpaCyNLPPipelineModel.create( form.spacy_model_file.data, compatible_service_versions=form.compatible_service_versions.data, description=form.description.data, publisher=form.publisher.data, publisher_url=form.publisher_url.data, publishing_url=form.publishing_url.data, publishing_year=form.publishing_year.data, shared=form.shared.data, title=form.title.data, version=form.version.data, user=current_user ) except OSError: abort(500) db.session.commit() message = Markup(f'Model "{spacy_nlp_model.title}" created') flash(message) return {}, 201, {'Location': url_for('contributions.contributions')} spacy_nlp_pipeline_models = [ x for x in SpaCyNLPPipelineModel.query.all() ] return render_template( 'contributions/contribute_spacy_nlp_models.html.j2', form=form, spacy_nlp_pipeline_models=spacy_nlp_pipeline_models, title='spaCy NLP Model Contribution' )