from flask import abort, flash, redirect, render_template, url_for from flask_breadcrumbs import register_breadcrumb from flask_login import current_user, login_required from .decorators import corpus_follower_permission_required from app import db from app.models import ( Corpus, CorpusFollowerAssociation, CorpusFollowerRole, User ) from . import bp from .forms import CreateCorpusForm from .utils import ( corpus_endpoint_arguments_constructor as corpus_eac, corpus_dynamic_list_constructor as corpus_dlc ) @bp.route('') @register_breadcrumb(bp, '.', 'IMy Corpora') @login_required def corpora(): return redirect(url_for('main.dashboard', _anchor='corpora')) @bp.route('/create', methods=['GET', 'POST']) @register_breadcrumb(bp, '.create', 'Create') @login_required def create_corpus(): form = CreateCorpusForm() if form.validate_on_submit(): try: corpus = Corpus.create( title=form.title.data, description=form.description.data, user=current_user ) except OSError: abort(500) db.session.commit() flash(f'Corpus "{corpus.title}" created', 'corpus') return redirect(corpus.url) return render_template( 'corpora/create_corpus.html.j2', title='Create corpus', form=form ) @bp.route('/') @register_breadcrumb(bp, '.entity', '', dynamic_list_constructor=corpus_dlc) @login_required def corpus(corpus_id): corpus = Corpus.query.get_or_404(corpus_id) corpus_follower_roles = CorpusFollowerRole.query.all() users = User.query.filter(User.is_public == True, User.id != current_user.id).all() # TODO: Add URL query option to toggle view if corpus.user == current_user or current_user.is_administrator(): return render_template( 'corpora/corpus.html.j2', title=corpus.title, corpus=corpus, corpus_follower_roles=corpus_follower_roles, users = users ) if current_user.is_following_corpus(corpus) or corpus.is_public: cfa = CorpusFollowerAssociation.query.filter_by(corpus_id=corpus_id, follower_id=current_user.id).first_or_404() return render_template( 'corpora/public_corpus.html.j2', title=corpus.title, corpus=corpus, cfa=cfa ) abort(403) @bp.route('//analyse') @register_breadcrumb(bp, '.entity.analyse', 'Analyse', endpoint_arguments_constructor=corpus_eac) @login_required @corpus_follower_permission_required('VIEW') def analyse_corpus(corpus_id): corpus = Corpus.query.get_or_404(corpus_id) return render_template( 'corpora/analyse_corpus.html.j2', corpus=corpus, title=f'Analyse Corpus {corpus.title}' ) @bp.route('//follow/') @login_required def follow_corpus(corpus_id, token): corpus = Corpus.query.get_or_404(corpus_id) if current_user.follow_corpus_by_token(token): db.session.commit() flash(f'You are following "{corpus.title}" now', category='corpus') return redirect(url_for('corpora.corpus', corpus_id=corpus_id)) abort(403) @bp.route('/import', methods=['GET', 'POST']) @register_breadcrumb(bp, '.import', 'Import') @login_required def import_corpus(): abort(503) @bp.route('//export') @register_breadcrumb(bp, '.entity.export', 'Export', endpoint_arguments_constructor=corpus_eac) @login_required def export_corpus(corpus_id): abort(503)