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)

This commit is contained in:
Patrick Jentsch 2019-09-18 14:05:56 +02:00
parent 9f74e8ce82
commit d269249db0
2 changed files with 12 additions and 73 deletions

View File

@ -5,7 +5,6 @@ from .. import db, socketio
from ..models import User from ..models import User
import json import json
import jsonpatch import jsonpatch
import logging
''' '''
@ -24,18 +23,16 @@ def connect():
' will be used for further information exchange generated by a background ' will be used for further information exchange generated by a background
' task associated with the sid. ' task associated with the sid.
''' '''
logger = logging.getLogger(__name__)
logger.warning('[connect] Session id is: {}.'.format(request.sid))
socketio.start_background_task(background_task, socketio.start_background_task(background_task,
current_app._get_current_object(), current_app._get_current_object(),
current_user.id, current_user.id,
request.sid) request.sid)
@socketio.on('connect_admin') @socketio.on('inspect_user')
@login_required @login_required
@admin_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 ' 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 ' 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 ' task associated with the sid. Admin will be placed in that room on emiting
' "conncect_admin". ' "conncect_admin".
''' '''
logger = logging.getLogger(__name__) socketio.start_background_task(background_task,
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,
current_app._get_current_object(), current_app._get_current_object(),
selected_user_id, user_id,
request.sid) request.sid,
True)
@socketio.on('disconnect') @socketio.on('disconnect')
@ -63,7 +57,7 @@ def disconnect():
disconnected.append(request.sid) 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 ' 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 ' 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(): with app.app_context():
user = db.session.query(User).filter_by(id=user_id).first() 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. ''' ''' Get current values from the database. '''
corpora = user.corpora_as_dict() corpora = user.corpora_as_dict()
logging.warning('Corpora are: {}'.format(corpora))
jobs = user.jobs_as_dict() jobs = user.jobs_as_dict()
logging.warning('Jobs are: {}'.format(jobs))
''' Send initial values. ''' ''' Send initial values. '''
socketio.emit('init-corpora', socketio.emit('init-foreign-corpora' if foreign else 'init-corpora',
json.dumps(corpora), json.dumps(corpora),
room=session_id) room=session_id)
socketio.emit('init-jobs', socketio.emit('init-foreign-jobs' if foreign else 'init-jobs',
json.dumps(jobs), json.dumps(jobs),
room=session_id) room=session_id)
''' TODO: Implement maximum runtime for this loop. ''' ''' 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) jobs_patch = jsonpatch.JsonPatch.from_diff(jobs, new_jobs)
''' In case there are patches, send them to the user. ''' ''' In case there are patches, send them to the user. '''
if corpus_patch: if corpus_patch:
socketio.emit('update-corpora', socketio.emit('update-foreign-corpora' if foreign else 'update-corpora',
corpus_patch.to_string(), corpus_patch.to_string(),
room=session_id) room=session_id)
if jobs_patch: if jobs_patch:
socketio.emit('update-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. '''
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',
jobs_patch.to_string(), jobs_patch.to_string(),
room=session_id) room=session_id)
''' Set new values as references for the next iteration. ''' ''' Set new values as references for the next iteration. '''

View File

@ -35,7 +35,7 @@
</div> </div>
<script> <script>
var selected_user_id = {{selected_user.id|tojson|safe}} var selected_user_id = {{selected_user.id|tojson|safe}}
socket.emit('connect_admin', selected_user_id); socket.emit('inspect_user', selected_user_id);
</script> </script>
<div class="col s12 m6"> <div class="col s12 m6">
<div id="job-foreign-list"> <div id="job-foreign-list">