Rework settings page.

This commit is contained in:
Patrick Jentsch
2020-02-19 14:49:52 +01:00
parent 5e4666d3c8
commit c90cd4d8a3
7 changed files with 226 additions and 257 deletions

View File

@ -1,44 +1,38 @@
from app.models import User
from flask_wtf import FlaskForm
from wtforms import (PasswordField, StringField, SubmitField,
ValidationError, BooleanField)
from wtforms.validators import DataRequired, EqualTo, Email
from wtforms import (BooleanField, PasswordField, StringField, SubmitField,
ValidationError)
from wtforms.validators import DataRequired, Email, EqualTo
class ChangePasswordForm(FlaskForm):
"""
Form to change information of currently logged in User. User can change
informations about him on his own.
"""
old_password = PasswordField('Old password', validators=[DataRequired()])
new_password = PasswordField(
class EditEmailForm(FlaskForm):
email = StringField('New email', validators=[Email(), DataRequired()])
save_email = SubmitField('Save Email')
class EditGeneralSettingsForm(FlaskForm):
dark_mode = BooleanField('Dark mode')
save_settings = SubmitField('Save Settings')
class EditPasswordForm(FlaskForm):
current_password = PasswordField('Current password',
validators=[DataRequired()])
password = PasswordField(
'New password',
validators=[DataRequired(),
EqualTo('new_password2', message='Passwords must match.')]
validators=[DataRequired(), EqualTo('password_confirmation',
message='Passwords must match.')]
)
new_password2 = PasswordField(
'Confirm new password',
password_confirmation = PasswordField(
'Password confirmation',
validators=[DataRequired(),
EqualTo('new_password', message='Passwords must match.')]
EqualTo('password', message='Passwords must match.')]
)
submit = SubmitField('Update Password')
class EditProfileForm(FlaskForm):
email = StringField('Change Email',
validators=[Email(), DataRequired()])
submit = SubmitField('Change Email')
save_password = SubmitField('Save Password')
def __init__(self, user, *args, **kwargs):
super(EditProfileForm, self).__init__(*args, **kwargs)
super(EditPasswordForm, self).__init__(*args, **kwargs)
self.user = user
def validate_email(self, field):
if field.data != self.user.email and \
User.query.filter_by(email=field.data).first():
raise ValidationError('Email already registered!')
class EditUserSettingsForm(FlaskForm):
is_dark = BooleanField('Dark Mode')
submit = SubmitField('Save Settings')
def validate_current_password(self, field):
if not self.user.verify_password(field.data):
raise ValidationError('Invalid password.')

View File

@ -1,102 +1,65 @@
from app import db, logger
from flask import abort, current_app, flash, redirect, render_template, url_for
from app import db
from flask import current_app, flash, redirect, render_template, url_for
from flask_login import current_user, login_required, logout_user
from threading import Thread
from . import profile
from .background_functions import delete_user_
from .forms import ChangePasswordForm, EditProfileForm, EditUserSettingsForm
from .forms import EditEmailForm, EditGeneralSettingsForm, EditPasswordForm
@profile.route('/', methods=['GET', 'POST'])
@profile.route('/settings', methods=['GET', 'POST'])
@login_required
def index():
"""
View where loged in User can change own User information like Password etc.
"""
edit_user_info_form = EditProfileForm(user=current_user)
edit_user_info_form.email.data = current_user.email
return render_template('profile/index.html.j2',
change_password_form=ChangePasswordForm(),
edit_user_info_form=edit_user_info_form,
edit_user_settings_form=EditUserSettingsForm(),
title='Profile')
@profile.route('/change_password', methods=['POST'])
@login_required
def profile_change_password():
edit_user_info_form = EditProfileForm(user=current_user)
change_password_form = ChangePasswordForm()
if change_password_form.validate_on_submit():
if current_user.verify_password(change_password_form.old_password.data):
current_user.password = change_password_form.new_password.data
db.session.add(current_user)
db.session.commit()
flash('Your password has been updated.')
return render_template('profile/index.html.j2',
change_password_form=change_password_form,
edit_user_info_form=edit_user_info_form,
edit_user_settings_form=EditUserSettingsForm(),
title='Profile')
else:
flash('Invalid password.')
return render_template('profile/index.html.j2',
change_password_form=change_password_form,
edit_user_info_form=edit_user_info_form,
edit_user_settings_form=EditUserSettingsForm(),
title='Profile')
@profile.route('/edit_user_info', methods=['POST'])
@login_required
def profile_edit_user_info():
edit_user_info_form = EditProfileForm(user=current_user)
if edit_user_info_form.validate_on_submit():
current_user.email = edit_user_info_form.email.data
db.session.add(current_user._get_current_object())
def settings():
edit_email_form = EditEmailForm(prefix='edit-email-form')
edit_general_settings_form = EditGeneralSettingsForm(
prefix='edit-settings-form'
)
edit_password_form = EditPasswordForm(prefix='edit-password-form',
user=current_user)
# Check if edit_email_form is submitted and valid
if (edit_email_form.save_email.data
and edit_email_form.validate_on_submit()):
db.session.add(current_user)
db.session.commit()
flash('Your email has been updated.')
else:
logger.warning('Form: {}'.format(edit_user_info_form.errors))
return render_template('profile/index.html.j2',
change_password_form=ChangePasswordForm(),
edit_user_info_form=edit_user_info_form,
edit_user_settings_form=EditUserSettingsForm(),
title='Profile')
edit_user_info_form.email.data = current_user.email
return render_template('profile/index.html.j2',
change_password_form=ChangePasswordForm(),
edit_user_info_form=EditProfileForm(user=current_user),
edit_user_settings_form=EditUserSettingsForm(),
title='Profile')
flash('Your email address has been updated.')
return redirect(url_for('profile.settings'))
# Check if edit_settings_form is submitted and valid
if (edit_general_settings_form.save_settings.data
and edit_general_settings_form.validate_on_submit()):
current_user.is_dark = edit_general_settings_form.dark_mode.data
db.session.add(current_user)
db.session.commit()
flash('Your settings have been updated.')
return redirect(url_for('profile.settings'))
# Check if edit_password_form is submitted and valid
if (edit_password_form.save_password.data
and edit_password_form.validate_on_submit()):
current_user.password = edit_password_form.password.data
db.session.add(current_user)
db.session.commit()
flash('Your password has been updated.')
return redirect(url_for('profile.settings'))
# If no form is submitted or valid, fill out fields with current values
edit_email_form.email.data = current_user.email
edit_general_settings_form.dark_mode.data = current_user.is_dark
return render_template(
'profile/settings.html.j2',
edit_email_form=edit_email_form,
edit_password_form=edit_password_form,
edit_general_settings_form=edit_general_settings_form,
title='Settings'
)
@profile.route('/edit_user_settings', methods=['POST'])
@profile.route('/delete', methods=['GET', 'POST'])
@login_required
def profile_edit_user_settings():
edit_user_settings_form = EditUserSettingsForm()
if not edit_user_settings_form.validate_on_submit():
abort(400)
current_user.is_dark = edit_user_settings_form.is_dark.data
logger.warning('Form data: {}'.format(current_user.is_dark))
db.session.add(current_user)
db.session.commit()
if current_user.is_dark is True:
flash('Dark mode has been activated!')
else:
flash('Dark mode has been deactivated!')
return redirect(url_for('profile.index'))
@profile.route('/delete_self', methods=['GET', 'POST'])
@login_required
def delete_self():
def delete():
"""
View to delete yourslef and all associated data.
"""
logout_user()
thread = Thread(target=delete_user_,
args=(current_app._get_current_object(), current_user.id))
thread.start()
logout_user()
flash('Your account has been deleted!')
return redirect(url_for('main.index'))