Change the Subscription Logic for Socket.IO Data exchange

This commit is contained in:
Patrick Jentsch
2022-07-08 11:46:47 +02:00
parent 5771e156ce
commit 4e5957eea2
17 changed files with 137 additions and 134 deletions

View File

@ -5,6 +5,19 @@ from flask_login import current_user
from flask_socketio import join_room, leave_room
@socketio.on('GET /users/<user_id>')
@socketio_login_required
def subscribe_user(user_hashid):
user_id = hashids.decode(user_hashid)
user = User.query.get(user_id)
if user is None:
return {'code': 404, 'msg': 'Not found'}
if not (user == current_user or current_user.is_administrator):
return {'code': 403, 'msg': 'Forbidden'}
dict_user = user.to_dict(backrefs=True, relationships=True)
return {'code': 200, 'msg': 'OK', 'payload': dict_user}
@socketio.on('SUBSCRIBE /users/<user_id>')
@socketio_login_required
def subscribe_user(user_hashid):
@ -14,9 +27,10 @@ def subscribe_user(user_hashid):
return {'code': 404, 'msg': 'Not found'}
if not (user == current_user or current_user.is_administrator):
return {'code': 403, 'msg': 'Forbidden'}
dict_user = user.to_dict(backrefs=True, relationships=True)
# dict_user = user.to_dict(backrefs=True, relationships=True)
join_room(f'/users/{user.hashid}')
return {'code': 200, 'msg': 'OK', 'payload': dict_user}
# return {'code': 200, 'msg': 'OK', 'payload': dict_user}
return {'code': 200, 'msg': 'OK'}
@socketio.on('UNSUBSCRIBE /users/<user_id>')

View File

@ -1,50 +1,17 @@
from app.decorators import admin_required
from app.models import User
from flask import render_template, request, url_for
from flask import render_template, request
from flask_login import login_required
from . import bp
@bp.route('/')
@login_required
@admin_required
def users():
dict_users = [u.to_dict(backrefs=True, relationships=False) for u in User.query.all()]
return render_template(
'users/users.html.j2',
title='Users'
title='Users',
dict_users=dict_users
)
@bp.route('/api_users')
def api_users():
query = User.query
# search filter
search = request.args.get('search')
if search:
query = query.filter(User.username.like(f'%{search}%') | User.email.like(f'%{search}%'))
total = query.count()
# sorting
sort = request.args.get('sort')
if sort:
order = []
for s in sort.split(','):
direction = s[0]
name = s[1:]
if name not in ['username', 'email']:
name = 'username'
col = getattr(User, name)
if direction == '-':
col = col.desc()
order.append(col)
if order:
query = query.order_by(*order)
# pagination
offset = request.args.get('offset', type=int, default=-1)
limit = request.args.get('limit', type=int, default=-1)
if offset != -1 and limit != -1:
query = query.offset(offset).limit(limit)
# response
return {
'data': [user.to_dict() for user in query],
'total': total
}