]> git.0d.be Git - panikdb.git/commitdiff
allow authenticating using email or username
authorFrédéric Péters <fpeters@0d.be>
Sun, 6 Dec 2020 17:49:30 +0000 (18:49 +0100)
committerFrédéric Péters <fpeters@0d.be>
Sun, 6 Dec 2020 17:49:30 +0000 (18:49 +0100)
panikdb/forms.py [new file with mode: 0644]
panikdb/urls.py

diff --git a/panikdb/forms.py b/panikdb/forms.py
new file mode 100644 (file)
index 0000000..fb89ecf
--- /dev/null
@@ -0,0 +1,31 @@
+from django import forms
+import django.contrib.auth.forms
+from django.contrib.auth import authenticate
+
+from panikdb.aa.models import User
+
+
+class AuthenticationForm(django.contrib.auth.forms.AuthenticationForm):
+    def clean(self):
+        username = self.cleaned_data.get('username')
+        password = self.cleaned_data.get('password')
+
+        if username and password:
+            user = None
+            if '@' in username:
+                user = User.objects.filter(email=username).first()
+                if user:
+                    self.user_cache = authenticate(username=user.username, password=password)
+            else:
+                self.user_cache = authenticate(username=username, password=password)
+            if self.user_cache is None:
+                # raise self.get_invalid_login_error()  # 2.2.x
+                raise forms.ValidationError(
+                    self.error_messages['invalid_login'],
+                    code='invalid_login',
+                    params={'username': self.username_field.verbose_name},
+                )
+            else:
+                self.confirm_login_allowed(self.user_cache)
+
+        return self.cleaned_data
index 5eb8bf8cbcf31dc03e54813bd53076af7d1469bc..d242b98640adc72b36a90b5fac19080a38e27ddf 100644 (file)
@@ -28,6 +28,7 @@ from wiki.urls import urlpatterns as wiki_urlpatterns
 from panikombo.urls import urlpatterns as panikombo_urlpatterns
 
 from .poll import views as poll_views
+from .forms import AuthenticationForm
 from . import views
 
 from combo.manager.urls import urlpatterns as combo_manager_urls
@@ -77,6 +78,9 @@ urlpatterns = [
         auth_views.password_reset,
         {'post_reset_redirect': 'auth_password_reset_done',
          'email_template_name': 'registration/password_reset_email.html'}),
+    url(r'^accounts/login/$',
+        auth_views.LoginView.as_view(authentication_form=AuthenticationForm),
+        name='login'),
     url(r'^accounts/', include('registration.backends.default.urls')),
 
     url(r'^vote/$', poll_views.vote, name='vote'),