from flask import ( abort, flash, Markup, redirect, render_template, url_for ) 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, ) from . import bp from .forms import CreateCorpusForm @bp.route('/create', methods=['GET', 'POST']) @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', form=form, title='Create corpus' ) @bp.route('/') @login_required def corpus(corpus_id): corpus = Corpus.query.get_or_404(corpus_id) corpus_follower_roles = CorpusFollowerRole.query.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', corpus=corpus, corpus_follower_roles=corpus_follower_roles, title='Corpus' ) 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() corpus_files = [x.to_json_serializeable() for x in corpus.files] owner = corpus.user.to_json_serializeable() return render_template( 'corpora/public_corpus.html.j2', corpus=corpus, corpus_files=corpus_files, cfa=cfa, owner=owner, title='Corpus', ) abort(403) @bp.route('//analyse') @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']) @login_required def import_corpus(): abort(503) @bp.route('//export') @login_required def export_corpus(corpus_id): abort(503)