diff --git a/padelclub_backend/settings.py b/padelclub_backend/settings.py index c1cff4d..f5b9fb4 100644 --- a/padelclub_backend/settings.py +++ b/padelclub_backend/settings.py @@ -149,3 +149,8 @@ from .settings_app import * # settings.py LOGIN_REDIRECT_URL = '/' # Redirect to the homepage after login LOGOUT_REDIRECT_URL = '/' # Redirect to the homepage after logout + +AUTHENTICATION_BACKENDS = [ + 'tournaments.backends.EmailOrUsernameModelBackend', # replace 'yourapp' with your actual app name + 'django.contrib.auth.backends.ModelBackend', +] diff --git a/tournaments/backends.py b/tournaments/backends.py new file mode 100644 index 0000000..04f1346 --- /dev/null +++ b/tournaments/backends.py @@ -0,0 +1,38 @@ +# backends.py +from django.contrib.auth import get_user_model +from django.contrib.auth.backends import ModelBackend +from django.db.models import Q + +from django.contrib.auth import get_user_model +from django.contrib.auth.backends import ModelBackend +from django.db.models import Q +import logging + +logger = logging.getLogger(__name__) + +class EmailOrUsernameModelBackend(ModelBackend): + def authenticate(self, request, username=None, password=None, **kwargs): + UserModel = get_user_model() + + print(f"Backend attempting authentication for: {username}") # Debug print + logger.info(f"Backend attempting authentication for: {username}") + + try: + user = UserModel.objects.get( + Q(username__iexact=username) | Q(email__iexact=username) + ) + print(f"User found: {user}") # Debug print + logger.info(f"User found: {user}") + + if user.check_password(password): + print("Password check successful") # Debug print + logger.info("Password check successful") + return user + print("Password check failed") # Debug print + logger.warning("Password check failed") + return None + + except UserModel.DoesNotExist: + print("User not found") # Debug print + logger.warning("User not found") + return None diff --git a/tournaments/forms.py b/tournaments/forms.py index c13c0a2..c19bfd3 100644 --- a/tournaments/forms.py +++ b/tournaments/forms.py @@ -165,3 +165,44 @@ class CustomPasswordChangeForm(PasswordChangeForm): # Remove autofocus from all fields in the PasswordChangeForm for field in self.fields.values(): field.widget.attrs.pop("autofocus", None) + +from django.contrib.auth.forms import AuthenticationForm +from django.contrib.auth import authenticate # Add this import +from django import forms +import logging + +logger = logging.getLogger(__name__) + +class EmailOrUsernameAuthenticationForm(AuthenticationForm): + username = forms.CharField(label='Username or Email') + + def clean(self): + username = self.cleaned_data.get('username') + password = self.cleaned_data.get('password') + + print(f"Login attempt with username/email: {username}") # Debug print + logger.info(f"Login attempt with username/email: {username}") + + if username and password: + self.user_cache = authenticate( + self.request, + username=username, + password=password + ) + + print(f"Authentication result: {self.user_cache}") # Debug print + logger.info(f"Authentication result: {self.user_cache}") + + if self.user_cache is None: + print("Authentication failed") # Debug print + logger.warning("Authentication failed") + raise forms.ValidationError( + "Please enter a correct username/email and password.", + code='invalid_login' + ) + else: + print(f"Authentication successful for user: {self.user_cache}") # Debug print + logger.info(f"Authentication successful for user: {self.user_cache}") + self.confirm_login_allowed(self.user_cache) + + return self.cleaned_data diff --git a/tournaments/templates/register_tournament.html b/tournaments/templates/register_tournament.html index 81f1305..0528874 100644 --- a/tournaments/templates/register_tournament.html +++ b/tournaments/templates/register_tournament.html @@ -114,11 +114,11 @@
{{ error }}
+ {% endfor %} + {% endif %} + + {% for field in form %} + {% for error in field.errors %} +{{ error }}
+ {% endfor %} + {% endfor %} +