mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-10-31 18:42:45 +00:00 
			
		
		
		
	Add input options for ocr job creation.
This commit is contained in:
		| @@ -1,6 +1,35 @@ | |||||||
| from flask_wtf import FlaskForm | from flask_wtf import FlaskForm | ||||||
| from wtforms import SubmitField | from flask_wtf.file import FileAllowed, FileRequired | ||||||
|  | from wtforms import FileField, SelectField, StringField, SubmitField | ||||||
|  | from wtforms.validators import DataRequired, Length | ||||||
|  |  | ||||||
|  |  | ||||||
| class OCRJobForm(FlaskForm): | class OCRJobForm(FlaskForm): | ||||||
|  |     description = StringField( | ||||||
|  |         'Description', | ||||||
|  |         validators=[DataRequired(), Length(1, 64)] | ||||||
|  |     ) | ||||||
|  |     file = FileField( | ||||||
|  |         'File', | ||||||
|  |         validators=[ | ||||||
|  |             FileAllowed(['pdf', 'tif', 'tiff']), | ||||||
|  |             FileRequired() | ||||||
|  |         ] | ||||||
|  |     ) | ||||||
|  |     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') | ||||||
|  |         ], | ||||||
|  |         validators=[DataRequired()] | ||||||
|  |     ) | ||||||
|     submit = SubmitField('Submit') |     submit = SubmitField('Submit') | ||||||
|   | |||||||
| @@ -1,9 +1,12 @@ | |||||||
| from flask import redirect, render_template, url_for | from datetime import datetime | ||||||
|  | from flask import current_app, flash, redirect, render_template, url_for, request | ||||||
| from . import services | from . import services | ||||||
| from flask_login import current_user, login_required | from flask_login import current_user, login_required | ||||||
| from .forms import OCRJobForm | from .forms import OCRJobForm | ||||||
| from ..import swarm | from ..import swarm | ||||||
| from threading import Thread | from threading import Thread | ||||||
|  | import hashlib | ||||||
|  | import os | ||||||
|  |  | ||||||
|  |  | ||||||
| @services.route('/ocr', methods=['GET', 'POST']) | @services.route('/ocr', methods=['GET', 'POST']) | ||||||
| @@ -11,17 +14,32 @@ from threading import Thread | |||||||
| def ocr(): | def ocr(): | ||||||
|     ocr_job_form = OCRJobForm() |     ocr_job_form = OCRJobForm() | ||||||
|     if ocr_job_form.validate_on_submit(): |     if ocr_job_form.validate_on_submit(): | ||||||
|  |         app = current_app._get_current_object() | ||||||
|  |         id = hashlib.md5( | ||||||
|  |             (current_user.username + '_' + datetime.now().isoformat()).encode() | ||||||
|  |         ).hexdigest() | ||||||
|  |         dir = os.path.join(app.config['OPAQUE_UPLOAD_DIRECTORY'], id) | ||||||
|  |  | ||||||
|  |         try: | ||||||
|  |             os.mkdir(dir) | ||||||
|  |         except FileExistsError: | ||||||
|  |             # Possible MD5 hash collision occurred. | ||||||
|  |             flash('Internal error occurred, please try again!') | ||||||
|  |         else: | ||||||
|  |             file = ocr_job_form.file.data | ||||||
|  |             file.save(os.path.join(dir, file.filename)) | ||||||
|  |  | ||||||
|             ''' |             ''' | ||||||
|         ' TODO: Implement a Job class. For now a dictionary representation is |             ' TODO: Implement a Job class. For now a dictionary representation | ||||||
|         '       enough. |             '       is enough. | ||||||
|             ''' |             ''' | ||||||
|             job = {'worker': None, |             job = {'worker': None, | ||||||
|                    'creator': current_user.id, |                    'creator': current_user.id, | ||||||
|                'id': '5fd40cb0cadef3ab5676c4968fc3d748', |                    'id': id, | ||||||
|                    'requested_cpus': 2, |                    'requested_cpus': 2, | ||||||
|                    'requested_memory': 2048, |                    'requested_memory': 2048, | ||||||
|                    'service': 'ocr', |                    'service': 'ocr', | ||||||
|                'service_args': {'lang': 'eng', |                    'service_args': {'lang': ocr_job_form.language.data, | ||||||
|                                     'version': 'latest' |                                     'version': 'latest' | ||||||
|                                     }, |                                     }, | ||||||
|                    'status': 'queued' |                    'status': 'queued' | ||||||
| @@ -29,8 +47,8 @@ def ocr(): | |||||||
|             ''' |             ''' | ||||||
|             ' TODO: Let the scheduler run this job in the background. |             ' TODO: Let the scheduler run this job in the background. | ||||||
|             ' |             ' | ||||||
|         ' NOTE: Using self created threads is just for testing purpose as there |             ' NOTE: Using self created threads is just for testing purpose as | ||||||
|         '       is no scheduler available. |             '       there is no scheduler available. | ||||||
|             ''' |             ''' | ||||||
|             thread = Thread(target=swarm.run, args=(job,)) |             thread = Thread(target=swarm.run, args=(job,)) | ||||||
|             thread.start() |             thread.start() | ||||||
|   | |||||||
| @@ -76,10 +76,46 @@ | |||||||
| </div> | </div> | ||||||
|  |  | ||||||
| <div class="col s12"> | <div class="col s12"> | ||||||
|   <div class="card large"> |   <div class="card"> | ||||||
|     <div class="card-content"> |     <div class="card-content"> | ||||||
|       <form method="POST"> |       <form method="POST" enctype="multipart/form-data"> | ||||||
|         {{ ocr_job_form.hidden_tag() }} |         {{ ocr_job_form.hidden_tag() }} | ||||||
|  |         <div class="row"> | ||||||
|  |           <div class="col s8"> | ||||||
|  |             <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 %} | ||||||
|  |                 <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="file-field input-field"> | ||||||
|  |               <div class="btn"> | ||||||
|  |                 <span>{{ ocr_job_form.file.label.text }}</span> | ||||||
|  |                 {{ ocr_job_form.file() }} | ||||||
|  |               </div> | ||||||
|  |               <div class="file-path-wrapper"> | ||||||
|  |                 <input class="file-path validate" type="text"> | ||||||
|  |               </div> | ||||||
|  |               {% for error in ocr_job_form.file.errors %} | ||||||
|  |                 <span class="helper-text red-text">{{ error }}</span> | ||||||
|  |               {% endfor %} | ||||||
|  |             </div> | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|         {{ ocr_job_form.submit(class='btn') }} |         {{ ocr_job_form.submit(class='btn') }} | ||||||
|       </form> |       </form> | ||||||
|     </div> |     </div> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user