Use enums where appropriate. This commit includes new migrations that are NOT compatible with older nopaque instances

This commit is contained in:
Patrick Jentsch
2022-02-08 12:26:20 +01:00
parent fe938c0ca2
commit df6ab3991c
110 changed files with 1389 additions and 2301 deletions

View File

@ -1,21 +1,37 @@
from app.auth import USERNAME_REGEX
from app.models import JobStatusMailNotificationLevel, User
from flask_wtf import FlaskForm
from wtforms import (BooleanField, PasswordField, SelectField, StringField,
SubmitField, ValidationError)
from wtforms import (
BooleanField,
PasswordField,
SelectField,
StringField,
SubmitField,
ValidationError
)
from wtforms.validators import DataRequired, Email, EqualTo, Length, Regexp
from ..auth import USERNAME_REGEX
from ..models import User
class ChangePasswordForm(FlaskForm):
password = PasswordField('Old password', validators=[DataRequired()])
new_password = PasswordField(
'New password',
validators=[DataRequired(), EqualTo('password_confirmation',
message='Passwords must match.')]
validators=[
DataRequired(),
EqualTo(
'new_password_confirmation',
message='Passwords must match'
)
]
)
new_password2 = PasswordField(
'Confirm new password', validators=[DataRequired()])
submit = SubmitField('Change password')
new_password_confirmation = PasswordField(
'Confirm new password',
validators=[
DataRequired(),
EqualTo('new_password', message='Passwords must match')
]
)
submit = SubmitField('Submit')
def __init__(self, user, *args, **kwargs):
super().__init__(*args, **kwargs)
@ -23,20 +39,24 @@ class ChangePasswordForm(FlaskForm):
def validate_current_password(self, field):
if not self.user.verify_password(field.data):
raise ValidationError('Invalid password.')
raise ValidationError('Invalid password')
class EditGeneralSettingsForm(FlaskForm):
dark_mode = BooleanField('Dark mode')
email = StringField('E-Mail',
validators=[DataRequired(), Length(1, 254), Email()])
email = StringField(
'E-Mail',
validators=[DataRequired(), Length(1, 254), Email()]
)
username = StringField(
'Benutzername',
validators=[DataRequired(),
Length(1, 64),
Regexp(USERNAME_REGEX,
message='Usernames must have only letters, numbers,'
' dots or underscores')]
'Username',
validators=[
DataRequired(),
Length(1, 64),
Regexp(
USERNAME_REGEX,
message='Usernames must have only letters, numbers, dots or underscores' # noqa
)
]
)
submit = SubmitField('Submit')
@ -45,29 +65,36 @@ class EditGeneralSettingsForm(FlaskForm):
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.')
if (
field.data != self.user.email
and User.query.filter_by(email=field.data).first()
):
raise ValidationError('Email already registered')
def validate_username(self, field):
if (field.data != self.user.username
and User.query.filter_by(username=field.data).first()):
raise ValidationError('Username already in use.')
if (
field.data != self.user.username
and User.query.filter_by(username=field.data).first()
):
raise ValidationError('Username already in use')
class EditInterfaceSettingsForm(FlaskForm):
dark_mode = BooleanField('Dark mode')
submit = SubmitField('Submit')
class EditNotificationSettingsForm(FlaskForm):
job_status_mail_notifications = SelectField(
'Job status mail notifications',
choices=[('', 'Choose your option'),
('all', 'Notify on all status changes'),
('end', 'Notify only when a job ended'),
('none', 'No status update notifications')],
validators=[DataRequired()])
job_status_site_notifications = SelectField(
'Job status site notifications',
choices=[('', 'Choose your option'),
('all', 'Notify on all status changes'),
('end', 'Notify only when a job ended'),
('none', 'No status update notifications')],
validators=[DataRequired()])
submit = SubmitField('Save settings')
job_status_mail_notification_level = SelectField(
'Job status mail notification level',
choices=[('', 'Choose your option')],
validators=[DataRequired()]
)
submit = SubmitField('Submit')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.job_status_mail_notification_level.choices += [
(enum_member.name, enum_member.name.capitalize())
for enum_member in JobStatusMailNotificationLevel
]

View File

@ -1,66 +1,82 @@
from flask import flash, redirect, render_template, url_for
from flask_login import current_user, login_required, logout_user
from . import bp, tasks
from .forms import (ChangePasswordForm, EditGeneralSettingsForm,
EditNotificationSettingsForm)
from .forms import (
ChangePasswordForm,
EditGeneralSettingsForm,
EditInterfaceSettingsForm,
EditNotificationSettingsForm
)
from .. import db
from ..models import JobStatusMailNotificationLevel
@bp.route('/')
@bp.route('', methods=['GET', 'POST'])
@login_required
def index():
return redirect(url_for('.edit_general_settings'))
change_password_form = ChangePasswordForm(
current_user._get_current_object(),
prefix='change_password_form'
)
edit_general_settings_form = EditGeneralSettingsForm(
current_user._get_current_object(),
prefix='edit_general_settings_form'
)
edit_interface_settings_form = EditInterfaceSettingsForm(
prefix='edit_interface_settings_form'
)
edit_notification_settings_form = EditNotificationSettingsForm(
prefix='edit_notification_settings_form'
)
@bp.route('/change_password', methods=['GET', 'POST'])
@login_required
def change_password():
form = ChangePasswordForm(current_user._get_current_object())
if form.validate_on_submit():
current_user.password = form.new_password.data
if change_password_form.submit.data and change_password_form.validate():
current_user.password = change_password_form.new_password.data
db.session.commit()
flash('Your password has been updated.')
return redirect(url_for('.change_password'))
return render_template('settings/change_password.html.j2',
form=form, title='Change password')
@bp.route('/edit_general_settings', methods=['GET', 'POST'])
@login_required
def edit_general_settings():
form = EditGeneralSettingsForm(current_user._get_current_object())
if form.validate_on_submit():
current_user.email = form.email.data
current_user.setting_dark_mode = form.dark_mode.data
current_user.username = form.username.data
flash('Your changes have been saved')
return redirect(url_for('.index'))
if (
edit_general_settings_form.submit.data
and edit_general_settings_form.validate()
):
current_user.email = edit_general_settings_form.email.data
current_user.username = edit_general_settings_form.username.data
db.session.commit()
flash('Your changes have been saved.')
return redirect(url_for('.edit_general_settings'))
form.dark_mode.data = current_user.setting_dark_mode
form.email.data = current_user.email
form.username.data = current_user.username
return render_template('settings/edit_general_settings.html.j2',
form=form, title='General settings')
@bp.route('/edit_notification_settings', methods=['GET', 'POST'])
@login_required
def edit_notification_settings():
form = EditNotificationSettingsForm()
if form.validate_on_submit():
current_user.setting_job_status_mail_notifications = \
form.job_status_mail_notifications.data
current_user.setting_job_status_site_notifications = \
form.job_status_site_notifications.data
flash('Your changes have been saved')
return redirect(url_for('.index'))
if (
edit_interface_settings_form.submit.data
and edit_interface_settings_form.validate()
):
current_user.setting_dark_mode = \
edit_interface_settings_form.dark_mode.data
db.session.commit()
flash('Your changes have been saved.')
return redirect(url_for('.edit_notification_settings'))
form.job_status_mail_notifications.data = \
current_user.setting_job_status_mail_notifications
form.job_status_site_notifications.data = \
current_user.setting_job_status_site_notifications
return render_template('settings/edit_notification_settings.html.j2',
form=form, title='Notification settings')
flash('Your changes have been saved')
return redirect(url_for('.index'))
if (
edit_notification_settings_form.submit.data
and edit_notification_settings_form.validate()
):
current_user.setting_job_status_mail_notification_level = \
JobStatusMailNotificationLevel[
edit_notification_settings_form.job_status_mail_notification_level.data # noqa
]
db.session.commit()
flash('Your changes have been saved')
return redirect(url_for('.index'))
edit_general_settings_form.email.data = current_user.email
edit_general_settings_form.username.data = current_user.username
edit_interface_settings_form.dark_mode.data = \
current_user.setting_dark_mode
edit_notification_settings_form.job_status_mail_notification_level.data = \
current_user.setting_job_status_mail_notification_level.name
return render_template(
'settings/index.html.j2',
change_password_form=change_password_form,
edit_general_settings_form=edit_general_settings_form,
edit_interface_settings_form=edit_interface_settings_form,
edit_notification_settings_form=edit_notification_settings_form,
title='Settings'
)
@bp.route('/delete')
@ -71,5 +87,5 @@ def delete():
"""
tasks.delete_user(current_user.id)
logout_user()
flash('Your account has been marked for deletion!')
flash('Your account has been marked for deletion')
return redirect(url_for('main.index'))

View File

@ -1,6 +1,6 @@
from .. import db
from ..decorators import background
from ..models import User
from app import db
from app.decorators import background
from app.models import User
@background