def user_profile_page(): setup_translation() the_tz = current_user.timezone if current_user.timezone else get_default_timezone() if current_user.social_id and current_user.social_id.startswith('phone$'): form = PhoneUserProfileForm(request.form, obj=current_user) else: form = UserProfileForm(request.form, obj=current_user) form.timezone.choices = [(x, x) for x in sorted(list(zoneinfo.available_timezones()))] form.timezone.default = the_tz if str(form.timezone.data) == 'None' or str(form.timezone.data) == '': form.timezone.data = the_tz if request.method == 'POST' and form.validate(): if current_user.has_roles(['admin', 'developer']): form.populate_obj(current_user) else: current_user.first_name = form.first_name.data current_user.last_name = form.last_name.data if current_user.social_id and current_user.social_id.startswith('phone$'): current_user.email = form.email.data db.session.commit() #docassemble.webapp.daredis.clear_user_cache() flash(word('Your information was saved.'), 'success') return redirect(url_for('interview_list')) response = make_response(render_template('users/user_profile_page.html', version_warning=None, page_title=word('User Profile'), tab_title=word('User Profile'), form=form, debug=debug_status()), 200) response.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0' return response
def user_profile_page(): the_tz = current_user.timezone if current_user.timezone else get_default_timezone( ) if current_user.social_id and current_user.social_id.startswith('phone$'): form = PhoneUserProfileForm(request.form, obj=current_user) else: form = UserProfileForm(request.form, obj=current_user) form.timezone.choices = [ (x, x) for x in sorted([tz for tz in pytz.all_timezones]) ] form.timezone.default = the_tz if text_type(form.timezone.data) == 'None' or text_type( form.timezone.data) == '': form.timezone.data = the_tz if request.method == 'POST' and form.validate(): form.populate_obj(current_user) db.session.commit() #docassemble.webapp.daredis.clear_user_cache() flash(word('Your information was saved.'), 'success') return redirect(url_for('interview_list')) response = make_response( render_template('users/user_profile_page.html', version_warning=None, page_title=word('User Profile'), tab_title=word('User Profile'), form=form, debug=debug_status()), 200) response.headers[ 'Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0' return response
def edit_user_profile_page(id): user = UserModel.query.filter_by(id=id).first() the_tz = (user.timezone if user.timezone else get_default_timezone()) if user is None: abort(404) if 'disable_mfa' in request.args and int(request.args['disable_mfa']) == 1: user.otp_secret = None db.session.commit() return redirect(url_for('edit_user_profile_page', id=id)) if 'reset_email_confirmation' in request.args and int( request.args['reset_email_confirmation']) == 1: user.confirmed_at = None db.session.commit() return redirect(url_for('edit_user_profile_page', id=id)) the_role_id = list() for role in user.roles: the_role_id.append(str(role.id)) if len(the_role_id) == 0: the_role_id = [str(Role.query.filter_by(name='user').first().id)] form = EditUserProfileForm(request.form, obj=user, role_id=the_role_id) form.role_id.choices = [(r.id, r.name) for r in db.session.query(Role).filter( Role.name != 'cron').order_by('name')] form.timezone.choices = [ (x, x) for x in sorted([tz for tz in pytz.all_timezones]) ] form.timezone.default = the_tz if str(form.timezone.data) == 'None': form.timezone.data = the_tz if user.otp_secret is None: form.uses_mfa.data = False else: form.uses_mfa.data = True if request.method == 'POST' and form.validate(): form.populate_obj(user) roles_to_remove = list() the_role_id = list() for role in user.roles: roles_to_remove.append(role) for role in roles_to_remove: user.roles.remove(role) for role in Role.query.order_by('id'): if role.id in form.role_id.data: user.roles.append(role) the_role_id.append(role.id) db.session.commit() flash(word('The information was saved.'), 'success') return redirect(url_for('user_list')) form.role_id.default = the_role_id confirmation_feature = True if user.id > 2 else False return render_template('users/edit_user_profile_page.html', version_warning=None, page_title=word('Edit User Profile'), tab_title=word('Edit User Profile'), form=form, confirmation_feature=confirmation_feature)
def edit_user_profile_page(id): user = UserModel.query.filter_by(id=id).first() the_tz = user.timezone if user.timezone else get_default_timezone() if user is None: abort(404) if 'disable_mfa' in request.args and int(request.args['disable_mfa']) == 1: user.otp_secret = None db.session.commit() #docassemble.webapp.daredis.clear_user_cache() return redirect(url_for('edit_user_profile_page', id=id)) if 'reset_email_confirmation' in request.args and int(request.args['reset_email_confirmation']) == 1: user.confirmed_at = None db.session.commit() #docassemble.webapp.daredis.clear_user_cache() return redirect(url_for('edit_user_profile_page', id=id)) the_role_id = list() for role in user.roles: the_role_id.append(text_type(role.id)) if len(the_role_id) == 0: the_role_id = [text_type(Role.query.filter_by(name='user').first().id)] form = EditUserProfileForm(request.form, obj=user, role_id=the_role_id) if request.method == 'POST' and form.cancel.data: flash(word('The user profile was not changed.'), 'success') return redirect(url_for('user_list')) if user.social_id.startswith('local$'): form.role_id.choices = [(r.id, r.name) for r in db.session.query(Role).filter(Role.name != 'cron').order_by('name')] privileges_note = None else: form.role_id.choices = [(r.id, r.name) for r in db.session.query(Role).filter(and_(Role.name != 'cron', Role.name != 'admin')).order_by('name')] privileges_note = word("Note: only users with e-mail/password accounts can be given admin privileges.") form.timezone.choices = [(x, x) for x in sorted([tz for tz in pytz.all_timezones])] form.timezone.default = the_tz if text_type(form.timezone.data) == 'None' or text_type(form.timezone.data) == '': form.timezone.data = the_tz if user.otp_secret is None: form.uses_mfa.data = False else: form.uses_mfa.data = True admin_id = Role.query.filter_by(name='admin').first().id if request.method == 'POST' and form.validate(user.id, admin_id): form.populate_obj(user) roles_to_remove = list() the_role_id = list() for role in user.roles: roles_to_remove.append(role) for role in roles_to_remove: user.roles.remove(role) for role in Role.query.order_by('id'): if role.id in form.role_id.data: user.roles.append(role) the_role_id.append(role.id) db.session.commit() #docassemble.webapp.daredis.clear_user_cache() flash(word('The information was saved.'), 'success') return redirect(url_for('user_list')) form.role_id.default = the_role_id confirmation_feature = True if user.id > 2 else False return render_template('users/edit_user_profile_page.html', version_warning=None, page_title=word('Edit User Profile'), tab_title=word('Edit User Profile'), form=form, confirmation_feature=confirmation_feature, privileges_note=privileges_note, is_self=(user.id == current_user.id))
def edit_user_profile_page(id): user = UserModel.query.options(db.joinedload('roles')).filter_by(id=id).first() the_tz = user.timezone if user.timezone else get_default_timezone() if user is None: abort(404) if 'disable_mfa' in request.args and int(request.args['disable_mfa']) == 1: user.otp_secret = None db.session.commit() #docassemble.webapp.daredis.clear_user_cache() return redirect(url_for('edit_user_profile_page', id=id)) if 'reset_email_confirmation' in request.args and int(request.args['reset_email_confirmation']) == 1: user.confirmed_at = None db.session.commit() #docassemble.webapp.daredis.clear_user_cache() return redirect(url_for('edit_user_profile_page', id=id)) the_role_id = list() for role in user.roles: the_role_id.append(text_type(role.id)) if len(the_role_id) == 0: the_role_id = [text_type(Role.query.filter_by(name='user').first().id)] form = EditUserProfileForm(request.form, obj=user, role_id=the_role_id) if request.method == 'POST' and form.cancel.data: flash(word('The user profile was not changed.'), 'success') return redirect(url_for('user_list')) if user.social_id.startswith('local$'): form.role_id.choices = [(r.id, r.name) for r in db.session.query(Role).filter(Role.name != 'cron').order_by('name')] privileges_note = None else: form.role_id.choices = [(r.id, r.name) for r in db.session.query(Role).filter(and_(Role.name != 'cron', Role.name != 'admin')).order_by('name')] privileges_note = word("Note: only users with e-mail/password accounts can be given admin privileges.") form.timezone.choices = [(x, x) for x in sorted([tz for tz in pytz.all_timezones])] form.timezone.default = the_tz if text_type(form.timezone.data) == 'None' or text_type(form.timezone.data) == '': form.timezone.data = the_tz if user.otp_secret is None: form.uses_mfa.data = False else: form.uses_mfa.data = True admin_id = Role.query.filter_by(name='admin').first().id if request.method == 'POST' and form.validate(user.id, admin_id): form.populate_obj(user) roles_to_remove = list() the_role_id = list() for role in user.roles: roles_to_remove.append(role) for role in roles_to_remove: user.roles.remove(role) for role in Role.query.order_by('id'): if role.id in form.role_id.data: user.roles.append(role) the_role_id.append(role.id) db.session.commit() #docassemble.webapp.daredis.clear_user_cache() flash(word('The information was saved.'), 'success') return redirect(url_for('user_list')) form.role_id.default = the_role_id confirmation_feature = True if user.id > 2 else False return render_template('users/edit_user_profile_page.html', version_warning=None, page_title=word('Edit User Profile'), tab_title=word('Edit User Profile'), form=form, confirmation_feature=confirmation_feature, privileges_note=privileges_note, is_self=(user.id == current_user.id))
def user_profile_page(): the_tz = current_user.timezone if current_user.timezone else get_default_timezone() if current_user.social_id and current_user.social_id.startswith('phone$'): form = PhoneUserProfileForm(request.form, obj=current_user) else: form = UserProfileForm(request.form, obj=current_user) form.timezone.choices = [(x, x) for x in sorted([tz for tz in pytz.all_timezones])] form.timezone.default = the_tz if str(form.timezone.data) == 'None' or str(form.timezone.data) == '': form.timezone.data = the_tz if request.method == 'POST' and form.validate(): form.populate_obj(current_user) db.session.commit() flash(word('Your information was saved.'), 'success') return redirect(url_for('interview_list')) return render_template('users/user_profile_page.html', version_warning=None, page_title=word('User Profile'), tab_title=word('User Profile'), form=form, debug=debug_status())
def user_profile_page(): the_tz = (current_user.timezone if current_user.timezone else get_default_timezone()) if current_user.social_id and current_user.social_id.startswith('phone$'): form = PhoneUserProfileForm(request.form, obj=current_user) else: form = UserProfileForm(request.form, obj=current_user) form.timezone.choices = [(x, x) for x in sorted([tz for tz in pytz.all_timezones])] form.timezone.default = the_tz if str(form.timezone.data) == 'None': form.timezone.data = the_tz if request.method == 'POST' and form.validate(): form.populate_obj(current_user) db.session.commit() flash(word('Your information was saved.'), 'success') return redirect(url_for('interview_list')) return render_template('users/user_profile_page.html', version_warning=None, page_title=word('User Profile'), tab_title=word('User Profile'), form=form, debug=debug_status())
def edit_user_profile_page(id): user = UserModel.query.filter_by(id=id).first() the_tz = (user.timezone if user.timezone else get_default_timezone()) if user is None: abort(404) the_role_id = list() for role in user.roles: the_role_id.append(str(role.id)) if len(the_role_id) == 0: the_role_id = [str(Role.query.filter_by(name='user').first().id)] form = EditUserProfileForm(request.form, obj=user, role_id=the_role_id) form.role_id.choices = [(r.id, r.name) for r in db.session.query(Role).filter( Role.name != 'cron').order_by('name')] form.timezone.choices = [ (x, x) for x in sorted([tz for tz in pytz.all_timezones]) ] form.timezone.default = the_tz if str(form.timezone.data) == 'None': form.timezone.data = the_tz if request.method == 'POST' and form.validate(): form.populate_obj(user) roles_to_remove = list() the_role_id = list() for role in user.roles: roles_to_remove.append(role) for role in roles_to_remove: user.roles.remove(role) for role in Role.query.order_by('id'): if role.id in form.role_id.data: user.roles.append(role) the_role_id.append(role.id) db.session.commit() flash(word('The information was saved.'), 'success') return redirect(url_for('user_list')) form.role_id.default = the_role_id return render_template('users/edit_user_profile_page.html', page_title=word('Edit User Profile'), tab_title=word('Edit User Profile'), form=form)
def edit_user_profile_page(id): setup_translation() is_admin = bool(current_user.has_roles('admin')) if is_admin: can_edit_privileges = True can_delete = True can_edit_user_active_status = True else: can_edit_privileges = current_user.can_do('edit_user_privileges') can_delete = current_user.can_do('delete_user') and current_user.can_do('access_sessions') and current_user.can_do('edit_sessions') can_edit_user_active_status = current_user.can_do('edit_user_active_status') if not id: flash(word('The user account did not exit.'), 'danger') return redirect(url_for('user_list')) user = db.session.execute(select(UserModel).options(db.joinedload(UserModel.roles)).filter_by(id=id)).unique().scalar_one() if not user: flash(word('The user account did not exit.'), 'danger') return redirect(url_for('user_list')) if not is_admin: protected_user = False for role in user.roles: if role.name in ('admin', 'developer', 'advocate'): protected_user = True break if protected_user: flash(word('You do not have sufficient privileges to edit this user.'), 'danger') return redirect(url_for('user_list')) the_tz = user.timezone if user.timezone else get_default_timezone() if user is None or user.social_id.startswith('disabled$'): return redirect(url_for('user_list')) if 'disable_mfa' in request.args and int(request.args['disable_mfa']) == 1: user.otp_secret = None db.session.commit() #docassemble.webapp.daredis.clear_user_cache() return redirect(url_for('edit_user_profile_page', id=id)) if 'reset_email_confirmation' in request.args and int(request.args['reset_email_confirmation']) == 1: user.confirmed_at = None db.session.commit() #docassemble.webapp.daredis.clear_user_cache() return redirect(url_for('edit_user_profile_page', id=id)) if can_delete and daconfig.get('admin can delete account', True) and user.id != current_user.id: if 'delete_account' in request.args and int(request.args['delete_account']) == 1: server.user_interviews(user_id=id, secret=None, exclude_invalid=False, action='delete_all', delete_shared=False) delete_user_data(id, server.server_redis, server.server_redis_user) db.session.commit() flash(word('The user account was deleted.'), 'success') return redirect(url_for('user_list')) if 'delete_account_complete' in request.args and int(request.args['delete_account_complete']) == 1: server.user_interviews(user_id=id, secret=None, exclude_invalid=False, action='delete_all', delete_shared=True) delete_user_data(id, server.server_redis, server.server_redis_user) db.session.commit() flash(word('The user account was deleted.'), 'success') return redirect(url_for('user_list')) the_role_id = [] for role in user.roles: the_role_id.append(role.id) if len(the_role_id) == 0: the_role_id = [db.session.execute(select(Role.id).filter_by(name='user')).scalar_one()] form = EditUserProfileForm(request.form, obj=user, role_id=the_role_id) if request.method == 'POST' and form.cancel.data: flash(word('The user profile was not changed.'), 'success') return redirect(url_for('user_list')) if user.social_id.startswith('local$') or daconfig.get('allow external auth with admin accounts', False): form.role_id.choices = [(r.id, r.name) for r in db.session.execute(select(Role.id, Role.name).where(Role.name != 'cron').order_by('name'))] privileges_note = None else: form.role_id.choices = [(r.id, r.name) for r in db.session.execute(select(Role.id, Role.name).where(and_(Role.name != 'cron', Role.name != 'admin')).order_by('name'))] privileges_note = word("Note: only users with e-mail/password accounts can be given admin privileges.") form.timezone.choices = [(x, x) for x in sorted(list(zoneinfo.available_timezones()))] form.timezone.default = the_tz if str(form.timezone.data) == 'None' or str(form.timezone.data) == '': form.timezone.data = the_tz form.uses_mfa.data = bool(user.otp_secret is not None) admin_id = db.session.execute(select(Role.id).filter_by(name='admin')).scalar_one() if request.method == 'POST' and form.validate(user.id, admin_id): if not can_edit_user_active_status: form.active.data = user.active form.populate_obj(user) if can_edit_privileges: roles_to_remove = [] the_role_id = [] for role in user.roles: if not is_admin and role.name in ('admin', 'developer', 'advocate'): continue roles_to_remove.append(role) for role in roles_to_remove: user.roles.remove(role) for role in db.session.execute(select(Role).order_by('id')).scalars(): if not is_admin and role.name in ('admin', 'developer', 'advocate'): continue if role.id in form.role_id.data: user.roles.append(role) the_role_id.append(role.id) db.session.commit() flash(word('The information was saved.'), 'success') return redirect(url_for('user_list')) confirmation_feature = bool(user.id > 2) script = """ <script> $(".dadeleteaccount").click(function(event){ if (!confirm(""" + json.dumps(word("Are you sure you want to permanently delete this user's account?")) + """)){ event.preventDefault(); return false; } }); </script>""" form.role_id.process_data(the_role_id) if user.active: form.active.default = 'checked' response = make_response(render_template('users/edit_user_profile_page.html', version_warning=None, page_title=word('Edit User Profile'), tab_title=word('Edit User Profile'), form=form, confirmation_feature=confirmation_feature, privileges_note=privileges_note, is_self=(user.id == current_user.id), extra_js=Markup(script), is_admin=is_admin, can_edit_privileges=can_edit_privileges, can_delete=can_delete, can_edit_user_active_status=can_edit_user_active_status), 200) response.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0' return response
def edit_user_profile_page(id): user = UserModel.query.options( db.joinedload('roles')).filter_by(id=id).first() the_tz = user.timezone if user.timezone else get_default_timezone() if user is None or user.social_id.startswith('disabled$'): abort(404) if 'disable_mfa' in request.args and int(request.args['disable_mfa']) == 1: user.otp_secret = None db.session.commit() #docassemble.webapp.daredis.clear_user_cache() return redirect(url_for('edit_user_profile_page', id=id)) if 'reset_email_confirmation' in request.args and int( request.args['reset_email_confirmation']) == 1: user.confirmed_at = None db.session.commit() #docassemble.webapp.daredis.clear_user_cache() return redirect(url_for('edit_user_profile_page', id=id)) if daconfig.get('admin can delete account', True) and user.id != current_user.id: if 'delete_account' in request.args and int( request.args['delete_account']) == 1: from docassemble.webapp.server import user_interviews, r, r_user from docassemble.webapp.backend import delete_user_data user_interviews(user_id=id, secret=None, exclude_invalid=False, action='delete_all', delete_shared=False) delete_user_data(id, r, r_user) db.session.commit() flash(word('The user account was deleted.'), 'success') return redirect(url_for('user_list')) if 'delete_account_complete' in request.args and int( request.args['delete_account_complete']) == 1: from docassemble.webapp.server import user_interviews, r, r_user from docassemble.webapp.backend import delete_user_data user_interviews(user_id=id, secret=None, exclude_invalid=False, action='delete_all', delete_shared=True) delete_user_data(id, r, r_user) db.session.commit() flash(word('The user account was deleted.'), 'success') return redirect(url_for('user_list')) the_role_id = list() for role in user.roles: the_role_id.append(text_type(role.id)) if len(the_role_id) == 0: the_role_id = [text_type(Role.query.filter_by(name='user').first().id)] form = EditUserProfileForm(request.form, obj=user, role_id=the_role_id) if request.method == 'POST' and form.cancel.data: flash(word('The user profile was not changed.'), 'success') return redirect(url_for('user_list')) if user.social_id.startswith('local$'): form.role_id.choices = [(r.id, r.name) for r in db.session.query(Role).filter( Role.name != 'cron').order_by('name')] privileges_note = None else: form.role_id.choices = [(r.id, r.name) for r in db.session.query( Role).filter(and_(Role.name != 'cron', Role.name != 'admin')).order_by('name')] privileges_note = word( "Note: only users with e-mail/password accounts can be given admin privileges." ) form.timezone.choices = [ (x, x) for x in sorted([tz for tz in pytz.all_timezones]) ] form.timezone.default = the_tz if text_type(form.timezone.data) == 'None' or text_type( form.timezone.data) == '': form.timezone.data = the_tz if user.otp_secret is None: form.uses_mfa.data = False else: form.uses_mfa.data = True admin_id = Role.query.filter_by(name='admin').first().id if request.method == 'POST' and form.validate(user.id, admin_id): form.populate_obj(user) roles_to_remove = list() the_role_id = list() for role in user.roles: roles_to_remove.append(role) for role in roles_to_remove: user.roles.remove(role) for role in Role.query.order_by('id'): if role.id in form.role_id.data: user.roles.append(role) the_role_id.append(role.id) db.session.commit() #docassemble.webapp.daredis.clear_user_cache() flash(word('The information was saved.'), 'success') return redirect(url_for('user_list')) form.role_id.default = the_role_id confirmation_feature = True if user.id > 2 else False script = """ <script> $(".dadeleteaccount").click(function(event){ if (!confirm(""" + json.dumps( word("Are you sure you want to permanently delete this user's account?" )) + """)){ event.preventDefault(); return false; } }); </script>""" response = make_response( render_template('users/edit_user_profile_page.html', version_warning=None, page_title=word('Edit User Profile'), tab_title=word('Edit User Profile'), form=form, confirmation_feature=confirmation_feature, privileges_note=privileges_note, is_self=(user.id == current_user.id), extra_js=Markup(script)), 200) response.headers[ 'Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0' return response
def background_thread(sid=None, user_id=None, temp_user_id=None): if user_id is not None: user_id = int(user_id) if temp_user_id is not None: temp_user_id = int(temp_user_id) with app.app_context(): sys.stderr.write("Started client thread for " + str(sid) + " who is " + str(user_id) + " or " + str(temp_user_id) + "\n") if user_id is None: person = None user_is_temp = True else: person = UserModel.query.filter_by(id=user_id).first() user_is_temp = False if person is not None and person.timezone is not None: the_timezone = pytz.timezone(person.timezone) else: the_timezone = pytz.timezone(get_default_timezone()) r = redis.StrictRedis(host=redis_host, db=0) partners = set() pubsub = r.pubsub() pubsub.subscribe([sid]) for item in pubsub.listen(): if item['type'] != 'message': continue #sys.stderr.write("sid: " + str(sid) + ":\n") data = None try: data = json.loads(item['data']) except: sys.stderr.write(" JSON parse error: " + str(item['data']) + "\n") continue if data.get('message', None) == "KILL" and (('sid' in data and data['sid'] == sid) or 'sid' not in data): pubsub.unsubscribe(sid) sys.stderr.write(" interview unsubscribed and finished for " + str(sid) + "\n") break else: sys.stderr.write(" Got something for sid " + str(sid) + " from " + data.get('origin', "Unknown origin") + "\n") if 'messagetype' in data: if data['messagetype'] == 'chat': #sys.stderr.write(" Emitting interview chat message: " + str(data['message']['message']) + "\n") if (user_is_temp is True and str(temp_user_id) == str(data['message'].get('temp_user_id', None))) or (user_is_temp is False and str(user_id) == str(data['message'].get('user_id', None))): data['message']['is_self'] = True else: data['message']['is_self'] = False socketio.emit('chatmessage', {'i': data['yaml_filename'], 'uid': data['uid'], 'userid': data['user_id'], 'data': data['message']}, namespace='/wsinterview', room=sid) elif data['messagetype'] == 'chatready': pubsub.subscribe(data['sid']) partners.add(data['sid']) sys.stderr.write("chatready 2") socketio.emit('chatready', {}, namespace='/wsinterview', room=sid) elif data['messagetype'] == 'departure': if data['sid'] in partners: partners.remove(data['sid']) socketio.emit('departure', {'numpartners': len(partners)}, namespace='/wsinterview', room=sid) elif data['messagetype'] == 'block': if data['sid'] in partners: partners.remove(data['sid']) socketio.emit('departure', {'numpartners': len(partners)}, namespace='/wsinterview', room=sid) elif data['messagetype'] == 'chatpartner': partners.add(data['sid']) elif data['messagetype'] == 'controllerchanges': socketio.emit('controllerchanges', {'parameters': data['parameters'], 'clicked': data['clicked']}, namespace='/wsinterview', room=sid) elif data['messagetype'] == 'controllerstart': socketio.emit('controllerstart', {}, namespace='/wsinterview', room=sid) elif data['messagetype'] == 'controllerexit': socketio.emit('controllerexit', {}, namespace='/wsinterview', room=sid) # elif data['messagetype'] == "newpage": # sys.stderr.write(" Got new page for interview\n") # try: # obj = json.loads(r.get(data['key'])) # except: # sys.stderr.write(" newpage JSON parse error\n") # continue # socketio.emit('newpage', {'obj': obj}, namespace='/wsinterview', room=sid) sys.stderr.write(' exiting interview thread for sid ' + str(sid) + '\n')
def monitor_thread(sid=None, user_id=None): with app.app_context(): sys.stderr.write("Started monitor thread for " + str(sid) + " who is " + str(user_id) + "\n") if user_id is not None: person = UserModel.query.filter_by(id=user_id).first() else: person = None if person is not None and person.timezone is not None: the_timezone = pytz.timezone(person.timezone) else: the_timezone = pytz.timezone(get_default_timezone()) r = redis.StrictRedis(host=redis_host, db=0) listening_sids = set() pubsub = r.pubsub() pubsub.subscribe(['da:monitor', sid]) for item in pubsub.listen(): if item['type'] != 'message': continue #sys.stderr.write("monitor sid: " + str(sid) + ":\n") data = None try: data = json.loads(item['data']) except: sys.stderr.write(" monitor JSON parse error: " + str(item['data']) + "\n") continue if 'message' in data and data['message'] == "KILL": if item['channel'] == str(sid): sys.stderr.write(" monitor unsubscribed from all\n") pubsub.unsubscribe() for interview_sid in listening_sids: r.publish(interview_sid, json.dumps(dict(messagetype='departure', sid=sid))) break elif item['channel'] != 'da:monitor': pubsub.unsubscribe(item['channel']) if data['sid'] in listening_sids: listening_sids.remove(data['sid']) sys.stderr.write(" monitor unsubscribed from " + str(item['channel']) + "\n") continue else: sys.stderr.write(" Got something for monitor\n") if 'messagetype' in data: #if data['messagetype'] == 'abortcontroller': # socketio.emit('abortcontroller', {'key': data['key']}, namespace='/monitor', room=sid) if data['messagetype'] == 'sessionupdate': #sys.stderr.write(" Got a session update: " + str(data['session']) + "\n") #sys.stderr.write(" Got a session update\n") socketio.emit('sessionupdate', {'key': data['key'], 'session': data['session']}, namespace='/monitor', room=sid) if data['messagetype'] == 'chatready': pubsub.subscribe(data['sid']) listening_sids.add(data['sid']) secrets[data['sid']] = data['secret'] r.hset('da:monitor:chatpartners:' + str(user_id), 'da:interviewsession:uid:' + str(data['uid']) + ':i:' + str(data['i']) + ':userid:' + str(data['userid']), 1) if str(data['userid']).startswith('t'): name = word("anonymous visitor") + ' ' + str(data['userid'])[1:] else: person = UserModel.query.filter_by(id=data['userid']).first() if person.first_name: name = str(person.first_name) + ' ' + str(person.last_name) else: name = str(person.email) sys.stderr.write("chatready 1") socketio.emit('chatready', {'uid': data['uid'], 'i': data['i'], 'userid': data['userid'], 'name': name}, namespace='/monitor', room=sid) if data['messagetype'] == 'block': pubsub.unsubscribe(item['channel']) if item['channel'] in listening_sids: listening_sids.remove(item['channel']) sys.stderr.write(" monitor unsubscribed from " + str(item['channel']) + "\n") if data['messagetype'] == 'refreshsessions': socketio.emit('refreshsessions', {}, namespace='/monitor', room=sid) if data['messagetype'] == 'chat': #sys.stderr.write(" Emitting monitor chat message: " + str(data['message']['message']) + "\n") if str(user_id) == str(data['message'].get('user_id', None)): data['message']['is_self'] = True else: data['message']['is_self'] = False socketio.emit('chatmessage', {'i': data['yaml_filename'], 'uid': data['uid'], 'userid': data['user_id'], 'data': data['message']}, namespace='/monitor', room=sid) if data['messagetype'] == 'chatstop': sys.stderr.write(" Chat termination for sid " + data['sid'] + "\n") pubsub.unsubscribe(data['sid']) if data['sid'] in secrets: del secrets[data['sid']] r.hdel('da:monitor:chatpartners:' + str(user_id), 'da:interviewsession:uid:' + str(data['uid']) + ':i:' + str(data['i']) + ':userid:' + data['userid']) socketio.emit('chatstop', {'uid': data['uid'], 'i': data['i'], 'userid': data['userid']}, namespace='/monitor', room=sid) sys.stderr.write(' exiting monitor thread for sid ' + str(sid) + '\n')
def background_thread(sid=None, user_id=None, temp_user_id=None): if user_id is not None: user_id = int(user_id) if temp_user_id is not None: temp_user_id = int(temp_user_id) with app.app_context(): sys.stderr.write("Started client thread for " + str(sid) + " who is " + str(user_id) + " or " + str(temp_user_id) + "\n") if user_id is None: person = None user_is_temp = True else: person = UserModel.query.filter_by(id=user_id).first() user_is_temp = False if person is not None and person.timezone is not None: the_timezone = pytz.timezone(person.timezone) else: the_timezone = pytz.timezone(get_default_timezone()) r = redis.StrictRedis(host=redis_host, port=redis_port, db=redis_offset) partners = set() pubsub = r.pubsub() pubsub.subscribe([sid]) for item in pubsub.listen(): sys.stderr.write("0\n" + repr(item) + "\n") if item['type'] != 'message': continue #sys.stderr.write("sid: " + str(sid) + ":\n") data = None try: data = json.loads(item['data'].decode()) except: sys.stderr.write(" JSON parse error: " + str(item['data'].decode()) + "\n") continue if data.get('message', None) == "KILL" and (('sid' in data and data['sid'] == sid) or 'sid' not in data): pubsub.unsubscribe(sid) sys.stderr.write(" interview unsubscribed and finished for " + str(sid) + "\n") break else: sys.stderr.write(" Got something for sid " + str(sid) + " from " + data.get('origin', "Unknown origin") + "\n") if 'messagetype' in data: if data['messagetype'] == 'chat': #sys.stderr.write(" Emitting interview chat message: " + str(data['message']['message']) + "\n") if (user_is_temp is True and str(temp_user_id) == str(data['message'].get('temp_user_id', None))) or (user_is_temp is False and str(user_id) == str(data['message'].get('user_id', None))): data['message']['is_self'] = True else: data['message']['is_self'] = False socketio.emit('chatmessage', {'i': data['yaml_filename'], 'uid': data['uid'], 'userid': data['user_id'], 'data': data['message']}, namespace='/wsinterview', room=sid) elif data['messagetype'] == 'chatready': pubsub.subscribe(data['sid']) partners.add(data['sid']) sys.stderr.write("chatready 2") socketio.emit('chatready', {}, namespace='/wsinterview', room=sid) elif data['messagetype'] == 'departure': if data['sid'] in partners: partners.remove(data['sid']) socketio.emit('departure', {'numpartners': len(partners)}, namespace='/wsinterview', room=sid) elif data['messagetype'] == 'block': if data['sid'] in partners: partners.remove(data['sid']) socketio.emit('departure', {'numpartners': len(partners)}, namespace='/wsinterview', room=sid) elif data['messagetype'] == 'chatpartner': partners.add(data['sid']) elif data['messagetype'] == 'controllerchanges': socketio.emit('controllerchanges', {'parameters': data['parameters'], 'clicked': data['clicked']}, namespace='/wsinterview', room=sid) elif data['messagetype'] == 'controllerstart': socketio.emit('controllerstart', {}, namespace='/wsinterview', room=sid) elif data['messagetype'] == 'controllerexit': socketio.emit('controllerexit', {}, namespace='/wsinterview', room=sid) # elif data['messagetype'] == "newpage": # sys.stderr.write(" Got new page for interview\n") # try: # obj = json.loads(r.get(data['key'])) # except: # sys.stderr.write(" newpage JSON parse error\n") # continue # socketio.emit('newpage', {'obj': obj}, namespace='/wsinterview', room=sid) sys.stderr.write(' exiting interview thread for sid ' + str(sid) + '\n')
def monitor_thread(sid=None, user_id=None): with app.app_context(): sys.stderr.write("Started monitor thread for " + str(sid) + " who is " + str(user_id) + "\n") if user_id is not None: person = UserModel.query.filter_by(id=user_id).first() else: person = None if person is not None and person.timezone is not None: the_timezone = pytz.timezone(person.timezone) else: the_timezone = pytz.timezone(get_default_timezone()) r = redis.StrictRedis(host=redis_host, port=redis_port, db=redis_offset) listening_sids = set() pubsub = r.pubsub() pubsub.subscribe(['da:monitor', sid]) for item in pubsub.listen(): sys.stderr.write("1\n" + repr(item) + "\n") if item['type'] != 'message': continue #sys.stderr.write("monitor sid: " + str(sid) + ":\n") data = None try: data = json.loads(item['data'].decode()) except: sys.stderr.write(" monitor JSON parse error: " + item['data'].decode() + "\n") continue if 'message' in data and data['message'] == "KILL": if item['channel'].decode() == str(sid): sys.stderr.write(" monitor unsubscribed from all\n") pubsub.unsubscribe() for interview_sid in listening_sids: r.publish(interview_sid, json.dumps(dict(messagetype='departure', sid=sid))) break elif item['channel'].decode() != 'da:monitor': pubsub.unsubscribe(item['channel'].decode()) if data['sid'] in listening_sids: listening_sids.remove(data['sid']) sys.stderr.write(" monitor unsubscribed from " + item['channel'].decode() + "\n") continue else: sys.stderr.write(" Got something for monitor\n") if 'messagetype' in data: #if data['messagetype'] == 'abortcontroller': # socketio.emit('abortcontroller', {'key': data['key']}, namespace='/monitor', room=sid) if data['messagetype'] == 'sessionupdate': #sys.stderr.write(" Got a session update: " + str(data['session']) + "\n") #sys.stderr.write(" Got a session update\n") socketio.emit('sessionupdate', {'key': data['key'], 'session': data['session']}, namespace='/monitor', room=sid) if data['messagetype'] == 'chatready': pubsub.subscribe(data['sid']) listening_sids.add(data['sid']) secrets[data['sid']] = data['secret'] r.hset('da:monitor:chatpartners:' + str(user_id), 'da:interviewsession:uid:' + str(data['uid']) + ':i:' + str(data['i']) + ':userid:' + str(data['userid']), 1) if str(data['userid']).startswith('t'): name = word("anonymous visitor") + ' ' + str(data['userid'])[1:] else: person = UserModel.query.filter_by(id=data['userid']).first() if person.first_name: name = str(person.first_name) + ' ' + str(person.last_name) else: name = str(person.email) sys.stderr.write("chatready 1") socketio.emit('chatready', {'uid': data['uid'], 'i': data['i'], 'userid': data['userid'], 'name': name}, namespace='/monitor', room=sid) if data['messagetype'] == 'block': pubsub.unsubscribe(item['channel'].decode()) if item['channel'].decode() in listening_sids: listening_sids.remove(item['channel'].decode()) sys.stderr.write(" monitor unsubscribed from " + item['channel'].decode() + "\n") if data['messagetype'] == 'refreshsessions': socketio.emit('refreshsessions', {}, namespace='/monitor', room=sid) if data['messagetype'] == 'chat': #sys.stderr.write(" Emitting monitor chat message: " + str(data['message']['message']) + "\n") if str(user_id) == str(data['message'].get('user_id', None)): data['message']['is_self'] = True else: data['message']['is_self'] = False socketio.emit('chatmessage', {'i': data['yaml_filename'], 'uid': data['uid'], 'userid': data['user_id'], 'data': data['message']}, namespace='/monitor', room=sid) if data['messagetype'] == 'chatstop': sys.stderr.write(" Chat termination for sid " + data['sid'] + "\n") pubsub.unsubscribe(data['sid']) if data['sid'] in secrets: del secrets[data['sid']] r.hdel('da:monitor:chatpartners:' + str(user_id), 'da:interviewsession:uid:' + str(data['uid']) + ':i:' + str(data['i']) + ':userid:' + data['userid']) socketio.emit('chatstop', {'uid': data['uid'], 'i': data['i'], 'userid': data['userid']}, namespace='/monitor', room=sid) sys.stderr.write(' exiting monitor thread for sid ' + str(sid) + '\n')