diff --git a/app/main/events.py b/app/main/events.py index e516a00e..c734799e 100644 --- a/app/main/events.py +++ b/app/main/events.py @@ -1,9 +1,11 @@ from flask import current_app, request from flask_login import current_user, login_required +from ..decorators import admin_required from .. import db, socketio from ..models import User import json import jsonpatch +import logging ''' @@ -28,6 +30,26 @@ def connect(): request.sid) +@socketio.on('connect_admin') +@login_required +@admin_required +def connect_admin(selected_user_id): + ''' + ' The Socket.IO module creates a session id (sid) on each request. The + ' initiating admin is automatically placed in a room with that sid, which + ' will be used for further information exchange generated by a background + ' task associated with the sid. Admin will be placed in that room on emiting + ' "conncect_admin". + ''' + logger = logging.getLogger(__name__) + logger.warning('Admin emitted "connect_admin".') + logger.warning('Selected user id is: {}'.format(selected_user_id)) + socketio.start_background_task(background_task_foreign, + current_app._get_current_object(), + selected_user_id, + request.sid) + + @socketio.on('disconnect') @login_required def disconnect(): @@ -51,9 +73,13 @@ def background_task(app, user_id, session_id): ''' with app.app_context(): user = db.session.query(User).filter_by(id=user_id).first() + logging.getLogger(__name__) + logging.warning('User object is: {}'.format(user)) ''' Get current values from the database. ''' corpora = user.corpora_as_dict() + logging.warning('Corpora are: {}'.format(corpora)) jobs = user.jobs_as_dict() + logging.warning('Jobs are: {}'.format(jobs)) ''' Send initial values. ''' socketio.emit('init-corpora', json.dumps(corpora), @@ -83,3 +109,54 @@ def background_task(app, user_id, session_id): jobs = new_jobs socketio.sleep(3) disconnected.remove(session_id) + + +def background_task_foreign(app, user_id, session_id): + ''' + ' Sends initial corpus and job lists to the client. Afterwards it checks + ' every 3 seconds if changes to the initial values appeared. If changes are + ' detected, a RFC 6902 compliant JSON patch gets send. + ' + ' NOTE: The initial values are send as a init-* events. + ' The JSON patches are send as update-* events. + ' + ' > where '*' is either 'corpora' or 'jobs' + ''' + with app.app_context(): + user = db.session.query(User).filter_by(id=user_id).first() + logging.getLogger(__name__) + logging.warning('User object is: {}'.format(user)) + ''' Get current values from the database. ''' + corpora = user.corpora_as_dict() + logging.warning('Corpora are: {}'.format(corpora)) + jobs = user.jobs_as_dict() + logging.warning('Jobs are: {}'.format(jobs)) + ''' Send initial values. ''' + socketio.emit('init-foreign-corpora', + json.dumps(corpora), + room=session_id) + socketio.emit('init-foreign-jobs', + json.dumps(jobs), + room=session_id) + ''' TODO: Implement maximum runtime for this loop. ''' + while session_id not in disconnected: + ''' Get current values from the database ''' + new_corpora = user.corpora_as_dict() + new_jobs = user.jobs_as_dict() + ''' Compute JSON patches. ''' + corpus_patch = jsonpatch.JsonPatch.from_diff(corpora, new_corpora) + jobs_patch = jsonpatch.JsonPatch.from_diff(jobs, new_jobs) + ''' In case there are patches, send them to the user. ''' + if corpus_patch: + socketio.emit('update-foreign-corpora', + corpus_patch.to_string(), + room=session_id) + if jobs_patch: + socketio.emit('update-foreign-jobs', + jobs_patch.to_string(), + room=session_id) + ''' Set new values as references for the next iteration. ''' + corpora = new_corpora + jobs = new_jobs + socketio.sleep(3) + disconnected.remove(session_id) diff --git a/app/templates/admin/admin_user_page.html.j2 b/app/templates/admin/admin_user_page.html.j2 index 8a2204f7..8b13a6d4 100644 --- a/app/templates/admin/admin_user_page.html.j2 +++ b/app/templates/admin/admin_user_page.html.j2 @@ -21,50 +21,41 @@ +
-
-
- User Jobs -
-
- search - - +
+
+
+
+
+
+ search + + +
+
+
+
    +
    -
    - {% for job in selected_user.jobs.all() %} - {% if job.service == 'nlp' %} - {% set service_color = 'blue' %} - {% set service_icon = 'format_textdirection_l_to_r' %} - {% elif job.service =='ocr' %} - {% set service_color = 'green' %} - {% set service_icon = 'find_in_page' %} - {% else %} - {% set service_color = 'red' %} - {% set service_icon = 'help' %} - {% endif %} - {% if job.status == 'pending' %} - {% set badge_color = 'amber' %} - {% elif job.status =='running' %} - {% set badge_color = 'indigo' %} - {% elif job.status =='complete' %} - {% set badge_color = 'teal' %} - {% else %} - {% set badge_color = 'red' %} - {% endif %} - - {{ service_icon }} - {{ job.status }} - {{ job.title }} -

    {{ job.description }}

    -
    - {% endfor %} -
    -
      +
      +
      diff --git a/app/templates/base.html.j2 b/app/templates/base.html.j2 index c6bac81a..8488c8df 100644 --- a/app/templates/base.html.j2 +++ b/app/templates/base.html.j2 @@ -26,6 +26,7 @@ var jobsSubscribers = []; var socket = io(); + socket.on('init-corpora', function(msg) { var subscriber; @@ -64,6 +65,46 @@ console.log(msg); }); +