Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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))
Ejemplo n.º 5
0
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))
Ejemplo n.º 6
0
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())
Ejemplo n.º 7
0
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())
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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
Ejemplo n.º 11
0
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')
Ejemplo n.º 12
0
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')
Ejemplo n.º 13
0
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')
Ejemplo n.º 14
0
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')