from flask import abort, flash, redirect, render_template, url_for from flask_breadcrumbs import register_breadcrumb from app import db, hashids from app.models import Avatar, Corpus, Role, User from app.users.settings.forms import ( UpdateAvatarForm, UpdatePasswordForm, UpdateNotificationsForm, UpdateAccountInformationForm, UpdateProfileInformationForm ) from . import bp from .forms import UpdateUserForm from app.users.utils import ( user_endpoint_arguments_constructor as user_eac, user_dynamic_list_constructor as user_dlc ) @bp.route('') @register_breadcrumb(bp, '.', 'admin_panel_settingsAdministration') def admin(): return render_template( 'admin/admin.html.j2', title='Administration' ) @bp.route('/corpora') @register_breadcrumb(bp, '.corpora', 'Corpora') def corpora(): corpora = Corpus.query.all() return render_template( 'admin/corpora.html.j2', title='Corpora', corpora=corpora ) @bp.route('/users') @register_breadcrumb(bp, '.users', 'groupUsers') def users(): users = User.query.all() return render_template( 'admin/users.html.j2', title='Users', users=users ) @bp.route('/users/') @register_breadcrumb(bp, '.users.entity', '', dynamic_list_constructor=user_dlc) def user(user_id): user = User.query.get_or_404(user_id) corpora = Corpus.query.filter(Corpus.user == user).all() return render_template( 'admin/user.html.j2', title=user.username, user=user, corpora=corpora ) @bp.route('/users//settings', methods=['GET', 'POST']) @register_breadcrumb(bp, '.users.entity.settings', 'settingsSettings') def user_settings(user_id): user = User.query.get_or_404(user_id) update_account_information_form = UpdateAccountInformationForm(user) update_profile_information_form = UpdateProfileInformationForm(user) update_avatar_form = UpdateAvatarForm() update_password_form = UpdatePasswordForm(user) update_notifications_form = UpdateNotificationsForm(user) update_user_form = UpdateUserForm(user) # region handle update profile information form if update_profile_information_form.submit.data and update_profile_information_form.validate(): user.about_me = update_profile_information_form.about_me.data user.location = update_profile_information_form.location.data user.organization = update_profile_information_form.organization.data user.website = update_profile_information_form.website.data user.full_name = update_profile_information_form.full_name.data db.session.commit() flash('Your changes have been saved') return redirect(url_for('.user_settings', user_id=user.id)) # endregion handle update profile information form # region handle update avatar form if update_avatar_form.submit.data and update_avatar_form.validate(): try: Avatar.create( update_avatar_form.avatar.data, user=user ) except (AttributeError, OSError): abort(500) db.session.commit() flash('Your changes have been saved') return redirect(url_for('.user_settings', user_id=user.id)) # endregion handle update avatar form # region handle update account information form if update_account_information_form.submit.data and update_account_information_form.validate(): user.email = update_account_information_form.email.data user.username = update_account_information_form.username.data db.session.commit() flash('Profile settings updated') return redirect(url_for('.user_settings', user_id=user.id)) # endregion handle update account information form # region handle update password form if update_password_form.submit.data and update_password_form.validate(): user.password = update_password_form.new_password.data db.session.commit() flash('Your changes have been saved') return redirect(url_for('.user_settings', user_id=user.id)) # endregion handle update password form # region handle update notifications form if update_notifications_form.submit.data and update_notifications_form.validate(): user.setting_job_status_mail_notification_level = \ update_notifications_form.job_status_mail_notification_level.data db.session.commit() flash('Your changes have been saved') return redirect(url_for('.user_settings', user_id=user.id)) # endregion handle update notifications form # region handle update user form if update_user_form.submit.data and update_user_form.validate(): role_id = hashids.decode(update_user_form.role.data) user.role = Role.query.get(role_id) db.session.commit() flash('Your changes have been saved') return redirect(url_for('.user_settings', user_id=user.id)) # endregion handle update user form return render_template( 'admin/user_settings.html.j2', title='Settings', update_account_information_form=update_account_information_form, update_avatar_form=update_avatar_form, update_notifications_form=update_notifications_form, update_password_form=update_password_form, update_profile_information_form=update_profile_information_form, update_user_form=update_user_form, user=user )