mirror of
https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
synced 2024-12-26 11:24:18 +00:00
Compare commits
2 Commits
a65b1ff578
...
5ee9edef9f
Author | SHA1 | Date | |
---|---|---|---|
|
5ee9edef9f | ||
|
f1ccda6ad7 |
@ -20,13 +20,10 @@ db = SQLAlchemy()
|
|||||||
docker_client = DockerClient()
|
docker_client = DockerClient()
|
||||||
hashids = Hashids()
|
hashids = Hashids()
|
||||||
login = LoginManager()
|
login = LoginManager()
|
||||||
login.login_view = 'auth.login'
|
|
||||||
login.login_message = 'Please log in to access this page.'
|
|
||||||
ma = Marshmallow()
|
ma = Marshmallow()
|
||||||
mail = Mail()
|
mail = Mail()
|
||||||
migrate = Migrate(compare_type=True)
|
migrate = Migrate(compare_type=True)
|
||||||
paranoid = Paranoid()
|
paranoid = Paranoid()
|
||||||
paranoid.redirect_view = '/'
|
|
||||||
scheduler = APScheduler()
|
scheduler = APScheduler()
|
||||||
socketio = SocketIO()
|
socketio = SocketIO()
|
||||||
|
|
||||||
@ -57,6 +54,15 @@ def create_app(config: Config = Config) -> Flask:
|
|||||||
scheduler.init_app(app)
|
scheduler.init_app(app)
|
||||||
socketio.init_app(app, message_queue=app.config['NOPAQUE_SOCKETIO_MESSAGE_QUEUE_URI']) # noqa
|
socketio.init_app(app, message_queue=app.config['NOPAQUE_SOCKETIO_MESSAGE_QUEUE_URI']) # noqa
|
||||||
|
|
||||||
|
from .models import AnonymousUser, User
|
||||||
|
login.anonymous_user = AnonymousUser
|
||||||
|
login.login_view = 'auth.login'
|
||||||
|
@login.user_loader
|
||||||
|
def load_user(user_id):
|
||||||
|
return User.query.get(int(user_id))
|
||||||
|
|
||||||
|
paranoid.redirect_view = '/'
|
||||||
|
|
||||||
from .models.event_listeners import register_event_listeners
|
from .models.event_listeners import register_event_listeners
|
||||||
register_event_listeners()
|
register_event_listeners()
|
||||||
|
|
||||||
|
@ -1,6 +1,3 @@
|
|||||||
from enum import Enum
|
|
||||||
from app import db, login, mail, socketio
|
|
||||||
from app.email import create_message
|
|
||||||
from .anonymous_user import *
|
from .anonymous_user import *
|
||||||
from .avatar import *
|
from .avatar import *
|
||||||
from .corpus_file import *
|
from .corpus_file import *
|
||||||
@ -15,136 +12,3 @@ from .spacy_nlp_pipeline_model import *
|
|||||||
from .tesseract_ocr_pipeline_model import *
|
from .tesseract_ocr_pipeline_model import *
|
||||||
from .token import *
|
from .token import *
|
||||||
from .user import *
|
from .user import *
|
||||||
|
|
||||||
|
|
||||||
@db.event.listens_for(Corpus, 'after_delete')
|
|
||||||
@db.event.listens_for(CorpusFile, 'after_delete')
|
|
||||||
@db.event.listens_for(Job, 'after_delete')
|
|
||||||
@db.event.listens_for(JobInput, 'after_delete')
|
|
||||||
@db.event.listens_for(JobResult, 'after_delete')
|
|
||||||
@db.event.listens_for(SpaCyNLPPipelineModel, 'after_delete')
|
|
||||||
@db.event.listens_for(TesseractOCRPipelineModel, 'after_delete')
|
|
||||||
def resource_after_delete(mapper, connection, resource):
|
|
||||||
print('[START] resource_after_delete')
|
|
||||||
jsonpatch = [
|
|
||||||
{
|
|
||||||
'op': 'remove',
|
|
||||||
'path': resource.jsonpatch_path
|
|
||||||
}
|
|
||||||
]
|
|
||||||
room = f'/users/{resource.user_hashid}'
|
|
||||||
print('[EMIT] PATCH', jsonpatch)
|
|
||||||
socketio.emit('PATCH', jsonpatch, room=room)
|
|
||||||
print('[END] resource_after_delete')
|
|
||||||
|
|
||||||
|
|
||||||
@db.event.listens_for(CorpusFollowerAssociation, 'after_delete')
|
|
||||||
def cfa_after_delete_handler(mapper, connection, cfa):
|
|
||||||
jsonpatch_path = f'/users/{cfa.corpus.user.hashid}/corpora/{cfa.corpus.hashid}/corpus_follower_associations/{cfa.hashid}'
|
|
||||||
jsonpatch = [
|
|
||||||
{
|
|
||||||
'op': 'remove',
|
|
||||||
'path': jsonpatch_path
|
|
||||||
}
|
|
||||||
]
|
|
||||||
room = f'/users/{cfa.corpus.user.hashid}'
|
|
||||||
socketio.emit('PATCH', jsonpatch, room=room)
|
|
||||||
|
|
||||||
|
|
||||||
@db.event.listens_for(Corpus, 'after_insert')
|
|
||||||
@db.event.listens_for(CorpusFile, 'after_insert')
|
|
||||||
@db.event.listens_for(Job, 'after_insert')
|
|
||||||
@db.event.listens_for(JobInput, 'after_insert')
|
|
||||||
@db.event.listens_for(JobResult, 'after_insert')
|
|
||||||
@db.event.listens_for(SpaCyNLPPipelineModel, 'after_insert')
|
|
||||||
@db.event.listens_for(TesseractOCRPipelineModel, 'after_insert')
|
|
||||||
def resource_after_insert_handler(mapper, connection, resource):
|
|
||||||
jsonpatch_value = resource.to_json_serializeable()
|
|
||||||
for attr in mapper.relationships:
|
|
||||||
jsonpatch_value[attr.key] = {}
|
|
||||||
jsonpatch = [
|
|
||||||
{
|
|
||||||
'op': 'add',
|
|
||||||
'path': resource.jsonpatch_path,
|
|
||||||
'value': jsonpatch_value
|
|
||||||
}
|
|
||||||
]
|
|
||||||
room = f'/users/{resource.user_hashid}'
|
|
||||||
socketio.emit('PATCH', jsonpatch, room=room)
|
|
||||||
|
|
||||||
|
|
||||||
@db.event.listens_for(CorpusFollowerAssociation, 'after_insert')
|
|
||||||
def cfa_after_insert_handler(mapper, connection, cfa):
|
|
||||||
jsonpatch_value = cfa.to_json_serializeable()
|
|
||||||
jsonpatch_path = f'/users/{cfa.corpus.user.hashid}/corpora/{cfa.corpus.hashid}/corpus_follower_associations/{cfa.hashid}'
|
|
||||||
jsonpatch = [
|
|
||||||
{
|
|
||||||
'op': 'add',
|
|
||||||
'path': jsonpatch_path,
|
|
||||||
'value': jsonpatch_value
|
|
||||||
}
|
|
||||||
]
|
|
||||||
room = f'/users/{cfa.corpus.user.hashid}'
|
|
||||||
socketio.emit('PATCH', jsonpatch, room=room)
|
|
||||||
|
|
||||||
|
|
||||||
@db.event.listens_for(Corpus, 'after_update')
|
|
||||||
@db.event.listens_for(CorpusFile, 'after_update')
|
|
||||||
@db.event.listens_for(Job, 'after_update')
|
|
||||||
@db.event.listens_for(JobInput, 'after_update')
|
|
||||||
@db.event.listens_for(JobResult, 'after_update')
|
|
||||||
@db.event.listens_for(SpaCyNLPPipelineModel, 'after_update')
|
|
||||||
@db.event.listens_for(TesseractOCRPipelineModel, 'after_update')
|
|
||||||
def resource_after_update_handler(mapper, connection, resource):
|
|
||||||
jsonpatch = []
|
|
||||||
for attr in db.inspect(resource).attrs:
|
|
||||||
if attr.key in mapper.relationships:
|
|
||||||
continue
|
|
||||||
if not attr.load_history().has_changes():
|
|
||||||
continue
|
|
||||||
jsonpatch_path = f'{resource.jsonpatch_path}/{attr.key}'
|
|
||||||
if isinstance(attr.value, datetime):
|
|
||||||
jsonpatch_value = f'{attr.value.isoformat()}Z'
|
|
||||||
elif isinstance(attr.value, Enum):
|
|
||||||
jsonpatch_value = attr.value.name
|
|
||||||
else:
|
|
||||||
jsonpatch_value = attr.value
|
|
||||||
jsonpatch.append(
|
|
||||||
{
|
|
||||||
'op': 'replace',
|
|
||||||
'path': jsonpatch_path,
|
|
||||||
'value': jsonpatch_value
|
|
||||||
}
|
|
||||||
)
|
|
||||||
if jsonpatch:
|
|
||||||
room = f'/users/{resource.user_hashid}'
|
|
||||||
socketio.emit('PATCH', jsonpatch, room=room)
|
|
||||||
|
|
||||||
|
|
||||||
@db.event.listens_for(Job, 'after_update')
|
|
||||||
def job_after_update_handler(mapper, connection, job):
|
|
||||||
for attr in db.inspect(job).attrs:
|
|
||||||
if attr.key != 'status':
|
|
||||||
continue
|
|
||||||
if not attr.load_history().has_changes():
|
|
||||||
return
|
|
||||||
if job.user.setting_job_status_mail_notification_level == UserSettingJobStatusMailNotificationLevel.NONE:
|
|
||||||
return
|
|
||||||
if job.user.setting_job_status_mail_notification_level == UserSettingJobStatusMailNotificationLevel.END:
|
|
||||||
if job.status not in [JobStatus.COMPLETED, JobStatus.FAILED]:
|
|
||||||
return
|
|
||||||
msg = create_message(
|
|
||||||
job.user.email,
|
|
||||||
f'Status update for your Job "{job.title}"',
|
|
||||||
'tasks/email/notification',
|
|
||||||
job=job
|
|
||||||
)
|
|
||||||
mail.send(msg)
|
|
||||||
|
|
||||||
|
|
||||||
login.anonymous_user = AnonymousUser
|
|
||||||
|
|
||||||
|
|
||||||
@login.user_loader
|
|
||||||
def load_user(user_id):
|
|
||||||
return User.query.get(int(user_id))
|
|
||||||
|
@ -498,7 +498,8 @@ nopaque.corpus_analysis.ConcordanceExtension = class ConcordanceExtension {
|
|||||||
if (cpos !== firstCpos || pAttr.simple_pos !== 'PUNCT') {html += ' ';}
|
if (cpos !== firstCpos || pAttr.simple_pos !== 'PUNCT') {html += ' ';}
|
||||||
// Add entity start
|
// Add entity start
|
||||||
if (isEntityStart) {
|
if (isEntityStart) {
|
||||||
html += `<span class="s-attr" data-cpos="${cpos}" data-id="${pAttr.ent}" data-s-attr-type="ent" data-s-attr-ent-type="${subcorpus.p.lookups.ent_lookup[pAttr.ent].type}">`;
|
html += '<span class="s-attr" data-s-attr="ent">';
|
||||||
|
html += `<span class="s-attr" data-cpos="${cpos}" data-id="${pAttr.ent}" data-s-attr="ent_type" data-s-attr-value="${subcorpus.p.lookups.ent_lookup[pAttr.ent].type}">`;
|
||||||
}
|
}
|
||||||
// Add pAttr
|
// Add pAttr
|
||||||
html += `<span class="p-attr" data-cpos="${cpos}"></span>`;
|
html += `<span class="p-attr" data-cpos="${cpos}"></span>`;
|
||||||
@ -506,6 +507,7 @@ nopaque.corpus_analysis.ConcordanceExtension = class ConcordanceExtension {
|
|||||||
if (isEntityEnd) {
|
if (isEntityEnd) {
|
||||||
html += ` <span class="black-text hide new white ent-indicator" data-badge-caption="">${subcorpus.p.lookups.ent_lookup[pAttr.ent].type}</span>`;
|
html += ` <span class="black-text hide new white ent-indicator" data-badge-caption="">${subcorpus.p.lookups.ent_lookup[pAttr.ent].type}</span>`;
|
||||||
html += '</span>';
|
html += '</span>';
|
||||||
|
html += '</span>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return html;
|
return html;
|
||||||
@ -522,17 +524,18 @@ nopaque.corpus_analysis.ConcordanceExtension = class ConcordanceExtension {
|
|||||||
for (let pAttrElement of this.elements.subcorpusItems.querySelectorAll('.p-attr')) {
|
for (let pAttrElement of this.elements.subcorpusItems.querySelectorAll('.p-attr')) {
|
||||||
pAttrElement.setAttribute('class', 'p-attr');
|
pAttrElement.setAttribute('class', 'p-attr');
|
||||||
}
|
}
|
||||||
// Set basic styling on .s-attr[data-type="ent"] elements
|
// Set basic styling on .s-attr[data-s-attr="ent_type"] elements
|
||||||
for (let entElement of this.elements.subcorpusItems.querySelectorAll('.s-attr[data-s-attr-type="ent"]')) {
|
for (let entElement of this.elements.subcorpusItems.querySelectorAll('.s-attr[data-s-attr="ent_type"]')) {
|
||||||
entElement.querySelector('.ent-indicator').classList.add('hide');
|
entElement.querySelector('.ent-indicator').classList.add('hide');
|
||||||
entElement.removeAttribute('style');
|
// TODO: Check why this is here
|
||||||
|
// entElement.removeAttribute('style');
|
||||||
entElement.setAttribute('class', 's-attr');
|
entElement.setAttribute('class', 's-attr');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.settings.textStyle >= 1) {
|
if (this.settings.textStyle >= 1) {
|
||||||
// Set advanced styling on .s-attr[data-type="ent"] elements
|
// Set advanced styling on .s-attr[data-s-attr="ent_type"] elements
|
||||||
for (let entElement of this.elements.subcorpusItems.querySelectorAll('.s-attr[data-s-attr-type="ent"]')) {
|
for (let entElement of this.elements.subcorpusItems.querySelectorAll('.s-attr[data-s-attr="ent_type"]')) {
|
||||||
entElement.classList.add('chip');
|
entElement.classList.add('chip', 's-attr-color');
|
||||||
entElement.querySelector('.ent-indicator').classList.remove('hide');
|
entElement.querySelector('.ent-indicator').classList.remove('hide');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,7 +228,8 @@ nopaque.corpus_analysis.ReaderExtension = class ReaderExtension {
|
|||||||
if (cpos !== firstCpos || pAttr.simple_pos !== 'PUNCT') {html += ' ';}
|
if (cpos !== firstCpos || pAttr.simple_pos !== 'PUNCT') {html += ' ';}
|
||||||
// Add entity start
|
// Add entity start
|
||||||
if (isEntityStart) {
|
if (isEntityStart) {
|
||||||
html += `<span class="s-attr" data-cpos="${cpos}" data-id="${pAttr.ent}" data-s-attr-type="ent" data-s-attr-ent-type="${this.data.corpus.p.lookups.ent_lookup[pAttr.ent].type}">`;
|
html += '<span class="s-attr" data-s-attr="ent">';
|
||||||
|
html += `<span class="s-attr" data-cpos="${cpos}" data-id="${pAttr.ent}" data-s-attr="ent_type" data-s-attr-value="${this.data.corpus.p.lookups.ent_lookup[pAttr.ent].type}">`;
|
||||||
}
|
}
|
||||||
// Add pAttr
|
// Add pAttr
|
||||||
html += `<span class="p-attr" data-cpos="${cpos}"></span>`;
|
html += `<span class="p-attr" data-cpos="${cpos}"></span>`;
|
||||||
@ -236,6 +237,7 @@ nopaque.corpus_analysis.ReaderExtension = class ReaderExtension {
|
|||||||
if (isEntityEnd) {
|
if (isEntityEnd) {
|
||||||
html += ` <span class="badge black-text hide new white ent-indicator" data-badge-caption="">${this.data.corpus.p.lookups.ent_lookup[pAttr.ent].type}</span>`;
|
html += ` <span class="badge black-text hide new white ent-indicator" data-badge-caption="">${this.data.corpus.p.lookups.ent_lookup[pAttr.ent].type}</span>`;
|
||||||
html += '</span>';
|
html += '</span>';
|
||||||
|
html += '</span>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return html;
|
return html;
|
||||||
@ -272,17 +274,18 @@ nopaque.corpus_analysis.ReaderExtension = class ReaderExtension {
|
|||||||
for (let pAttrElement of this.elements.corpus.querySelectorAll('.p-attr')) {
|
for (let pAttrElement of this.elements.corpus.querySelectorAll('.p-attr')) {
|
||||||
pAttrElement.setAttribute('class', 'p-attr');
|
pAttrElement.setAttribute('class', 'p-attr');
|
||||||
}
|
}
|
||||||
// Set basic styling on .s-attr[data-type="ent"] elements
|
// Set basic styling on .s-attr[data-s-attr="ent_type"] elements
|
||||||
for (let entElement of this.elements.corpus.querySelectorAll('.s-attr[data-s-attr-type="ent"]')) {
|
for (let entElement of this.elements.corpus.querySelectorAll('.s-attr[data-s-attr="ent_type"]')) {
|
||||||
entElement.querySelector('.ent-indicator').classList.add('hide');
|
entElement.querySelector('.ent-indicator').classList.add('hide');
|
||||||
entElement.removeAttribute('style');
|
// TODO: Check why this is here
|
||||||
|
// entElement.removeAttribute('style');
|
||||||
entElement.setAttribute('class', 's-attr');
|
entElement.setAttribute('class', 's-attr');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.settings.textStyle >= 1) {
|
if (this.settings.textStyle >= 1) {
|
||||||
// Set advanced styling on .s-attr[data-type="ent"] elements
|
// Set advanced styling on .s-attr[data-s-attr="ent_type"] elements
|
||||||
for (let entElement of this.elements.corpus.querySelectorAll('.s-attr[data-s-attr-type="ent"]')) {
|
for (let entElement of this.elements.corpus.querySelectorAll('.s-attr[data-s-attr="ent_type"]')) {
|
||||||
entElement.classList.add('chip');
|
entElement.classList.add('chip', 's-attr-color');
|
||||||
entElement.querySelector('.ent-indicator').classList.remove('hide');
|
entElement.querySelector('.ent-indicator').classList.remove('hide');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user