diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 205d949e140aec319aad5823771b7b103eec7445..b3bf5524f4b068bb0e42bf482be3cdb6ac3774ba 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,8 +15,8 @@ before_script: Build: script: - - docker build --pull -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA + - docker build --pull -t $CI_REGISTRY_IMAGE:tmp . + - docker push $CI_REGISTRY_IMAGE:tmp stage: build tags: - docker @@ -25,8 +25,8 @@ Push development: only: - development script: - - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA - - docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:development + - docker pull $CI_REGISTRY_IMAGE:tmp + - docker tag $CI_REGISTRY_IMAGE:tmp $CI_REGISTRY_IMAGE:development - docker push $CI_REGISTRY_IMAGE:development stage: push tags: @@ -36,8 +36,8 @@ Push latest: only: - master script: - - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA - - docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest + - docker pull $CI_REGISTRY_IMAGE:tmp + - docker tag $CI_REGISTRY_IMAGE:tmp $CI_REGISTRY_IMAGE:latest - docker push $CI_REGISTRY_IMAGE:latest stage: push tags: @@ -47,8 +47,8 @@ Push tag: only: - tags script: - - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA - - docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME + - docker pull $CI_REGISTRY_IMAGE:tmp + - docker tag $CI_REGISTRY_IMAGE:tmp $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME stage: push tags: diff --git a/app/corpora/views.py b/app/corpora/views.py index aef61908b3a7d4224f5a7ef8912b012e21bfe347..e7862b17c2ceb25198056fe4f615c195ffd50b05 100644 --- a/app/corpora/views.py +++ b/app/corpora/views.py @@ -19,7 +19,7 @@ def add_corpus(): if add_corpus_form.validate_on_submit(): corpus = Corpus(creator=current_user, description=add_corpus_form.description.data, - title=add_corpus_form.title.data) + status='unprepared', title=add_corpus_form.title.data) db.session.add(corpus) db.session.commit() dir = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'], @@ -166,6 +166,7 @@ def edit_corpus_file(corpus_id, corpus_file_id): corpus_file.author = edit_corpus_file_form.author.data corpus_file.publishing_year = edit_corpus_file_form.publishing_year.data corpus_file.title = edit_corpus_file_form.title.data + corpus_file.insert_metadata() db.session.commit() flash('Corpus file edited!') return redirect(url_for('corpora.corpus', corpus_id=corpus_id)) diff --git a/app/models.py b/app/models.py index 77892c02b1420f4fd40d7ca2e9e83e2273d7acde..4987fb4c36f79dbc73489a4eeacb4fabded765bf 100644 --- a/app/models.py +++ b/app/models.py @@ -2,6 +2,7 @@ from flask import current_app from flask_login import UserMixin, AnonymousUserMixin from itsdangerous import BadSignature, TimedJSONWebSignatureSerializer from werkzeug.security import generate_password_hash, check_password_hash +import xml.etree.ElementTree as ET from . import db from . import login_manager from datetime import datetime @@ -410,6 +411,18 @@ class CorpusFile(db.Model): title = db.Column(db.String(64)) corpus_id = db.Column(db.Integer, db.ForeignKey('corpora.id')) + def __init__(self, **kwargs): + super(CorpusFile, self).__init__(**kwargs) + file = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'], + self.dir, + self.filename) + element_tree = ET.parse(file) + text_node = element_tree.find('text') + text_node.set('author', self.author) + text_node.set('publishing_year', str(self.publishing_year)) + text_node.set('title', self.title) + element_tree.write(file) + def delete(self): logger = logging.getLogger(__name__) logger.warning('Called CorpusFile.delete') @@ -434,18 +447,15 @@ class Corpus(db.Model): id = db.Column(db.Integer, primary_key=True) creation_date = db.Column(db.DateTime(), default=datetime.utcnow) description = db.Column(db.String(255)) + status = db.Column(db.String(16)) title = db.Column(db.String(32)) user_id = db.Column(db.Integer, db.ForeignKey('users.id')) - status = db.Column(db.String(16)) # Relationships files = db.relationship('CorpusFile', backref='corpus', lazy='dynamic', cascade='save-update, merge, delete') - def __init__(self, **kwargs): - super(Corpus, self).__init__(**kwargs) - def __repr__(self): """ String representation of the corpus. For human readability. @@ -482,6 +492,9 @@ class Corpus(db.Model): db.session.delete(self) db.session.commit() + def prepare(self): + pass + ''' ' Flask-Login is told to use the application’s custom anonymous user by setting diff --git a/app/templates/corpora/corpus.html.j2 b/app/templates/corpora/corpus.html.j2 index fbcf321bb89f49df48762fbbf31fbe0528154908..bf04d74dff4c5572e5ffc319deaf9732f697cdd2 100644 --- a/app/templates/corpora/corpus.html.j2 +++ b/app/templates/corpora/corpus.html.j2 @@ -4,6 +4,7 @@ <div class="col s12 m4"> <h3 id="title">{{ corpus.title }}</h3> <p id="description">{{ corpus.description }}</p> + <a class="waves-effect waves-light btn">{{ corpus.status }}</a> </div> <div class="col s12 m8"> @@ -18,13 +19,10 @@ </div> </div> </div> - <span class="card-title">Actions</span> - <a href="{{ url_for('corpora.corpus_analysis', corpus_id=corpus.id) }}" class="waves-effect waves-light btn"> - <i class="material-icons left">help</i>Analyse - </a> - <a data-target="delete-corpus-modal" class="waves-effect waves-light btn red modal-trigger right"> - <i class="material-icons left">delete</i>Delete Corpus - </a> + </div> + <div class="card-action right-align"> + <a href="{{ url_for('corpora.corpus_analysis', corpus_id=corpus.id) }}" class="waves-effect waves-light btn"><i class="material-icons left">help</i>Analyse</a> + <a data-target="delete-corpus-modal" class="waves-effect waves-light btn red modal-trigger"><i class="material-icons left">delete</i>Delete Corpus</a> </div> </div> </div> diff --git a/app/templates/jobs/job.html.j2 b/app/templates/jobs/job.html.j2 index 512dc7345b97f35b120b8ee036ff8d0c3a7d2a69..30a722e8559c585c4b9340b9ff3423144e0d8d7d 100644 --- a/app/templates/jobs/job.html.j2 +++ b/app/templates/jobs/job.html.j2 @@ -79,7 +79,7 @@ if (timestamp === null) { end_date = "N.a."; } else { - end_date = new Date(timestamp * 1000).toLocaleString(); + end_date = new Date(timestamp * 1000).toLocaleString("en-US"); } document.getElementById("end-date").value = end_date; M.updateTextFields(); @@ -118,23 +118,6 @@ <h3 id="title">{{ job.title }}</h3> <p id="description">{{ job.description }}</p> <a class="waves-effect waves-light btn" id="status"></a> - <h2>Actions:</h2> - <!-- Confirm deletion of job with modal dialogue - Modal Trigger--> - <a href="#modal-confirm-delete" class="waves-effect waves-light btn red modal-trigger"><i class="material-icons left">delete</i>Delete Job</a> - <a href="#" class="waves-effect waves-light btn"><i class="material-icons left">settings</i>Export Parameters</a> - <!-- Modal Strucutre --> - <div id="modal-confirm-delete" class="modal"> - <div class="modal-content"> - <h4>Confirm deletion</h4> - <p>Do you really want to delete the job {{job.title}}? - All iput and output files will be permanently deleted.</p> - </div> - <div class="modal-footer"> - <a href="{{ url_for('jobs.delete_job', job_id=job.id) }}" class="modal-close waves-effect waves-green btn red"><i class="material-icons left">delete</i>Delete Job</a> - <a href="#!" class="modal-close waves-effect waves-green btn cancel">Cancel</a> - </div> - </div> </div> @@ -195,6 +178,10 @@ </div> </div> </div> + <div class="card-action right-align"> + <a href="#" class="waves-effect waves-light btn"><i class="material-icons left">settings</i>Export Parameters</a> + <a data-target="delete-job-modal" class="waves-effect waves-light btn red modal-trigger"><i class="material-icons left">delete</i>Delete Job</a> + </div> </div> </div> @@ -228,4 +215,15 @@ </div> </div> +<!-- Modals --> +<div id="delete-job-modal" class="modal"> + <div class="modal-content"> + <h4>Confirm deletion</h4> + <p>Do you really want to delete the job {{job.title}}? All associated files will be permanently deleted.</p> + </div> + <div class="modal-footer"> + <a href="#!" class="modal-close waves-effect waves-green btn cancel">Cancel</a> + <a class="modal-close waves-effect waves-green btn red" href="{{ url_for('jobs.delete_job', job_id=job.id) }}">Confirm<i class="material-icons right">send</i></a> + </div> +</div> {% endblock %} diff --git a/app/utils.py b/app/utils.py index 7c1d9638dc5ce66607d3b7b7a0572d172b8165bd..6eae9d54dde739708d8a53edba6d9ffeecb72d44 100644 --- a/app/utils.py +++ b/app/utils.py @@ -1,4 +1,4 @@ -from .models import Job, User, Corpus +from .models import Job, User, Corpus, CorpusFile from . import db import logging @@ -64,3 +64,8 @@ def background_delete_corpus(app, corpus_id): logger.warning('Corpus id is: {}.'.format(corpus_id)) corpus = Corpus.query.filter_by(id=corpus_id).first() corpus.delete() + + +def background_prepare_corpus_file(app, corpus_file_id): + with app.app_context(): + corpus_file = CorpusFile.query.filter_by(id=corpus_file_id).first()