From 8786defa01e8df4be15d282e018c755a2323d20c Mon Sep 17 00:00:00 2001 From: Stephan Porada <sporada@uni-bielefeld.de> Date: Mon, 9 Sep 2019 16:17:59 +0200 Subject: [PATCH] Add function to change user email --- app/auth/forms.py | 17 ++++- app/auth/views.py | 22 ++++--- app/models.py | 1 + app/templates/admin/admin_user_page.html.j2 | 2 +- app/templates/auth/edit_profile.html.j2 | 69 +++++++++++++++++++++ app/templates/auth/settings.html.j2 | 45 -------------- app/templates/base.html.j2 | 2 +- 7 files changed, 103 insertions(+), 55 deletions(-) create mode 100644 app/templates/auth/edit_profile.html.j2 delete mode 100644 app/templates/auth/settings.html.j2 diff --git a/app/auth/forms.py b/app/auth/forms.py index 606c069f..4a524cfa 100644 --- a/app/auth/forms.py +++ b/app/auth/forms.py @@ -1,5 +1,5 @@ from flask_wtf import FlaskForm -from wtforms import StringField, PasswordField, BooleanField, SubmitField, ValidationError +from wtforms import StringField, PasswordField, BooleanField, SubmitField, ValidationError, TextAreaField from wtforms.validators import DataRequired, Length, Email, Regexp, EqualTo from ..models import User @@ -76,3 +76,18 @@ class ChangePasswordForm(FlaskForm): ] ) submit = SubmitField('Update Password') + + +class EditProfileForm(FlaskForm): + email = StringField('Change Email', validators=[Length(0, 64), + DataRequired()]) + submit = SubmitField('Change Email') + + def __init__(self, user, *args, **kwargs): + super(EditProfileForm, 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!') diff --git a/app/auth/views.py b/app/auth/views.py index 7e963e36..d3535ac2 100644 --- a/app/auth/views.py +++ b/app/auth/views.py @@ -2,7 +2,7 @@ from flask import flash, redirect, render_template, request, url_for from flask_login import current_user, login_required, login_user, logout_user from . import auth from .. import db -from .forms import ChangePasswordForm, LoginForm, PasswordResetForm, PasswordResetRequestForm, RegistrationForm +from .forms import ChangePasswordForm, LoginForm, PasswordResetForm, PasswordResetRequestForm, RegistrationForm, EditProfileForm from ..email import send_email from ..models import User @@ -131,9 +131,9 @@ def password_reset(token): title='Password Reset') -@auth.route('/settings', methods=['GET', 'POST']) +@auth.route('/edit_profile', methods=['GET', 'POST']) @login_required -def settings(): +def edit_profile(): """ View where loged in User can change own User information like Password etc. """ @@ -144,11 +144,19 @@ def settings(): db.session.add(current_user) db.session.commit() flash('Your password has been updated.') - return redirect(url_for('auth.settings')) + return redirect(url_for('auth.edit_profile')) else: flash('Invalid password.') + change_profile_form = EditProfileForm(user=current_user) + if change_profile_form.validate_on_submit(): + current_user.email = change_profile_form.email.data + db.session.add(current_user._get_current_object()) + db.session.commit() + flash('Your email has been updated.') + change_profile_form.email.data = current_user.email return render_template( - 'auth/settings.html.j2', - form=change_password_form, - title='Settings' + 'auth/edit_profile.html.j2', + change_password_form=change_password_form, + change_profile_form=change_profile_form, + title='Edit Profile' ) diff --git a/app/models.py b/app/models.py index bf62399c..0f28882f 100644 --- a/app/models.py +++ b/app/models.py @@ -216,6 +216,7 @@ class User(UserMixin, db.Model): jobs[str(job.id)] = job.to_dict() return jobs + class AnonymousUser(AnonymousUserMixin): """ Model replaces the default AnonymousUser. diff --git a/app/templates/admin/admin_user_page.html.j2 b/app/templates/admin/admin_user_page.html.j2 index 49b1a35d..6f892a0a 100644 --- a/app/templates/admin/admin_user_page.html.j2 +++ b/app/templates/admin/admin_user_page.html.j2 @@ -58,7 +58,7 @@ <span class="card-title">Administration actions</span> <!-- Confirm deletion of selected user with modal dialogue Modal Trigger--> - <a href="#modal-confirm-delete" class="waves-effect waves-light btn modal-trigger"><i class="material-icons left">delete</i>Delete User</a> + <a href="#modal-confirm-delete" class="waves-effect waves-light btn red modal-trigger"><i class="material-icons left">delete</i>Delete User</a> <!-- Modal Strucutre --> <div id="modal-confirm-delete" class="modal"> <div class="modal-content"> diff --git a/app/templates/auth/edit_profile.html.j2 b/app/templates/auth/edit_profile.html.j2 new file mode 100644 index 00000000..669bc08f --- /dev/null +++ b/app/templates/auth/edit_profile.html.j2 @@ -0,0 +1,69 @@ +{% extends "base.html.j2" %} + +{% block page_content %} +<div class="col s12 m4"> + <h3>Change password</h3> + <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,</p> +</div> + +<div class="col s12 m8"> + <div class="card"> + <form method="POST"> + <div class="card-content"> + {{ change_password_form.hidden_tag() }} + <div class="input-field "> + <i class="material-icons prefix">vpn_key</i> + {{ change_password_form.old_password() }} + {{ change_password_form.old_password.label }} + {% for error in change_password_form.old_password.errors %} + <span class="helper-text red-text">{{ error }}</span> + {% endfor %} + </div> + <div class="input-field"> + <i class="material-icons prefix">vpn_key</i> + {{ change_password_form.new_password() }} + {{ change_password_form.new_password.label }} + {% for error in change_password_form.new_password.errors %} + <span class="helper-text red-text">{{ error }}</span> + {% endfor %} + </div> + <div class="input-field"> + <i class="material-icons prefix">vpn_key</i> + {{ change_password_form.new_password2() }} + {{ change_password_form.new_password2.label }} + {% for error in change_password_form.new_password2.errors %} + <span class="helper-text red-text">{{ error }}</span> + {% endfor %} + </div> + </div> + <div class="card-action right-align"> + {{ change_password_form.submit(class='btn') }} + </div> + </form> + </div> +</div> +<div class="col s12 m4"> + <h3>Change email</h3> + <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,</p> +</div> +<div class="col s12 m8"> + <div class="card"> + <form method="POST"> + <div class="card-content"> + {{ change_profile_form.hidden_tag() }} + <div class="input-field "> + <i class="material-icons prefix">mail</i> + {{ change_profile_form.email() }} + {{ change_profile_form.email.label }} + {% for error in change_profile_form.email.errors %} + <span class="helper-text red-text">{{ error }}</span> + {% endfor %} + </div> + </div> + <div class="card-action right-align"> + {{ change_profile_form.submit(class='btn') }} + </div> + </form> + </div> +</div> +{% endblock %} diff --git a/app/templates/auth/settings.html.j2 b/app/templates/auth/settings.html.j2 deleted file mode 100644 index a99b3172..00000000 --- a/app/templates/auth/settings.html.j2 +++ /dev/null @@ -1,45 +0,0 @@ -{% extends "base.html.j2" %} - -{% block page_content %} -<div class="col s12 m4"> - <h3>Change password</h3> - <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,</p> -</div> - -<div class="col s12 m8"> - <div class="card"> - <form method="POST"> - <div class="card-content"> - {{ form.hidden_tag() }} - <div class="input-field "> - <i class="material-icons prefix">vpn_key</i> - {{ form.old_password() }} - {{ form.old_password.label }} - {% for error in form.old_password.errors %} - <span class="helper-text red-text">{{ error }}</span> - {% endfor %} - </div> - <div class="input-field"> - <i class="material-icons prefix">vpn_key</i> - {{ form.new_password() }} - {{ form.new_password.label }} - {% for error in form.new_password.errors %} - <span class="helper-text red-text">{{ error }}</span> - {% endfor %} - </div> - <div class="input-field"> - <i class="material-icons prefix">vpn_key</i> - {{ form.new_password2() }} - {{ form.new_password2.label }} - {% for error in form.new_password2.errors %} - <span class="helper-text red-text">{{ error }}</span> - {% endfor %} - </div> - </div> - <div class="card-action right-align"> - {{ form.submit(class='btn') }} - </div> - </form> - </div> -</div> -{% endblock %} diff --git a/app/templates/base.html.j2 b/app/templates/base.html.j2 index f5f264e1..c7dd5678 100644 --- a/app/templates/base.html.j2 +++ b/app/templates/base.html.j2 @@ -72,7 +72,7 @@ </div> <ul id="nav-account-dropdown" class="dropdown-content"> {% if current_user.is_authenticated %} - <li><a href="{{ url_for('auth.settings') }}"><i class="material-icons">settings</i>Settings</a></li> + <li><a href="{{ url_for('auth.edit_profile') }}"><i class="material-icons">edit_profile</i>Edit Profile</a></li> <li><a href="{{ url_for('auth.logout') }}"><i class="material-icons">chevron_left</i>Log out</a></li> {% else %} <li><a href="{{ url_for('auth.login') }}"><i class="material-icons">chevron_right</i>Log in</a></li> -- GitLab