From d269249db07592c61ad7c807534fa9dd5f9b74e1 Mon Sep 17 00:00:00 2001
From: Patrick Jentsch
Date: Wed, 18 Sep 2019 14:05:56 +0200
Subject: [PATCH] Only use one generic function for socketio background tasks
and rename the socketio event (it's no connect so don't name it like one)
---
app/main/events.py | 83 +++------------------
app/templates/admin/admin_user_page.html.j2 | 2 +-
2 files changed, 12 insertions(+), 73 deletions(-)
diff --git a/app/main/events.py b/app/main/events.py
index cae1ee32..2e84f61a 100644
--- a/app/main/events.py
+++ b/app/main/events.py
@@ -5,7 +5,6 @@ from .. import db, socketio
from ..models import User
import json
import jsonpatch
-import logging
'''
@@ -24,18 +23,16 @@ def connect():
' will be used for further information exchange generated by a background
' task associated with the sid.
'''
- logger = logging.getLogger(__name__)
- logger.warning('[connect] Session id is: {}.'.format(request.sid))
socketio.start_background_task(background_task,
current_app._get_current_object(),
current_user.id,
request.sid)
-@socketio.on('connect_admin')
+@socketio.on('inspect_user')
@login_required
@admin_required
-def connect_admin(selected_user_id):
+def inspect_user(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
@@ -43,14 +40,11 @@ def connect_admin(selected_user_id):
' 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('[connect_admin] Session id is: {}.'.format(request.sid))
- logger.warning('Selected user id is: {}'.format(selected_user_id))
- socketio.start_background_task(background_task_foreign,
+ socketio.start_background_task(background_task,
current_app._get_current_object(),
- selected_user_id,
- request.sid)
+ user_id,
+ request.sid,
+ True)
@socketio.on('disconnect')
@@ -63,7 +57,7 @@ def disconnect():
disconnected.append(request.sid)
-def background_task(app, user_id, session_id):
+def background_task(app, user_id, session_id, foreign=False):
'''
' 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
@@ -76,18 +70,14 @@ 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',
+ socketio.emit('init-foreign-corpora' if foreign else 'init-corpora',
json.dumps(corpora),
room=session_id)
- socketio.emit('init-jobs',
+ socketio.emit('init-foreign-jobs' if foreign else 'init-jobs',
json.dumps(jobs),
room=session_id)
''' TODO: Implement maximum runtime for this loop. '''
@@ -100,62 +90,11 @@ def background_task(app, user_id, session_id):
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-corpora',
+ socketio.emit('update-foreign-corpora' if foreign else 'update-corpora',
corpus_patch.to_string(),
room=session_id)
if jobs_patch:
- socketio.emit('update-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)
-
-
-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',
+ socketio.emit('update-foreign-jobs' if foreign else 'update-jobs',
jobs_patch.to_string(),
room=session_id)
''' Set new values as references for the next iteration. '''
diff --git a/app/templates/admin/admin_user_page.html.j2 b/app/templates/admin/admin_user_page.html.j2
index 4f0dc11a..282c8d63 100644
--- a/app/templates/admin/admin_user_page.html.j2
+++ b/app/templates/admin/admin_user_page.html.j2
@@ -35,7 +35,7 @@