mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-11-04 04:12:45 +00:00 
			
		
		
		
	Allow multiple file upload and add title
This commit is contained in:
		@@ -1,35 +1,31 @@
 | 
			
		||||
from flask_wtf import FlaskForm
 | 
			
		||||
from flask_wtf.file import FileAllowed, FileRequired
 | 
			
		||||
from wtforms import FileField, SelectField, StringField, SubmitField
 | 
			
		||||
from wtforms import MultipleFileField, SelectField, StringField, SubmitField
 | 
			
		||||
from wtforms.validators import DataRequired, Length
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OCRJobForm(FlaskForm):
 | 
			
		||||
class CreateOCRJobForm(FlaskForm):
 | 
			
		||||
    description = StringField(
 | 
			
		||||
        'Description',
 | 
			
		||||
        validators=[DataRequired(), Length(1, 64)]
 | 
			
		||||
    )
 | 
			
		||||
    file = FileField(
 | 
			
		||||
        'File',
 | 
			
		||||
        validators=[
 | 
			
		||||
            FileAllowed(['pdf', 'tif', 'tiff']),
 | 
			
		||||
            FileRequired()
 | 
			
		||||
        ]
 | 
			
		||||
    )
 | 
			
		||||
    files = MultipleFileField('Files', validators=[DataRequired()])
 | 
			
		||||
    language = SelectField(
 | 
			
		||||
        'Language',
 | 
			
		||||
        choices=[
 | 
			
		||||
            ('', 'Choose your option'),
 | 
			
		||||
            ('eng', 'English'),
 | 
			
		||||
            ('enm', 'English, Middle (1100-1500)'),
 | 
			
		||||
            ('fra', 'French'),
 | 
			
		||||
            ('frm', 'French, Middle (ca. 1400-1600)'),
 | 
			
		||||
            ('deu', 'German'),
 | 
			
		||||
            ('frk', 'German Fraktur'),
 | 
			
		||||
            ('ita', 'Italian'),
 | 
			
		||||
            ('por', 'Portuguese'),
 | 
			
		||||
            ('spa', 'Spanish; Castilian')
 | 
			
		||||
        ],
 | 
			
		||||
        choices=[('', 'Choose your option'),
 | 
			
		||||
                 ('eng', 'English'),
 | 
			
		||||
                 ('enm', 'English, Middle (1100-1500)'),
 | 
			
		||||
                 ('fra', 'French'),
 | 
			
		||||
                 ('frm', 'French, Middle (ca. 1400-1600)'),
 | 
			
		||||
                 ('deu', 'German'),
 | 
			
		||||
                 ('frk', 'German Fraktur'),
 | 
			
		||||
                 ('ita', 'Italian'),
 | 
			
		||||
                 ('por', 'Portuguese'),
 | 
			
		||||
                 ('spa', 'Spanish; Castilian')
 | 
			
		||||
                 ],
 | 
			
		||||
        validators=[DataRequired()]
 | 
			
		||||
    )
 | 
			
		||||
    submit = SubmitField('Submit')
 | 
			
		||||
    submit = SubmitField('Create OCR job')
 | 
			
		||||
    title = StringField(
 | 
			
		||||
        'Title',
 | 
			
		||||
        validators=[DataRequired(), Length(1, 32)]
 | 
			
		||||
    )
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ from datetime import datetime
 | 
			
		||||
from flask import current_app, flash, redirect, render_template, url_for
 | 
			
		||||
from . import services
 | 
			
		||||
from flask_login import current_user, login_required
 | 
			
		||||
from .forms import OCRJobForm
 | 
			
		||||
from .forms import CreateOCRJobForm
 | 
			
		||||
from ..import swarm
 | 
			
		||||
from threading import Thread
 | 
			
		||||
import hashlib
 | 
			
		||||
@@ -12,8 +12,8 @@ import os
 | 
			
		||||
@services.route('/ocr', methods=['GET', 'POST'])
 | 
			
		||||
@login_required
 | 
			
		||||
def ocr():
 | 
			
		||||
    ocr_job_form = OCRJobForm()
 | 
			
		||||
    if ocr_job_form.validate_on_submit():
 | 
			
		||||
    create_ocr_job_form = CreateOCRJobForm()
 | 
			
		||||
    if create_ocr_job_form.validate_on_submit():
 | 
			
		||||
        app = current_app._get_current_object()
 | 
			
		||||
        id = hashlib.md5(
 | 
			
		||||
            (current_user.username + '_' + datetime.now().isoformat()).encode()
 | 
			
		||||
@@ -27,7 +27,7 @@ def ocr():
 | 
			
		||||
               'requested_cpus': 2,
 | 
			
		||||
               'requested_memory': 2048,
 | 
			
		||||
               'service': 'ocr',
 | 
			
		||||
               'service_args': {'lang': ocr_job_form.language.data,
 | 
			
		||||
               'service_args': {'lang': create_ocr_job_form.language.data,
 | 
			
		||||
                                'version': 'latest'
 | 
			
		||||
                                },
 | 
			
		||||
               'status': 'queued'
 | 
			
		||||
@@ -39,8 +39,8 @@ def ocr():
 | 
			
		||||
        except OSError:
 | 
			
		||||
            flash('OSError!')
 | 
			
		||||
        else:
 | 
			
		||||
            file = ocr_job_form.file.data
 | 
			
		||||
            file.save(os.path.join(dir, file.filename))
 | 
			
		||||
            for file in create_ocr_job_form.files.data:
 | 
			
		||||
                file.save(os.path.join(dir, file.filename))
 | 
			
		||||
            '''
 | 
			
		||||
            ' TODO: Let the scheduler run this job in the background.
 | 
			
		||||
            '
 | 
			
		||||
@@ -55,5 +55,5 @@ def ocr():
 | 
			
		||||
    return render_template(
 | 
			
		||||
        'services/ocr.html.j2',
 | 
			
		||||
        title='Optical Character Recognition',
 | 
			
		||||
        ocr_job_form=ocr_job_form
 | 
			
		||||
        create_ocr_job_form=create_ocr_job_form
 | 
			
		||||
    )
 | 
			
		||||
 
 | 
			
		||||
@@ -79,44 +79,54 @@
 | 
			
		||||
  <div class="card">
 | 
			
		||||
    <div class="card-content">
 | 
			
		||||
      <form method="POST" enctype="multipart/form-data">
 | 
			
		||||
        {{ ocr_job_form.hidden_tag() }}
 | 
			
		||||
        {{ create_ocr_job_form.hidden_tag() }}
 | 
			
		||||
        <div class="row">
 | 
			
		||||
          <div class="col s8">
 | 
			
		||||
          <div class="col s12 m4">
 | 
			
		||||
            <div class="input-field">
 | 
			
		||||
              <i class="material-icons prefix">title</i>
 | 
			
		||||
              {{ create_ocr_job_form.title() }}
 | 
			
		||||
              {{ create_ocr_job_form.title.label }}
 | 
			
		||||
              {% for error in create_ocr_job_form.title.errors %}
 | 
			
		||||
                <span class="helper-text red-text">{{ error }}</span>
 | 
			
		||||
              {% endfor %}
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="col s12 m8">
 | 
			
		||||
            <div class="input-field">
 | 
			
		||||
              <i class="material-icons prefix">description</i>
 | 
			
		||||
              {{ ocr_job_form.description(placeholder='Job description') }}
 | 
			
		||||
              {{ ocr_job_form.description.label }}
 | 
			
		||||
              {% for error in ocr_job_form.description.errors %}
 | 
			
		||||
              {{ create_ocr_job_form.description() }}
 | 
			
		||||
              {{ create_ocr_job_form.description.label }}
 | 
			
		||||
              {% for error in create_ocr_job_form.description.errors %}
 | 
			
		||||
                <span class="helper-text red-text">{{ error }}</span>
 | 
			
		||||
              {% endfor %}
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="col s4">
 | 
			
		||||
            <div class="input-field">
 | 
			
		||||
              <i class="material-icons prefix">language</i>
 | 
			
		||||
              {{ ocr_job_form.language() }}
 | 
			
		||||
              {{ ocr_job_form.language.label }}
 | 
			
		||||
              {% for error in ocr_job_form.language.errors %}
 | 
			
		||||
                <span class="helper-text red-text">{{ error }}</span>
 | 
			
		||||
              {% endfor %}
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="col s8">
 | 
			
		||||
          <div class="col s12 m8">
 | 
			
		||||
            <div class="file-field input-field">
 | 
			
		||||
              <div class="btn">
 | 
			
		||||
                <span>{{ ocr_job_form.file.label.text }}</span>
 | 
			
		||||
                {{ ocr_job_form.file() }}
 | 
			
		||||
                <span>{{ create_ocr_job_form.files.label.text }}</span>
 | 
			
		||||
                {{ create_ocr_job_form.files(accept='application/pdf, image/tiff') }}
 | 
			
		||||
              </div>
 | 
			
		||||
              <div class="file-path-wrapper">
 | 
			
		||||
                <input class="file-path validate" type="text">
 | 
			
		||||
              </div>
 | 
			
		||||
              {% for error in ocr_job_form.file.errors %}
 | 
			
		||||
              {% for error in create_ocr_job_form.files.errors %}
 | 
			
		||||
                <span class="helper-text red-text">{{ error }}</span>
 | 
			
		||||
              {% endfor %}
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="col s12 m4">
 | 
			
		||||
            <div class="input-field">
 | 
			
		||||
              <i class="material-icons prefix">language</i>
 | 
			
		||||
              {{ create_ocr_job_form.language() }}
 | 
			
		||||
              {{ create_ocr_job_form.language.label }}
 | 
			
		||||
              {% for error in create_ocr_job_form.language.errors %}
 | 
			
		||||
                <span class="helper-text red-text">{{ error }}</span>
 | 
			
		||||
              {% endfor %}
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        {{ ocr_job_form.submit(class='btn') }}
 | 
			
		||||
        {{ create_ocr_job_form.submit(class='btn') }}
 | 
			
		||||
      </form>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user