From b311fcb9de5b5b81ab4fa6e26ed2acd36574c84e Mon Sep 17 00:00:00 2001
From: Patrick Jentsch <p.jentsch@uni-bielefeld.de>
Date: Tue, 9 Jul 2019 11:00:41 +0200
Subject: [PATCH] Enable login by username.

---
 app/auth/forms.py                  |  9 +++++++--
 app/auth/views.py                  | 19 ++++++++++++++++---
 app/templates/auth/login.html.j2   |  6 +++---
 app/templates/auth/profile.html.j2 | 25 +++++++++++++++++++++++++
 4 files changed, 51 insertions(+), 8 deletions(-)
 create mode 100644 app/templates/auth/profile.html.j2

diff --git a/app/auth/forms.py b/app/auth/forms.py
index d23e4e2d..23a1db39 100644
--- a/app/auth/forms.py
+++ b/app/auth/forms.py
@@ -6,8 +6,7 @@ from ..models import User
 
 
 class LoginForm(FlaskForm):
-    email = StringField('Email', validators=[DataRequired(), Length(1, 64),
-                                             Email()])
+    login = StringField('Login', validators=[DataRequired(), Length(1, 64)])
     password = PasswordField('Password', validators=[DataRequired()])
     remember_me = BooleanField('Keep me logged in')
     submit = SubmitField('Log In')
@@ -46,3 +45,9 @@ class PasswordResetRequestForm(FlaskForm):
     email = StringField('Email', validators=[DataRequired(), Length(1, 64),
                                              Email()])
     submit = SubmitField('Reset Password')
+
+
+class ChangeProfileForm(FlaskForm):
+    email = StringField('Email', validators=[DataRequired(), Length(1, 64),
+                                             Email()])
+    submit = SubmitField('Submit')
diff --git a/app/auth/views.py b/app/auth/views.py
index 95dd2fd8..65ef647f 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 LoginForm, PasswordResetForm, PasswordResetRequestForm, RegistrationForm
+from .forms import ChangeProfileForm, LoginForm, PasswordResetForm, PasswordResetRequestForm, RegistrationForm
 from ..email import send_email
 from ..models import User
 
@@ -11,7 +11,9 @@ from ..models import User
 def login():
     form = LoginForm()
     if form.validate_on_submit():
-        user = User.query.filter_by(email=form.email.data).first()
+        user = User.query.filter_by(email=form.login.data).first()
+        if user is None:
+            user = User.query.filter_by(username=form.login.data).first()
         if user is not None and user.verify_password(form.password.data):
             login_user(user, form.remember_me.data)
             next = request.args.get('next')
@@ -85,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('main.index'))
+    return redirect(url_for('maind.index'))
 
 
 @auth.route('/reset', methods=['GET', 'POST'])
@@ -121,3 +123,14 @@ def password_reset(token):
             return redirect(url_for('main.index'))
     return render_template('auth/reset_password.html.j2', form=form,
                            title='Password Reset')
+
+
+@auth.route('/profile', methods=['GET', 'POST'])
+@login_required
+def profile():
+    form = ChangeProfileForm()
+    if form.validate_on_submit():
+        flash('It\'s just a test, nothing changed.')
+        return redirect(url_for('auth.profile'))
+    return render_template('auth/profile.html.j2', form=form,
+                           title='Profile')
diff --git a/app/templates/auth/login.html.j2 b/app/templates/auth/login.html.j2
index 02ffb68a..68710ccd 100644
--- a/app/templates/auth/login.html.j2
+++ b/app/templates/auth/login.html.j2
@@ -24,9 +24,9 @@
       <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.label }}
+          <i class="material-icons prefix">person</i>
+          {{ form.login(class='validate') }}
+          {{ form.login.label }}
         </div>
         <div class="input-field">
           <i class="material-icons prefix">vpn_key</i>
diff --git a/app/templates/auth/profile.html.j2 b/app/templates/auth/profile.html.j2
new file mode 100644
index 00000000..37942949
--- /dev/null
+++ b/app/templates/auth/profile.html.j2
@@ -0,0 +1,25 @@
+{% extends "base.html.j2" %}
+
+{% block page_content %}
+<div class="col s12">
+  <div class="card large">
+    <div class="card-content">
+      <span class="card-title">Register</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.label }}
+          {% for error in form.email.errors %}
+            <span class="helper-text" style="color:red;">{{ error }}</span>
+          {% endfor %}
+        </div>
+        <div class="card-action">
+          {{ form.submit(class='btn right') }}
+        </div>
+      </form>
+    </div>
+  </div>
+</div>
+{% endblock %}
-- 
GitLab