settings update

This commit is contained in:
Patrick Jentsch 2023-03-27 10:22:43 +02:00
parent 9e58578761
commit 020de69e45
5 changed files with 192 additions and 83 deletions

View File

@ -1,9 +1,13 @@
from flask import flash, redirect, render_template, request, url_for from flask import abort, flash, redirect, render_template, url_for
from flask_breadcrumbs import register_breadcrumb from flask_breadcrumbs import register_breadcrumb
from app import db, hashids from app import db
from app.models import Corpus, Role, User, UserSettingJobStatusMailNotificationLevel from app.models import Avatar, Corpus, User
from app.settings.forms import EditNotificationsForm from app.settings.forms import (
from app.settings.forms import EditAccountForm ChangePasswordForm,
EditNotificationsForm,
EditAccountForm,
EditProfileForm
)
from . import bp from . import bp
from .forms import AdminEditUserForm from .forms import AdminEditUserForm
from app.users.utils import ( from app.users.utils import (
@ -54,52 +58,116 @@ def user(user_id):
) )
@bp.route('/users/<hashid:user_id>/edit', methods=['GET', 'POST']) @bp.route('/users/<hashid:user_id>/settings', methods=['GET', 'POST'])
@register_breadcrumb(bp, '.users.entity.edit', 'Edit', endpoint_arguments_constructor=user_eac) @register_breadcrumb(bp, '.users.entity.settings', '<i class="material-icons left">settings</i>Settings')
def edit_user(user_id): def user_settings(user_id):
user = User.query.get_or_404(user_id) user = User.query.get_or_404(user_id)
admin_edit_user_form = AdminEditUserForm( # region forms
data={'confirmed': user.confirmed, 'role': user.role.hashid}, edit_account_form = EditAccountForm(user=user)
prefix='admin-edit-user-form' edit_profile_form = EditProfileForm(user=user)
) change_password_form = ChangePasswordForm(user=user)
edit_profile_settings_form = EditAccountForm( edit_notifications_form = EditNotificationsForm(user=user)
user, # endregion forms
data=user.to_json_serializeable(), # region handle edit profile settings form
prefix='edit-profile-settings-form' if edit_account_form.validate_on_submit():
) user.email = edit_account_form.email.data
edit_notification_settings_form = EditNotificationsForm( user.username = edit_account_form.username.data
data=user.to_json_serializeable(), db.session.commit()
prefix='edit-notification-settings-form' flash('Profile settings updated')
) return redirect(url_for('.user_settings'))
if (admin_edit_user_form.submit.data # endregion handle edit profile settings forms
and admin_edit_user_form.validate()): # region handle edit public profile information form
user.confirmed = admin_edit_user_form.confirmed.data if edit_profile_form.validate_on_submit():
role_id = hashids.decode(admin_edit_user_form.role.data) if edit_profile_form.avatar.data:
user.role = Role.query.get(role_id) try:
Avatar.create(
edit_profile_form.avatar.data,
user=user
)
except (AttributeError, OSError):
abort(500)
user.about_me = edit_profile_form.about_me.data
user.location = edit_profile_form.location.data
user.organization = edit_profile_form.organization.data
user.website = edit_profile_form.website.data
user.full_name = edit_profile_form.full_name.data
db.session.commit() db.session.commit()
flash('Your changes have been saved') flash('Your changes have been saved')
return redirect(url_for('.edit_user', user_id=user.id)) return redirect(url_for('.user_settings'))
if (edit_profile_settings_form.submit.data # endregion handle edit public profile information form
and edit_profile_settings_form.validate()): # region handle change_password_form POST
user.email = edit_profile_settings_form.email.data if change_password_form.validate_on_submit():
user.username = edit_profile_settings_form.username.data user.password = change_password_form.new_password.data
db.session.commit() db.session.commit()
flash('Your changes have been saved') flash('Your changes have been saved')
return redirect(url_for('.edit_user', user_id=user.id)) return redirect(url_for('.user_settings'))
if (edit_notification_settings_form.submit.data # endregion handle change_password_form POST
and edit_notification_settings_form.validate()): # region handle edit_notification_settings_form POST
if edit_notifications_form.validate_on_submit():
user.setting_job_status_mail_notification_level = \ user.setting_job_status_mail_notification_level = \
UserSettingJobStatusMailNotificationLevel[ edit_notifications_form.job_status_mail_notification_level.data
edit_notification_settings_form.job_status_mail_notification_level.data # noqa
]
db.session.commit() db.session.commit()
flash('Your changes have been saved') flash('Your changes have been saved')
return redirect(url_for('.edit_user', user_id=user.id)) return redirect(url_for('.user_settings'))
# endregion handle edit_notification_settings_form POST
return render_template( return render_template(
'admin/edit_user.html.j2', 'admin/user_settings.html.j2',
admin_edit_user_form=admin_edit_user_form, title='Settings',
edit_profile_settings_form=edit_profile_settings_form, change_password_form=change_password_form,
edit_notification_settings_form=edit_notification_settings_form, edit_account_form=edit_account_form,
title='Edit user', edit_notifications_form=edit_notifications_form,
edit_profile_form=edit_profile_form,
user=user user=user
) )
# @bp.route('/users/<hashid:user_id>/edit', methods=['GET', 'POST'])
# @register_breadcrumb(bp, '.users.entity.edit', 'Edit', endpoint_arguments_constructor=user_eac)
# def edit_user(user_id):
# user = User.query.get_or_404(user_id)
# admin_edit_user_form = AdminEditUserForm(
# data={'confirmed': user.confirmed, 'role': user.role.hashid},
# prefix='admin-edit-user-form'
# )
# edit_profile_settings_form = EditAccountForm(
# user,
# data=user.to_json_serializeable(),
# prefix='edit-profile-settings-form'
# )
# edit_notification_settings_form = EditNotificationsForm(
# data=user.to_json_serializeable(),
# prefix='edit-notification-settings-form'
# )
# if (admin_edit_user_form.submit.data
# and admin_edit_user_form.validate()):
# user.confirmed = admin_edit_user_form.confirmed.data
# role_id = hashids.decode(admin_edit_user_form.role.data)
# user.role = Role.query.get(role_id)
# db.session.commit()
# flash('Your changes have been saved')
# return redirect(url_for('.edit_user', user_id=user.id))
# if (edit_profile_settings_form.submit.data
# and edit_profile_settings_form.validate()):
# user.email = edit_profile_settings_form.email.data
# user.username = edit_profile_settings_form.username.data
# db.session.commit()
# flash('Your changes have been saved')
# return redirect(url_for('.edit_user', user_id=user.id))
# if (edit_notification_settings_form.submit.data
# and edit_notification_settings_form.validate()):
# user.setting_job_status_mail_notification_level = \
# UserSettingJobStatusMailNotificationLevel[
# edit_notification_settings_form.job_status_mail_notification_level.data # noqa
# ]
# db.session.commit()
# flash('Your changes have been saved')
# return redirect(url_for('.edit_user', user_id=user.id))
# return render_template(
# 'admin/edit_user.html.j2',
# admin_edit_user_form=admin_edit_user_form,
# edit_profile_settings_form=edit_profile_settings_form,
# edit_notification_settings_form=edit_notification_settings_form,
# title='Edit user',
# user=user
# )

View File

@ -4,7 +4,7 @@ from threading import Thread
import os import os
from app import db from app import db
from app.decorators import content_negotiation from app.decorators import content_negotiation
from app.models import Avatar, User from app.models import Avatar, User, ProfilePrivacySettings
from . import bp from . import bp
@bp.route('/<hashid:user_id>', methods=['DELETE']) @bp.route('/<hashid:user_id>', methods=['DELETE'])
@ -71,3 +71,28 @@ def update_user_is_public(user_id):
'category': 'corpus' 'category': 'corpus'
} }
return response_data, 200 return response_data, 200
# @bp.route('/<hashid:user_id>/profile-privacy-settings', methods=['PUT'])
# @login_required
# @content_negotiation(consumes='application/json', produces='application/json')
# def update_profile_privacy_settings(user_id):
# profile_privacy_settings = request.json
# if not isinstance(profile_privacy_settings, list):
# abort(400)
# for profile_privacy_setting in profile_privacy_settings:
# if not isinstance(profile_privacy_setting, str):
# abort(400)
# if not profile_privacy_setting in ProfilePrivacySettings.__members__:
# abort(400)
# user = User.query.get_or_404(user_id)
# user.is_public = is_public
# db.session.commit()
# response_data = {
# 'message': (
# f'User "{user.username}" is now'
# f' {"public" if is_public else "private"}'
# ),
# 'category': 'corpus'
# }
# return response_data, 200

View File

@ -45,7 +45,7 @@
</ul> </ul>
</div> </div>
<div class="card-action right-align"> <div class="card-action right-align">
<a class="btn waves-effect waves-light" href="{{ url_for('.edit_user', user_id=user.id) }}"><i class="material-icons left">edit</i>Edit</a> <a class="btn waves-effect waves-light" href="{{ url_for('.user_settings', user_id=user.id) }}"><i class="material-icons left">edit</i>Edit</a>
<a class="btn red modal-trigger waves-effect waves-light" data-target="delete-user-modal"><i class="material-icons left">delete</i>Delete</a> <a class="btn red modal-trigger waves-effect waves-light" data-target="delete-user-modal"><i class="material-icons left">delete</i>Delete</a>
</div> </div>
</div> </div>

View File

@ -0,0 +1,6 @@
{% extends "settings/settings.html.j2" %}
{% block page_content %}
{{ super() }}
ADMIN ADDITIONS
{% endblock page_content %}

View File

@ -19,26 +19,6 @@
<div class="col s8"> <div class="col s8">
<br> <br>
<ul class="collapsible no-autoinit settings-collapsible"> <ul class="collapsible no-autoinit settings-collapsible">
<li>
<div class="collapsible-header" style="justify-content: space-between;">
<span>User Settings</span>
<i class="caret material-icons right">keyboard_arrow_right</i>
</div>
<div class="collapsible-body">
<form method="POST" enctype="multipart/form-data">
<div class="row">
<div class="col s6">
{{ edit_account_form.hidden_tag() }}
{{ wtf.render_field(edit_account_form.username, material_icon='person') }}
{{ wtf.render_field(edit_account_form.email, material_icon='email') }}
</div>
</div>
<div class="right-align">
{{ wtf.render_field(edit_account_form.submit, material_icon='send') }}
</div>
</form>
</div>
</li>
<li> <li>
<div class="collapsible-header" style="justify-content: space-between;"><span>Public Profile</span><i class="material-icons caret right">keyboard_arrow_right</i></div> <div class="collapsible-header" style="justify-content: space-between;"><span>Public Profile</span><i class="material-icons caret right">keyboard_arrow_right</i></div>
<div class="collapsible-body"> <div class="collapsible-body">
@ -57,6 +37,26 @@
<div class="divider"></div> <div class="divider"></div>
<p>Show:</p> <p>Show:</p>
<div class="row"> <div class="row">
<div class="col s3">
<label>
<input {% if user.has_profile_privacy_setting('SHOW_EMAIL') %}checked{% endif %} id="profile-show-email-checkbox" type="checkbox">
<span>Email</span>
</label>
</div>
<div class="col s3">
<label>
<input {% if user.has_profile_privacy_setting('SHOW_LAST_SEEN') %}checked{% endif %} id="profile-show-last-seen-checkbox" type="checkbox">
<span>Last seen</span>
</label>
</div>
<div class="col s3">
<label>
<input {% if user.has_profile_privacy_setting('SHOW_MEMBER_SINCE') %}checked{% endif %} id="profile-show-member-since-checkbox" type="checkbox">
<span>Member since</span>
</label>
</div>
</div>
{# <div class="row">
<div class="col s3"> <div class="col s3">
<p> <p>
<label> <label>
@ -81,7 +81,7 @@
</label> </label>
</p> </p>
</div> </div>
</div> </div> #}
<p></p> <p></p>
<br> <br>
{{ wtf.render_field(edit_profile_form.full_name, material_icon='badge') }} {{ wtf.render_field(edit_profile_form.full_name, material_icon='badge') }}
@ -125,7 +125,33 @@
<ul class="collapsible no-autoinit settings-collapsible"> <ul class="collapsible no-autoinit settings-collapsible">
<li> <li>
<div class="collapsible-header" style="justify-content: space-between;"> <div class="collapsible-header" style="justify-content: space-between;">
<span>Notification Settings</span> <span>Account</span>
<i class="caret material-icons right">keyboard_arrow_right</i>
</div>
<div class="collapsible-body">
<form method="POST" enctype="multipart/form-data">
{{ edit_account_form.hidden_tag() }}
{{ wtf.render_field(edit_account_form.username, material_icon='person') }}
{{ wtf.render_field(edit_account_form.email, material_icon='email') }}
<div class="right-align">
{{ wtf.render_field(edit_account_form.submit, material_icon='send') }}
</div>
</form>
<br>
<div class="divider"></div>
<p>Deleting an account has the following effects:</p>
<ul>
<li>All data associated with your corpora and jobs will be permanently deleted.</li>
<li>All settings will be permanently deleted.</li>
</ul>
<div class="right-align">
<a class="btn red waves-effect waves-light modal-trigger" href="#delete-user"><i class="material-icons left">delete</i>Delete</a>
</div>
</div>
</li>
<li>
<div class="collapsible-header" style="justify-content: space-between;">
<span>Notifications</span>
<i class="caret material-icons">keyboard_arrow_right</i> <i class="caret material-icons">keyboard_arrow_right</i>
</div> </div>
<div class="collapsible-body"> <div class="collapsible-body">
@ -155,22 +181,6 @@
</form> </form>
</div> </div>
</li> </li>
<li>
<div class="collapsible-header" style="justify-content: space-between;">
<span>Delete Account</span>
<i class="caret material-icons right">keyboard_arrow_right</i>
</div>
<div class="collapsible-body">
<p>Deleting an account has the following effects:</p>
<ul>
<li>All data associated with your corpora and jobs will be permanently deleted.</li>
<li>All settings will be permanently deleted.</li>
</ul>
<div class="right-align">
<a class="btn red waves-effect waves-light modal-trigger" href="#delete-user"><i class="material-icons left">delete</i>Delete</a>
</div>
</div>
</li>
</ul> </ul>
</div> </div>
</div> </div>