mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-11-03 20:02:47 +00:00 
			
		
		
		
	add all files for last commit
This commit is contained in:
		@@ -55,7 +55,6 @@ class CreateTesseractOCRPipelineModelForm(ContributionBaseForm):
 | 
			
		||||
    )
 | 
			
		||||
    
 | 
			
		||||
    def validate_tesseract_model_file(self, field):
 | 
			
		||||
        current_app.logger.warning(field.data.filename)
 | 
			
		||||
        if not field.data.filename.lower().endswith('.traineddata'):
 | 
			
		||||
            raise ValidationError('traineddata files only!')
 | 
			
		||||
 | 
			
		||||
@@ -80,7 +79,6 @@ class CreateSpaCyNLPPipelineModelForm(ContributionBaseForm):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    def validate_spacy_model_file(self, field):
 | 
			
		||||
        current_app.logger.warning(field.data.filename)
 | 
			
		||||
        if not field.data.filename.lower().endswith('.tar.gz'):
 | 
			
		||||
            raise ValidationError('.tar.gz files only!')
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -104,7 +104,7 @@ def create_tesseract_ocr_pipeline_model():
 | 
			
		||||
                publisher_url=form.publisher_url.data,
 | 
			
		||||
                publishing_url=form.publishing_url.data,
 | 
			
		||||
                publishing_year=form.publishing_year.data,
 | 
			
		||||
                shared=False,
 | 
			
		||||
                is_public=False,
 | 
			
		||||
                title=form.title.data,
 | 
			
		||||
                version=form.version.data,
 | 
			
		||||
                user=current_user
 | 
			
		||||
@@ -131,7 +131,7 @@ def toggle_tesseract_ocr_pipeline_model_public_status(tesseract_ocr_pipeline_mod
 | 
			
		||||
    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.shared = not tesseract_ocr_pipeline_model.shared
 | 
			
		||||
    tesseract_ocr_pipeline_model.is_public = not tesseract_ocr_pipeline_model.is_public
 | 
			
		||||
    db.session.commit()
 | 
			
		||||
    return {}, 201
 | 
			
		||||
 | 
			
		||||
@@ -201,7 +201,7 @@ def create_spacy_nlp_pipeline_model():
 | 
			
		||||
                publisher_url=form.publisher_url.data,
 | 
			
		||||
                publishing_url=form.publishing_url.data,
 | 
			
		||||
                publishing_year=form.publishing_year.data,
 | 
			
		||||
                shared=False,
 | 
			
		||||
                is_public=False,
 | 
			
		||||
                title=form.title.data,
 | 
			
		||||
                version=form.version.data,
 | 
			
		||||
                user=current_user
 | 
			
		||||
@@ -228,6 +228,6 @@ def toggle_spacy_nlp_pipeline_model_public_status(spacy_nlp_pipeline_model_id):
 | 
			
		||||
    spacy_nlp_pipeline_model = SpaCyNLPPipelineModel.query.get_or_404(spacy_nlp_pipeline_model_id)
 | 
			
		||||
    if not (spacy_nlp_pipeline_model.user == current_user or current_user.is_administrator()):
 | 
			
		||||
        abort(403)
 | 
			
		||||
    spacy_nlp_pipeline_model.shared = not spacy_nlp_pipeline_model.shared
 | 
			
		||||
    spacy_nlp_pipeline_model.is_public = not spacy_nlp_pipeline_model.is_public
 | 
			
		||||
    db.session.commit()
 | 
			
		||||
    return {}, 201
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,17 @@
 | 
			
		||||
from flask_wtf import FlaskForm
 | 
			
		||||
from flask_wtf.file import FileField, FileRequired
 | 
			
		||||
from wtforms import StringField, SubmitField, ValidationError, IntegerField
 | 
			
		||||
from wtforms import (
 | 
			
		||||
    StringField,
 | 
			
		||||
    SubmitField,
 | 
			
		||||
    TextAreaField,
 | 
			
		||||
    ValidationError,
 | 
			
		||||
    IntegerField
 | 
			
		||||
)
 | 
			
		||||
from wtforms.validators import InputRequired, Length
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CreateCorpusForm(FlaskForm):
 | 
			
		||||
    description = StringField(
 | 
			
		||||
class CorpusBaseForm(FlaskForm):
 | 
			
		||||
    description = TextAreaField(
 | 
			
		||||
        'Description',
 | 
			
		||||
        validators=[InputRequired(), Length(max=255)]
 | 
			
		||||
    )
 | 
			
		||||
@@ -13,6 +19,20 @@ class CreateCorpusForm(FlaskForm):
 | 
			
		||||
    submit = SubmitField()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CreateCorpusForm(CorpusBaseForm):
 | 
			
		||||
    def __init__(self, *args, **kwargs):
 | 
			
		||||
        if 'prefix' not in kwargs:
 | 
			
		||||
            kwargs['prefix'] = 'create-corpus-form'
 | 
			
		||||
        super().__init__(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UpdateCorpusForm(CorpusBaseForm):
 | 
			
		||||
    def __init__(self, *args, **kwargs):
 | 
			
		||||
        if 'prefix' not in kwargs:
 | 
			
		||||
            kwargs['prefix'] = 'update-corpus-form'
 | 
			
		||||
        super().__init__(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CorpusFileBaseForm(FlaskForm):
 | 
			
		||||
    author = StringField(
 | 
			
		||||
        'Author',
 | 
			
		||||
@@ -41,13 +61,21 @@ class CorpusFileBaseForm(FlaskForm):
 | 
			
		||||
class CreateCorpusFileForm(CorpusFileBaseForm):
 | 
			
		||||
    vrt = FileField('File', validators=[FileRequired()])
 | 
			
		||||
 | 
			
		||||
    def __init__(self, *args, **kwargs):
 | 
			
		||||
        if 'prefix' not in kwargs:
 | 
			
		||||
            kwargs['prefix'] = 'create-corpus-file-form'
 | 
			
		||||
        super().__init__(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
    def validate_vrt(self, field):
 | 
			
		||||
        if not field.data.filename.lower().endswith('.vrt'):
 | 
			
		||||
            raise ValidationError('VRT files only!')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class EditCorpusFileForm(CorpusFileBaseForm):
 | 
			
		||||
    pass
 | 
			
		||||
class UpdateCorpusFileForm(CorpusFileBaseForm):
 | 
			
		||||
    def __init__(self, *args, **kwargs):
 | 
			
		||||
        if 'prefix' not in kwargs:
 | 
			
		||||
            kwargs['prefix'] = 'update-corpus-file-form'
 | 
			
		||||
        super().__init__(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ImportCorpusForm(FlaskForm):
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,26 @@ import os
 | 
			
		||||
from app import db
 | 
			
		||||
from app.models import Corpus, CorpusFile, CorpusStatus
 | 
			
		||||
from . import bp
 | 
			
		||||
from .forms import CreateCorpusFileForm, CreateCorpusForm, EditCorpusFileForm
 | 
			
		||||
from .forms import CreateCorpusFileForm, CreateCorpusForm, UpdateCorpusFileForm
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def user_can_read_corpus(user, corpus):
 | 
			
		||||
    return corpus.user == user or user.is_administrator() or corpus.is_public
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def user_can_update_corpus(user, corpus):
 | 
			
		||||
    return corpus.user == user or user.is_administrator()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def user_can_delete_corpus(user, corpus):
 | 
			
		||||
    return user_can_update_corpus(user, corpus)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@bp.route('')
 | 
			
		||||
@login_required
 | 
			
		||||
def corpora():
 | 
			
		||||
    corpora = Corpus.query.filter(Corpus.user_id == current_user.id | Corpus.is_public == True).all()
 | 
			
		||||
    return render_template('corpora/corpora.html', corpora=corpora)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@bp.route('/create', methods=['GET', 'POST'])
 | 
			
		||||
@@ -46,7 +65,7 @@ def create_corpus():
 | 
			
		||||
@login_required
 | 
			
		||||
def corpus(corpus_id):
 | 
			
		||||
    corpus = Corpus.query.get_or_404(corpus_id)
 | 
			
		||||
    if not (corpus.user == current_user or current_user.is_administrator()):
 | 
			
		||||
    if not user_can_read_corpus(current_user, corpus):
 | 
			
		||||
        abort(403)
 | 
			
		||||
    return render_template(
 | 
			
		||||
        'corpora/corpus.html.j2',
 | 
			
		||||
@@ -55,6 +74,19 @@ def corpus(corpus_id):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# @bp.route('/<hashid:corpus_id>/update')
 | 
			
		||||
# @login_required
 | 
			
		||||
# def update_corpus(corpus_id):
 | 
			
		||||
#     corpus = Corpus.query.get_or_404(corpus_id)
 | 
			
		||||
#     if not user_can_update_corpus(current_user, corpus):
 | 
			
		||||
#         abort(403)
 | 
			
		||||
#     return render_template(
 | 
			
		||||
#         'corpora/update_corpus.html.j2',
 | 
			
		||||
#         corpus=corpus,
 | 
			
		||||
#         title='Corpus'
 | 
			
		||||
#     )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@bp.route('/<hashid:corpus_id>', methods=['DELETE'])
 | 
			
		||||
@login_required
 | 
			
		||||
def delete_corpus(corpus_id):
 | 
			
		||||
@@ -65,7 +97,7 @@ def delete_corpus(corpus_id):
 | 
			
		||||
            db.session.commit()
 | 
			
		||||
 | 
			
		||||
    corpus = Corpus.query.get_or_404(corpus_id)
 | 
			
		||||
    if not (corpus.user == current_user or current_user.is_administrator()):
 | 
			
		||||
    if not user_can_delete_corpus(current_user, corpus):
 | 
			
		||||
        abort(403)
 | 
			
		||||
    thread = Thread(
 | 
			
		||||
        target=_delete_corpus,
 | 
			
		||||
@@ -79,6 +111,8 @@ def delete_corpus(corpus_id):
 | 
			
		||||
@login_required
 | 
			
		||||
def analyse_corpus(corpus_id):
 | 
			
		||||
    corpus = Corpus.query.get_or_404(corpus_id)
 | 
			
		||||
    if not user_can_read_corpus(current_user, corpus):
 | 
			
		||||
        abort(403)
 | 
			
		||||
    return render_template(
 | 
			
		||||
        'corpora/analyse_corpus.html.j2',
 | 
			
		||||
        corpus=corpus,
 | 
			
		||||
@@ -96,7 +130,7 @@ def build_corpus(corpus_id):
 | 
			
		||||
            db.session.commit()
 | 
			
		||||
 | 
			
		||||
    corpus = Corpus.query.get_or_404(corpus_id)
 | 
			
		||||
    if not (corpus.user == current_user or current_user.is_administrator()):
 | 
			
		||||
    if not user_can_update_corpus(current_user, corpus):
 | 
			
		||||
        abort(403)
 | 
			
		||||
    # Check if the corpus has corpus files
 | 
			
		||||
    if not corpus.files.all():
 | 
			
		||||
@@ -114,7 +148,7 @@ def build_corpus(corpus_id):
 | 
			
		||||
@login_required
 | 
			
		||||
def create_corpus_file(corpus_id):
 | 
			
		||||
    corpus = Corpus.query.get_or_404(corpus_id)
 | 
			
		||||
    if not (corpus.user == current_user or current_user.is_administrator()):
 | 
			
		||||
    if not user_can_update_corpus(current_user, corpus):
 | 
			
		||||
        abort(403)
 | 
			
		||||
    form = CreateCorpusFileForm(prefix='create-corpus-file-form')
 | 
			
		||||
    if form.is_submitted():
 | 
			
		||||
@@ -157,16 +191,13 @@ def create_corpus_file(corpus_id):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@bp.route('/<hashid:corpus_id>/files/<hashid:corpus_file_id>',
 | 
			
		||||
          methods=['GET', 'POST'])
 | 
			
		||||
@bp.route('/<hashid:corpus_id>/files/<hashid:corpus_file_id>', methods=['GET', 'POST'])
 | 
			
		||||
@login_required
 | 
			
		||||
def corpus_file(corpus_id, corpus_file_id):
 | 
			
		||||
    corpus_file = CorpusFile.query.get_or_404(corpus_file_id)
 | 
			
		||||
    if corpus_file.corpus.id != corpus_id:
 | 
			
		||||
        abort(404)
 | 
			
		||||
    corpus_file = CorpusFile.query.filter_by(corpus_id = corpus_id, id=corpus_file_id).first_or_404()
 | 
			
		||||
    if not (corpus_file.corpus.user == current_user or current_user.is_administrator()):
 | 
			
		||||
        abort(403)
 | 
			
		||||
    form = EditCorpusFileForm(
 | 
			
		||||
    form = UpdateCorpusFileForm(
 | 
			
		||||
        data=corpus_file.to_json_serializeable(),
 | 
			
		||||
        prefix='edit-corpus-file-form'
 | 
			
		||||
    )
 | 
			
		||||
@@ -196,9 +227,7 @@ def delete_corpus_file(corpus_id, corpus_file_id):
 | 
			
		||||
            corpus_file.delete()
 | 
			
		||||
            db.session.commit()
 | 
			
		||||
 | 
			
		||||
    corpus_file = CorpusFile.query.get_or_404(corpus_file_id)
 | 
			
		||||
    if corpus_file.corpus.id != corpus_id:
 | 
			
		||||
        abort(404)
 | 
			
		||||
    corpus_file = CorpusFile.query.filter_by(corpus_id = corpus_id, id=corpus_file_id).first_or_404()
 | 
			
		||||
    if not (corpus_file.corpus.user == current_user or current_user.is_administrator()):
 | 
			
		||||
        abort(403)
 | 
			
		||||
    thread = Thread(
 | 
			
		||||
@@ -212,9 +241,7 @@ def delete_corpus_file(corpus_id, corpus_file_id):
 | 
			
		||||
@bp.route('/<hashid:corpus_id>/files/<hashid:corpus_file_id>/download')
 | 
			
		||||
@login_required
 | 
			
		||||
def download_corpus_file(corpus_id, corpus_file_id):
 | 
			
		||||
    corpus_file = CorpusFile.query.get_or_404(corpus_file_id)
 | 
			
		||||
    if corpus_file.corpus.id != corpus_id:
 | 
			
		||||
        abort(404)
 | 
			
		||||
    corpus_file = CorpusFile.query.filter_by(corpus_id = corpus_id, id=corpus_file_id).first_or_404()
 | 
			
		||||
    if not (corpus_file.corpus.user == current_user or current_user.is_administrator()):
 | 
			
		||||
        abort(403)
 | 
			
		||||
    return send_from_directory(
 | 
			
		||||
 
 | 
			
		||||
@@ -46,13 +46,13 @@
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Set the data-length attribute on inputs with the maxlength attribute
 | 
			
		||||
  for (let inputElement of document.querySelectorAll('input[maxlength]')) {
 | 
			
		||||
  for (let inputElement of document.querySelectorAll('input[maxlength], textarea[maxlength]')) {
 | 
			
		||||
    inputElement.dataset.length = inputElement.getAttribute('maxlength');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Initialize components
 | 
			
		||||
  M.AutoInit();
 | 
			
		||||
  M.CharacterCounter.init(document.querySelectorAll('input[data-length][type="text"], input[data-length][type="email"], input[data-length][type="search"], input[data-length][type="password"], input[data-length][type="tel"], input[data-length][type="url"]'));
 | 
			
		||||
  M.CharacterCounter.init(document.querySelectorAll('input[data-length][type="text"], input[data-length][type="email"], input[data-length][type="search"], input[data-length][type="password"], input[data-length][type="tel"], input[data-length][type="url"], textarea[data-length]'));
 | 
			
		||||
  M.Dropdown.init(
 | 
			
		||||
    document.querySelectorAll('#nav-more-dropdown-trigger'),
 | 
			
		||||
    {alignment: 'right', constrainWidth: false, coverTrigger: false}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,28 +9,19 @@
 | 
			
		||||
  <div class="row">
 | 
			
		||||
    <div class="col s12">
 | 
			
		||||
      <h1 id="title">{{ title }}</h1>
 | 
			
		||||
      <p>Here you can create a new corpus, just choose a title and a description which will help to identify it later. After the corpus has been created, annotated texts in <i>verticalized text format</i> can be added to it on the corpus overview page.</p>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="col s12 m4">
 | 
			
		||||
      <p>Fill out the following form to add a corpus to your corpora.</p>
 | 
			
		||||
      <a class="waves-effect waves-light btn" href="{{ url_for('main.dashboard') }}"><i class="material-icons left">arrow_back</i>Back to dashboard</a>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="col s12 m8">
 | 
			
		||||
    <div class="col s12">
 | 
			
		||||
      <div class="card">
 | 
			
		||||
        <form method="POST">
 | 
			
		||||
          <div class="card-content">
 | 
			
		||||
            {{ form.hidden_tag() }}
 | 
			
		||||
            <div class="row">
 | 
			
		||||
              <div class="col s12 m4">
 | 
			
		||||
                {{ wtf.render_field(form.title, material_icon='title') }}
 | 
			
		||||
              </div>
 | 
			
		||||
              <div class="col s12 m8">
 | 
			
		||||
                {{ wtf.render_field(form.description, material_icon='description') }}
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            {{ wtf.render_field(form.title, material_icon='title') }}
 | 
			
		||||
            {{ wtf.render_field(form.description, material_icon='description') }}
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="card-action right-align">
 | 
			
		||||
            <a class="waves-effect waves-light btn red" href="{{ url_for('main.dashboard', _anchor='corpora') }}"><i class="material-icons left">close</i>Cancel</a>
 | 
			
		||||
            {{ wtf.render_field(form.submit, material_icon='send') }}
 | 
			
		||||
          </div>
 | 
			
		||||
        </form>
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="card-action right-align">
 | 
			
		||||
            <a class="waves-effect waves-light btn red" href="{{ url_for('.corpus', corpus_id=corpus.id) }}"><i class="material-icons left">close</i>Cancel</a>
 | 
			
		||||
            {{ wtf.render_field(form.submit, material_icon='send') }}
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user