mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-10-31 02:32:45 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			164 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from app.utils import background_delete_job, background_delete_corpus
 | |
| from flask import (abort, current_app, flash, redirect, request,
 | |
|                    render_template, url_for, send_from_directory)
 | |
| from flask_login import current_user, login_required
 | |
| from . import main
 | |
| from .forms import AddCorpusFileForm, CreateCorpusForm, QueryForm
 | |
| from .. import db
 | |
| from ..models import Corpus, CorpusFile, Job, JobInput, JobResult
 | |
| from werkzeug.utils import secure_filename
 | |
| import os
 | |
| import threading
 | |
| import logging
 | |
| 
 | |
| 
 | |
| @main.route('/')
 | |
| def index():
 | |
|     return render_template('main/index.html.j2', title='Opaque')
 | |
| 
 | |
| 
 | |
| @main.route('/corpora/<int:corpus_id>', methods=['GET', 'POST'])
 | |
| @login_required
 | |
| def corpus(corpus_id):
 | |
|     corpus = Corpus.query.get_or_404(corpus_id)
 | |
|     if not (corpus.creator == current_user
 | |
|             or current_user.is_administrator()):
 | |
|         abort(403)
 | |
|     add_corpus_file_form = AddCorpusFileForm()
 | |
|     if add_corpus_file_form.validate_on_submit():
 | |
|         filename = secure_filename(add_corpus_file_form.file.data.filename)
 | |
|         for corpus_file in corpus.files:
 | |
|             if filename == corpus_file.filename:
 | |
|                 flash('File already registered to this corpus.')
 | |
|                 return redirect(url_for('main.corpus', corpus_id=corpus_id))
 | |
|         # Gather information to create new corpus file database entry
 | |
|         author = add_corpus_file_form.author.data
 | |
|         dir = os.path.join(str(corpus.user_id), 'corpora', str(corpus.id))
 | |
|         file = add_corpus_file_form.file.data
 | |
|         publishing_year = add_corpus_file_form.publishing_year.data
 | |
|         title = add_corpus_file_form.title.data
 | |
|         # Save the file
 | |
|         file_dir = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'],
 | |
|                                 dir)
 | |
|         file.save(os.path.join(file_dir, filename))
 | |
|         corpus_file = CorpusFile(author=author,
 | |
|                                  corpus=corpus,
 | |
|                                  dir=dir,
 | |
|                                  filename=filename,
 | |
|                                  publishing_year=publishing_year,
 | |
|                                  title=title)
 | |
|         db.session.add(corpus_file)
 | |
|         db.session.commit()
 | |
|         flash('Corpus file added!')
 | |
|         return redirect(url_for('main.corpus', corpus_id=corpus_id))
 | |
|     return render_template('main/corpora/corpus.html.j2',
 | |
|                            add_corpus_file_form=add_corpus_file_form,
 | |
|                            corpus=corpus,
 | |
|                            title='Corpus')
 | |
| 
 | |
| 
 | |
| @main.route('/corpora/<int:corpus_id>/delete')
 | |
| @login_required
 | |
| def delete_corpus(corpus_id):
 | |
|     delete_thread = threading.Thread(
 | |
|         target=background_delete_corpus,
 | |
|         args=(current_app._get_current_object(), corpus_id)
 | |
|     )
 | |
|     delete_thread.start()
 | |
|     flash('Corpus has been deleted!')
 | |
|     return redirect(url_for('main.dashboard'))
 | |
| 
 | |
| 
 | |
| @main.route('/corpora/<int:corpus_id>/download')
 | |
| @login_required
 | |
| def corpus_download(corpus_id):
 | |
|     corpus_file_id = request.args.get('corpus_file_id')
 | |
|     corpus_file = CorpusFile.query.get_or_404(corpus_file_id)
 | |
|     if not corpus_file.corpus_id == corpus_id:
 | |
|         abort(404)
 | |
|     if not (corpus_file.corpus.creator == current_user
 | |
|             or current_user.is_administrator()):
 | |
|         abort(403)
 | |
|     dir = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'],
 | |
|                        corpus_file.dir)
 | |
|     return send_from_directory(as_attachment=True,
 | |
|                                directory=dir,
 | |
|                                filename=corpus_file.filename)
 | |
| 
 | |
| 
 | |
| @main.route('/corpora/<int:corpus_id>/analysis', methods=['GET', 'POST'])
 | |
| @login_required
 | |
| def corpus_analysis(corpus_id):
 | |
|     corpus = Corpus.query.get_or_404(corpus_id)
 | |
|     form = QueryForm()
 | |
|     if form.validate_on_submit():
 | |
|         logger = logging.getLogger(__name__)
 | |
|         logger.warning('Data has been sent!')
 | |
|         flash('Query has been sent!')
 | |
|         return redirect(url_for('main.corpus_analysis', corpus_id=corpus_id))
 | |
|     return render_template('main/corpora/corpus_analysis.html.j2',
 | |
|                            corpus=corpus,
 | |
|                            form=form,
 | |
|                            title='Corpus: ' + corpus.title)
 | |
| 
 | |
| 
 | |
| @main.route('/dashboard', methods=['GET', 'POST'])
 | |
| @login_required
 | |
| def dashboard():
 | |
|     create_corpus_form = CreateCorpusForm()
 | |
|     if create_corpus_form.validate_on_submit():
 | |
|         corpus = Corpus(creator=current_user._get_current_object(),
 | |
|                         description=create_corpus_form.description.data,
 | |
|                         title=create_corpus_form.title.data)
 | |
|         db.session.add(corpus)
 | |
|         db.session.commit()
 | |
|         flash('Corpus created!')
 | |
|         return redirect(url_for('main.dashboard'))
 | |
|     return render_template('main/dashboard.html.j2',
 | |
|                            create_corpus_form=create_corpus_form,
 | |
|                            title='Dashboard')
 | |
| 
 | |
| 
 | |
| @main.route('/jobs/<int:job_id>')
 | |
| @login_required
 | |
| def job(job_id):
 | |
|     job = Job.query.get_or_404(job_id)
 | |
|     if not (job.creator == current_user or current_user.is_administrator()):
 | |
|         abort(403)
 | |
|     return render_template('main/jobs/job.html.j2', job=job, title='Job')
 | |
| 
 | |
| 
 | |
| @main.route('/jobs/<int:job_id>/download')
 | |
| @login_required
 | |
| def job_download(job_id):
 | |
|     ressource_id = request.args.get('ressource_id')
 | |
|     ressource_type = request.args.get('ressource_type')
 | |
|     if ressource_type == 'input':
 | |
|         ressource = JobInput.query.get_or_404(ressource_id)
 | |
|     elif ressource_type == 'result':
 | |
|         ressource = JobResult.query.get_or_404(ressource_id)
 | |
|     else:
 | |
|         abort(400)
 | |
|     if not ressource.job_id == job_id:
 | |
|         abort(404)
 | |
|     if not (ressource.job.creator == current_user
 | |
|             or current_user.is_administrator()):
 | |
|         abort(403)
 | |
|     dir = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'],
 | |
|                        ressource.dir)
 | |
|     return send_from_directory(as_attachment=True,
 | |
|                                directory=dir,
 | |
|                                filename=ressource.filename)
 | |
| 
 | |
| 
 | |
| @main.route('/jobs/<int:job_id>/delete')
 | |
| @login_required
 | |
| def delete_job(job_id):
 | |
|     delete_thread = threading.Thread(
 | |
|         target=background_delete_job,
 | |
|         args=(current_app._get_current_object(), job_id)
 | |
|     )
 | |
|     delete_thread.start()
 | |
|     flash('Job has been deleted!')
 | |
|     return redirect(url_for('main.dashboard'))
 |