diff --git a/app/auth/forms.py b/app/auth/forms.py index 23a1db39a36e66f25d5e38e8ad199eb27faf9c92..3c92c7ed613b221f6fc228bfa0279b9e3a822f9d 100644 --- a/app/auth/forms.py +++ b/app/auth/forms.py @@ -1,6 +1,6 @@ from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, SubmitField -from wtforms.validators import DataRequired, Length, Email, Regexp, EqualTo +from wtforms.validators import DataRequired, Length, Email, Regexp, EqualTo, Optional from wtforms import ValidationError from ..models import User @@ -48,6 +48,22 @@ class PasswordResetRequestForm(FlaskForm): class ChangeProfileForm(FlaskForm): - email = StringField('Email', validators=[DataRequired(), Length(1, 64), + email = StringField('Email', validators=[Optional(), Length(1, 64), Email()]) + username = StringField('Username', validators=[ + Optional(), Length(1, 64), + Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0, + 'Usernames must have only letters, numbers, dots or ' + 'underscores')]) + password = PasswordField('Password', validators=[ + Optional(), EqualTo('password2', message='Passwords must match.')]) + password2 = PasswordField('Confirm password', validators=[Optional()]) submit = SubmitField('Submit') + + def validate_email(self, field): + if User.query.filter_by(email=field.data.lower()).first(): + raise ValidationError('Email already registered.') + + def validate_username(self, field): + if User.query.filter_by(username=field.data).first(): + raise ValidationError('Username already in use.') diff --git a/app/auth/views.py b/app/auth/views.py index 65ef647f3f8da73b477828659c1e7a79e6196220..09045826654cc972adc88990affc97e5cf3f09f6 100644 --- a/app/auth/views.py +++ b/app/auth/views.py @@ -87,7 +87,7 @@ def resend_confirmation(): send_email(current_user.email, 'Confirm Your Account', 'auth/email/confirm', user=current_user, token=token) flash('A new confirmation email has benn sent to you by email.') - return redirect(url_for('maind.index')) + return redirect(url_for('main.index')) @auth.route('/reset', methods=['GET', 'POST']) @@ -130,7 +130,15 @@ def password_reset(token): def profile(): form = ChangeProfileForm() if form.validate_on_submit(): - flash('It\'s just a test, nothing changed.') + flash('It is just a test, nothing changed.') + if form.username.data: + current_user.username = form.username.data + db.session.add(current_user) + if form.email.data: + current_user.email = form.email.data + current_user.confirmed = False + db.session.add(current_user) + db.session.commit() return redirect(url_for('auth.profile')) return render_template('auth/profile.html.j2', form=form, title='Profile') diff --git a/app/templates/auth/profile.html.j2 b/app/templates/auth/profile.html.j2 index 379429493518ab21380c0dafbedccc020e5a43de..5d81a6c3642d179bb50b7c061ba224b3d36bd853 100644 --- a/app/templates/auth/profile.html.j2 +++ b/app/templates/auth/profile.html.j2 @@ -4,17 +4,41 @@ <div class="col s12"> <div class="card large"> <div class="card-content"> - <span class="card-title">Register</span> + <span class="card-title">Change profile</span> <form method="POST"> {{ form.hidden_tag() }} <div class="input-field "> <i class="material-icons prefix">email</i> - {{ form.email(class='validate', type='email') }} + {{ form.email(type='email', placeholder=current_user.email) }} {{ form.email.label }} {% for error in form.email.errors %} <span class="helper-text" style="color:red;">{{ error }}</span> {% endfor %} </div> + <div class="input-field "> + <i class="material-icons prefix">person</i> + {{ form.username(placeholder=current_user.username) }} + {{ form.username.label }} + {% for error in form.username.errors %} + <span class="helper-text" style="color:red;">{{ error }}</span> + {% endfor %} + </div> + <div class="input-field"> + <i class="material-icons prefix">vpn_key</i> + {{ form.password() }} + {{ form.password.label }} + {% for error in form.password.errors %} + <span class="helper-text" style="color:red;">{{ error }}</span> + {% endfor %} + </div> + <div class="input-field"> + <i class="material-icons prefix">vpn_key</i> + {{ form.password2() }} + {{ form.password2.label }} + {% for error in form.password2.errors %} + <span class="helper-text" style="color:red;">{{ error }}</span> + {% endfor %} + </div> <div class="card-action"> {{ form.submit(class='btn right') }} </div> diff --git a/data_dev.sqlite b/data_dev.sqlite index 42cd48d7f9b9b7a64ecfbde1a9e833fa7ab62ec0..5462b370e2e8468195b654f744b5dc8c9058fa37 100644 Binary files a/data_dev.sqlite and b/data_dev.sqlite differ