Skip to content
Snippets Groups Projects
Commit c90cd4d8 authored by Patrick Jentsch's avatar Patrick Jentsch
Browse files

Rework settings page.

parent 5e4666d3
No related branches found
No related tags found
No related merge requests found
...@@ -6,7 +6,7 @@ from wtforms.validators import DataRequired, Email, EqualTo, Length, Regexp ...@@ -6,7 +6,7 @@ from wtforms.validators import DataRequired, Email, EqualTo, Length, Regexp
class LoginForm(FlaskForm): class LoginForm(FlaskForm):
user = StringField('Email address or username', validators=[DataRequired(), Length(1, 64)]) user = StringField('Username', validators=[DataRequired(), Length(1, 64)])
password = PasswordField('Password', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()])
remember_me = BooleanField('Keep me logged in') remember_me = BooleanField('Keep me logged in')
submit = SubmitField('Log In') submit = SubmitField('Log In')
......
...@@ -9,9 +9,7 @@ from . import main ...@@ -9,9 +9,7 @@ from . import main
def index(): def index():
login_form = LoginForm(prefix='login-form') login_form = LoginForm(prefix='login-form')
if login_form.validate_on_submit(): if login_form.validate_on_submit():
user = User.query.filter_by(email=login_form.user.data).first() user = User.query.filter_by(username=login_form.user.data).first()
if user is None:
user = User.query.filter_by(username=login_form.user.data).first()
if user is not None and user.verify_password(login_form.password.data): if user is not None and user.verify_password(login_form.password.data):
login_user(user, login_form.remember_me.data) login_user(user, login_form.remember_me.data)
next = request.args.get('next') next = request.args.get('next')
...@@ -32,8 +30,3 @@ def dashboard(): ...@@ -32,8 +30,3 @@ def dashboard():
@main.route('/poster') @main.route('/poster')
def poster(): def poster():
return render_template('main/poster.html.j2', title='Dienste und Prozesse') return render_template('main/poster.html.j2', title='Dienste und Prozesse')
@main.route('/poster2')
def poster2():
return render_template('main/poster2.html.j2', title='Dienste und Prozesse')
from app.models import User
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from wtforms import (PasswordField, StringField, SubmitField, from wtforms import (BooleanField, PasswordField, StringField, SubmitField,
ValidationError, BooleanField) ValidationError)
from wtforms.validators import DataRequired, EqualTo, Email from wtforms.validators import DataRequired, Email, EqualTo
class ChangePasswordForm(FlaskForm): class EditEmailForm(FlaskForm):
""" email = StringField('New email', validators=[Email(), DataRequired()])
Form to change information of currently logged in User. User can change save_email = SubmitField('Save Email')
informations about him on his own.
"""
old_password = PasswordField('Old password', validators=[DataRequired()]) class EditGeneralSettingsForm(FlaskForm):
new_password = PasswordField( dark_mode = BooleanField('Dark mode')
save_settings = SubmitField('Save Settings')
class EditPasswordForm(FlaskForm):
current_password = PasswordField('Current password',
validators=[DataRequired()])
password = PasswordField(
'New password', 'New password',
validators=[DataRequired(), validators=[DataRequired(), EqualTo('password_confirmation',
EqualTo('new_password2', message='Passwords must match.')] message='Passwords must match.')]
) )
new_password2 = PasswordField( password_confirmation = PasswordField(
'Confirm new password', 'Password confirmation',
validators=[DataRequired(), validators=[DataRequired(),
EqualTo('new_password', message='Passwords must match.')] EqualTo('password', message='Passwords must match.')]
) )
submit = SubmitField('Update Password') save_password = SubmitField('Save Password')
class EditProfileForm(FlaskForm):
email = StringField('Change Email',
validators=[Email(), DataRequired()])
submit = SubmitField('Change Email')
def __init__(self, user, *args, **kwargs): def __init__(self, user, *args, **kwargs):
super(EditProfileForm, self).__init__(*args, **kwargs) super(EditPasswordForm, self).__init__(*args, **kwargs)
self.user = user self.user = user
def validate_email(self, field): def validate_current_password(self, field):
if field.data != self.user.email and \ if not self.user.verify_password(field.data):
User.query.filter_by(email=field.data).first(): raise ValidationError('Invalid password.')
raise ValidationError('Email already registered!')
class EditUserSettingsForm(FlaskForm):
is_dark = BooleanField('Dark Mode')
submit = SubmitField('Save Settings')
from app import db, logger from app import db
from flask import abort, current_app, flash, redirect, render_template, url_for from flask import current_app, flash, redirect, render_template, url_for
from flask_login import current_user, login_required, logout_user from flask_login import current_user, login_required, logout_user
from threading import Thread from threading import Thread
from . import profile from . import profile
from .background_functions import delete_user_ 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 @login_required
def index(): def settings():
""" edit_email_form = EditEmailForm(prefix='edit-email-form')
View where loged in User can change own User information like Password etc. edit_general_settings_form = EditGeneralSettingsForm(
""" prefix='edit-settings-form'
edit_user_info_form = EditProfileForm(user=current_user) )
edit_user_info_form.email.data = current_user.email edit_password_form = EditPasswordForm(prefix='edit-password-form',
return render_template('profile/index.html.j2', user=current_user)
change_password_form=ChangePasswordForm(), # Check if edit_email_form is submitted and valid
edit_user_info_form=edit_user_info_form, if (edit_email_form.save_email.data
edit_user_settings_form=EditUserSettingsForm(), and edit_email_form.validate_on_submit()):
title='Profile') db.session.add(current_user)
@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())
db.session.commit() db.session.commit()
flash('Your email has been updated.') flash('Your email address has been updated.')
else: return redirect(url_for('profile.settings'))
logger.warning('Form: {}'.format(edit_user_info_form.errors)) # Check if edit_settings_form is submitted and valid
return render_template('profile/index.html.j2', if (edit_general_settings_form.save_settings.data
change_password_form=ChangePasswordForm(), and edit_general_settings_form.validate_on_submit()):
edit_user_info_form=edit_user_info_form, current_user.is_dark = edit_general_settings_form.dark_mode.data
edit_user_settings_form=EditUserSettingsForm(), db.session.add(current_user)
title='Profile') db.session.commit()
edit_user_info_form.email.data = current_user.email flash('Your settings have been updated.')
return render_template('profile/index.html.j2', return redirect(url_for('profile.settings'))
change_password_form=ChangePasswordForm(), # Check if edit_password_form is submitted and valid
edit_user_info_form=EditProfileForm(user=current_user), if (edit_password_form.save_password.data
edit_user_settings_form=EditUserSettingsForm(), and edit_password_form.validate_on_submit()):
title='Profile') current_user.password = edit_password_form.password.data
db.session.add(current_user)
db.session.commit()
@profile.route('/edit_user_settings', methods=['POST']) flash('Your password has been updated.')
@login_required return redirect(url_for('profile.settings'))
def profile_edit_user_settings(): # If no form is submitted or valid, fill out fields with current values
edit_user_settings_form = EditUserSettingsForm() edit_email_form.email.data = current_user.email
if not edit_user_settings_form.validate_on_submit(): edit_general_settings_form.dark_mode.data = current_user.is_dark
abort(400) return render_template(
current_user.is_dark = edit_user_settings_form.is_dark.data 'profile/settings.html.j2',
logger.warning('Form data: {}'.format(current_user.is_dark)) edit_email_form=edit_email_form,
db.session.add(current_user) edit_password_form=edit_password_form,
db.session.commit() edit_general_settings_form=edit_general_settings_form,
if current_user.is_dark is True: title='Settings'
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']) @profile.route('/delete', methods=['GET', 'POST'])
@login_required @login_required
def delete_self(): def delete():
""" """
View to delete yourslef and all associated data. View to delete yourslef and all associated data.
""" """
logout_user()
thread = Thread(target=delete_user_, thread = Thread(target=delete_user_,
args=(current_app._get_current_object(), current_user.id)) args=(current_app._get_current_object(), current_user.id))
thread.start() thread.start()
logout_user()
flash('Your account has been deleted!') flash('Your account has been deleted!')
return redirect(url_for('main.index')) return redirect(url_for('main.index'))
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
</div> </div>
<ul id="nav-account-dropdown" class="dropdown-content"> <ul id="nav-account-dropdown" class="dropdown-content">
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
<li><a href="{{ url_for('profile.index') }}"><i class="material-icons">settings</i>Settings</a></li> <li><a href="{{ url_for('profile.settings') }}"><i class="material-icons">settings</i>Settings</a></li>
<li><a href="{{ url_for('auth.logout') }}"><i class="material-icons">power_settings_new</i>Log out</a></li> <li><a href="{{ url_for('auth.logout') }}"><i class="material-icons">power_settings_new</i>Log out</a></li>
{% else %} {% else %}
<li><a href="{{ url_for('main.index', _anchor='registration-and-log-in') }}"><i class="material-icons">person</i>Log in</a></li> <li><a href="{{ url_for('main.index', _anchor='registration-and-log-in') }}"><i class="material-icons">person</i>Log in</a></li>
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
<li><div class="divider"></div></li> <li><div class="divider"></div></li>
<li><a class="subheader">Account</a></li> <li><a class="subheader">Account</a></li>
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
<li><a href="{{ url_for('profile.index') }}"><i class="material-icons">settings</i>Settings</a></li> <li><a href="{{ url_for('profile.settings') }}"><i class="material-icons">settings</i>Settings</a></li>
<li><a href="{{ url_for('auth.logout') }}"><i class="material-icons">power_settings_new</i>Log out</a></li> <li><a href="{{ url_for('auth.logout') }}"><i class="material-icons">power_settings_new</i>Log out</a></li>
{% else %} {% else %}
<li><a href="{{ url_for('main.index') }}"><i class="material-icons">person</i>Log in</a></li> <li><a href="{{ url_for('main.index') }}"><i class="material-icons">person</i>Log in</a></li>
......
...@@ -2,129 +2,148 @@ ...@@ -2,129 +2,148 @@
{% block page_content %} {% block page_content %}
<div class="col s12 m4"> <div class="col s12 m4">
<h3>Dark Mode</h3> <h3>General settings</h3>
<p>Activate Dark Mode to ease your eyes!</p>
</div> </div>
<div class="col s12 m8"> <div class="col s12 m8">
<br class="hide-on-small-only">
<div class="card"> <div class="card">
<div class="card-content"> <div class="card-content">
<form action="{{ url_for('profile.profile_edit_user_settings') }}" method="POST"> <form method="POST">
{{ edit_user_settings_form.hidden_tag() }} {{ edit_general_settings_form.hidden_tag() }}
<div class="switch"> <div class="row">
<i class="material-icons prefix">brightness_3</i> <div class="col s9">
Dark Mode: <p><i class="material-icons left">brightness_3</i>{{ edit_general_settings_form.dark_mode.label.text }}</p>
<label class="active" for="{{edit_user_settings_form.is_dark.name}}"> <p class="light">Activate dark mode to ease your eyes.</p>
Off </div>
{% if current_user.is_dark == True %} <div class="col s3 right-align">
<input type="checkbox" id="{{edit_user_settings_form.is_dark.name}}" name="{{edit_user_settings_form.is_dark.name}}" checked="checked"> <div class="switch">
{% else %} <label>
<input type="checkbox" id="{{edit_user_settings_form.is_dark.name}}" name="{{edit_user_settings_form.is_dark.name}}"> {{ edit_general_settings_form.dark_mode() }}
{% endif %} <span class="lever"></span>
<span class="lever"></span> </label>
On </div>
</label> </div>
<!--
Seperate each setting with the following two elements
<div class="col s12 divider"></div>
<div class="col s12"><p>&nbsp;</p></div>
-->
</div> </div>
</div> </div>
<div class="card-action right-align"> <div class="card-action right-align">
{{ edit_user_settings_form.submit(class='btn') }} {{ edit_general_settings_form.save_settings(class='btn') }}
</div> </div>
</form> </form>
</div> </div>
</div> </div>
<div class="col s12"></div> <div class="col s12"></div>
<div class="col s12 m4"> <div class="col s12 m4">
<h3>Change password</h3> <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>
<div class="col s12 m8"> <div class="col s12 m8">
<br class="hide-on-small-only">
<div class="card"> <div class="card">
<form action="{{ url_for('profile.profile_change_password') }}" method="POST"> <form method="POST">
<div class="card-content"> <div class="card-content">
{{ change_password_form.hidden_tag() }} {{ edit_password_form.hidden_tag() }}
<div class="input-field "> <div class="input-field ">
<i class="material-icons prefix">vpn_key</i> <i class="material-icons prefix">vpn_key</i>
{{ change_password_form.old_password() }} {{ edit_password_form.current_password() }}
{{ change_password_form.old_password.label }} {{ edit_password_form.current_password.label }}
{% for error in change_password_form.old_password.errors %} {% for error in edit_password_form.current_password.errors %}
<span class="helper-text red-text">{{ error }}</span> <span class="helper-text red-text">{{ error }}</span>
{% endfor %} {% endfor %}
</div> </div>
<div class="input-field"> <div class="input-field">
<i class="material-icons prefix">vpn_key</i> <i class="material-icons prefix">vpn_key</i>
{{ change_password_form.new_password() }} {{ edit_password_form.password() }}
{{ change_password_form.new_password.label }} {{ edit_password_form.password.label }}
{% for error in change_password_form.new_password.errors %} {% for error in edit_password_form.password.errors %}
<span class="helper-text red-text">{{ error }}</span> <span class="helper-text red-text">{{ error }}</span>
{% endfor %} {% endfor %}
</div> </div>
<div class="input-field"> <div class="input-field">
<i class="material-icons prefix">vpn_key</i> <i class="material-icons prefix">vpn_key</i>
{{ change_password_form.new_password2() }} {{ edit_password_form.password_confirmation() }}
{{ change_password_form.new_password2.label }} {{ edit_password_form.password_confirmation.label }}
{% for error in change_password_form.new_password2.errors %} {% for error in edit_password_form.password_confirmation.errors %}
<span class="helper-text red-text">{{ error }}</span> <span class="helper-text red-text">{{ error }}</span>
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
<div class="card-action right-align"> <div class="card-action right-align">
{{ change_password_form.submit(class='btn') }} {{ edit_password_form.save_password(class='btn') }}
</div> </div>
</form> </form>
</div> </div>
</div> </div>
<div class="col s12"></div> <div class="col s12"></div>
<div class="col s12 m4"> <div class="col s12 m4">
<h3>Change email</h3> <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>
<div class="col s12 m8"> <div class="col s12 m8">
<br class="hide-on-small-only">
<div class="card"> <div class="card">
<form action="{{ url_for('profile.profile_edit_user_info')}}" method="POST"> <form method="POST">
<div class="card-content"> <div class="card-content">
{{ edit_user_info_form.hidden_tag() }} {{ edit_email_form.hidden_tag() }}
<div class="input-field"> <div class="input-field">
<i class="material-icons prefix">mail</i> <i class="material-icons prefix">mail</i>
{{ edit_user_info_form.email() }} {{ edit_email_form.email() }}
{{ edit_user_info_form.email.label }} {{ edit_email_form.email.label }}
{% for error in edit_user_info_form.email.errors %} {% for error in edit_email_form.email.errors %}
<span class="helper-text red-text">{{ error }}</span> <span class="helper-text red-text">{{ error }}</span>
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
<div class="card-action right-align"> <div class="card-action right-align">
{{ edit_user_info_form.submit(class='btn') }} {{ edit_email_form.save_email(class='btn') }}
</div> </div>
</form> </form>
</div> </div>
</div> </div>
<div class="col s12"></div> <div class="col s12"></div>
<div class="col s12 m4"> <div class="col s12 m4">
<h3>Delete Account</h3> <h3>Delete account</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>
<div class="col s12 m8"> <div class="col s12 m8">
<br class="hide-on-small-only">
<div class="card"> <div class="card">
<div class="card-content"> <div class="card-content">
<!-- Confirm deletion of selected user with modal dialogue <p>Deleting an account has the following effects:</p>
Modal Trigger--> <ul>
</div> <li>All data associated with your corpora and jobs will be permanently deleted.</li>
<li>All settings will be permanently deleted.</li>
</ul>
</div>
<div class="card-action right-align"> <div class="card-action right-align">
<a href="#modal-confirm-delete" class="waves-effect waves-light btn red modal-trigger"><i class="material-icons left">delete</i>Delete User</a> <a href="#delete-account-modal" class="waves-effect waves-light btn red modal-trigger"><i class="material-icons left">delete</i>Delete</a>
</div> </div>
<!-- Modal Strucutre --> </div>
<div id="modal-confirm-delete" class="modal"> </div>
<div class="modal-content">
<h4>Confirm deletion</h4>
<p> <!-- Modals -->
Do you really want to delete your account and all associated data? <div class="modal" id="delete-account-modal">
All associated jobs and job files will be permanently deleted! <div class="modal-content">
</p> <h4>Confirm deletion</h4>
</div> <p>Do you really want to delete your account and all associated data? All associated jobs and job files will be permanently deleted!</p>
<div class="modal-footer"> </div>
<a href="{{url_for('profile.delete_self', user_id=current_user.id)}}" class="modal-close waves-effect waves-green btn red"><i class="material-icons left">delete</i>Delete User</a> <div class="modal-footer">
<a href="#!" class="modal-close waves-effect waves-green btn cancel">Cancel</a> <a href="#!" class="modal-close waves-effect waves-light btn">Cancel</a>
</div> <a href="{{ url_for('profile.delete') }}" class="btn red waves-effect waves-light"><i class="material-icons left">delete</i>Delete User</a>
</div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment