mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-11-03 20:02:47 +00:00 
			
		
		
		
	Add create corpus form to dashboard.
This commit is contained in:
		@@ -1,10 +1,12 @@
 | 
			
		||||
from flask import current_app, flash, redirect, render_template, request, url_for
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
from flask import current_app, flash, redirect, render_template, url_for
 | 
			
		||||
from flask_login import current_user, login_required
 | 
			
		||||
from ..models import User
 | 
			
		||||
from ..tables import AdminUserTable, AdminUserItem
 | 
			
		||||
from . import main
 | 
			
		||||
from .forms import CreateCorpusForm
 | 
			
		||||
from ..decorators import admin_required
 | 
			
		||||
import hashlib
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -15,25 +17,23 @@ def dashboard():
 | 
			
		||||
 | 
			
		||||
    if create_corpus_form.validate_on_submit():
 | 
			
		||||
        app = current_app._get_current_object()
 | 
			
		||||
        files = request.FILES
 | 
			
		||||
        print(files)
 | 
			
		||||
        corpus = {
 | 
			
		||||
            'description': create_corpus_form.description.data,
 | 
			
		||||
            'files': [],
 | 
			
		||||
            'owner': current_user.id,
 | 
			
		||||
            'title': create_corpus_form.title.data
 | 
			
		||||
        }
 | 
			
		||||
        corpus_dir = os.path.join(
 | 
			
		||||
            app.config['OPAQUE_FILES'],
 | 
			
		||||
            'corpora',
 | 
			
		||||
            corpus['title']
 | 
			
		||||
        )
 | 
			
		||||
        id = hashlib.md5(
 | 
			
		||||
            (current_user.username + '_' + datetime.now().isoformat()).encode()
 | 
			
		||||
        ).hexdigest()
 | 
			
		||||
        corpus = {'description': create_corpus_form.description.data,
 | 
			
		||||
                  'id': id,
 | 
			
		||||
                  'creator': current_user.id,
 | 
			
		||||
                  'title': create_corpus_form.title.data
 | 
			
		||||
                  }
 | 
			
		||||
        dir = os.path.join(app.config['OPAQUE_FILES'], 'corpora', id)
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            os.mkdir(corpus_dir)
 | 
			
		||||
        except FileExistsError:
 | 
			
		||||
            flash('FileExistsError')
 | 
			
		||||
            os.makedirs(dir)
 | 
			
		||||
        except OSError:
 | 
			
		||||
            flash('OSError!')
 | 
			
		||||
        else:
 | 
			
		||||
            for file in create_corpus_form.files.data:
 | 
			
		||||
                file.save(os.path.join(dir, file.filename))
 | 
			
		||||
            flash('Corpus created!')
 | 
			
		||||
        return redirect(url_for('main.dashboard'))
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -18,32 +18,29 @@ def ocr():
 | 
			
		||||
        id = hashlib.md5(
 | 
			
		||||
            (current_user.username + '_' + datetime.now().isoformat()).encode()
 | 
			
		||||
        ).hexdigest()
 | 
			
		||||
        '''
 | 
			
		||||
        ' TODO: Implement a Job class. For now a dictionary representation
 | 
			
		||||
        '       is enough.
 | 
			
		||||
        '''
 | 
			
		||||
        job = {'creator': current_user.id,
 | 
			
		||||
               'id': id,
 | 
			
		||||
               'requested_cpus': 2,
 | 
			
		||||
               'requested_memory': 2048,
 | 
			
		||||
               'service': 'ocr',
 | 
			
		||||
               'service_args': {'lang': ocr_job_form.language.data,
 | 
			
		||||
                                'version': 'latest'
 | 
			
		||||
                                },
 | 
			
		||||
               'status': 'queued'
 | 
			
		||||
               }
 | 
			
		||||
        dir = os.path.join(app.config['OPAQUE_FILES'], 'jobs', id)
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            os.mkdir(dir)
 | 
			
		||||
        except FileExistsError:
 | 
			
		||||
            # Possible MD5 hash collision occurred.
 | 
			
		||||
            flash('Internal error occurred, please try again!')
 | 
			
		||||
            os.makedirs(dir)
 | 
			
		||||
        except OSError:
 | 
			
		||||
            flash('OSError!')
 | 
			
		||||
        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 enough.
 | 
			
		||||
            '''
 | 
			
		||||
            job = {'worker': None,
 | 
			
		||||
                   'creator': current_user.id,
 | 
			
		||||
                   'id': id,
 | 
			
		||||
                   'requested_cpus': 2,
 | 
			
		||||
                   'requested_memory': 2048,
 | 
			
		||||
                   'service': 'ocr',
 | 
			
		||||
                   'service_args': {'lang': ocr_job_form.language.data,
 | 
			
		||||
                                    'version': 'latest'
 | 
			
		||||
                                    },
 | 
			
		||||
                   'status': 'queued'
 | 
			
		||||
                   }
 | 
			
		||||
            '''
 | 
			
		||||
            ' TODO: Let the scheduler run this job in the background.
 | 
			
		||||
            '
 | 
			
		||||
@@ -52,6 +49,7 @@ def ocr():
 | 
			
		||||
            '''
 | 
			
		||||
            thread = Thread(target=swarm.run, args=(job,))
 | 
			
		||||
            thread.start()
 | 
			
		||||
            flash('Job created!')
 | 
			
		||||
        return redirect(url_for('services.ocr'))
 | 
			
		||||
 | 
			
		||||
    return render_template(
 | 
			
		||||
 
 | 
			
		||||
@@ -37,23 +37,43 @@
 | 
			
		||||
<div class="col s12">
 | 
			
		||||
  <div class="card small">
 | 
			
		||||
    <div class="card-content">
 | 
			
		||||
      <form method="POST">
 | 
			
		||||
      <form method="POST" enctype="multipart/form-data">
 | 
			
		||||
        {{ create_corpus_form.hidden_tag() }}
 | 
			
		||||
        <div class="input-field">
 | 
			
		||||
          <i class="material-icons prefix">title</i>
 | 
			
		||||
          {{ create_corpus_form.title() }}
 | 
			
		||||
          {{ create_corpus_form.title.label }}
 | 
			
		||||
          {% for error in create_corpus_form.title.errors %}
 | 
			
		||||
            <span class="helper-text red-text">{{ error }}</span>
 | 
			
		||||
          {% endfor %}
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="input-field">
 | 
			
		||||
          <i class="material-icons prefix">description</i>
 | 
			
		||||
          {{ create_corpus_form.description() }}
 | 
			
		||||
          {{ create_corpus_form.description.label }}
 | 
			
		||||
          {% for error in create_corpus_form.description.errors %}
 | 
			
		||||
            <span class="helper-text red-text">{{ error }}</span>
 | 
			
		||||
          {% endfor %}
 | 
			
		||||
        <div class="row">
 | 
			
		||||
          <div class="col s12 m4">
 | 
			
		||||
            <div class="input-field">
 | 
			
		||||
              <i class="material-icons prefix">title</i>
 | 
			
		||||
              {{ create_corpus_form.title() }}
 | 
			
		||||
              {{ create_corpus_form.title.label }}
 | 
			
		||||
              {% for error in create_corpus_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>
 | 
			
		||||
              {{ create_corpus_form.description() }}
 | 
			
		||||
              {{ create_corpus_form.description.label }}
 | 
			
		||||
              {% for error in create_corpus_form.description.errors %}
 | 
			
		||||
                <span class="helper-text red-text">{{ error }}</span>
 | 
			
		||||
              {% endfor %}
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="col s12">
 | 
			
		||||
            <div class="file-field input-field">
 | 
			
		||||
              <div class="btn">
 | 
			
		||||
                <span>{{ create_corpus_form.files.label.text }}</span>
 | 
			
		||||
                {{ create_corpus_form.files(accept='.vrt') }}
 | 
			
		||||
              </div>
 | 
			
		||||
              <div class="file-path-wrapper">
 | 
			
		||||
                <input class="file-path validate" type="text">
 | 
			
		||||
              </div>
 | 
			
		||||
              {% for error in create_corpus_form.files.errors %}
 | 
			
		||||
                <span class="helper-text red-text">{{ error }}</span>
 | 
			
		||||
              {% endfor %}
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="card-action right-align">
 | 
			
		||||
          {{ create_corpus_form.submit(class='btn') }}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user