diff --git a/api/serializers.py b/api/serializers.py index b6459cf..c7c5a49 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -3,12 +3,16 @@ from tournaments.models.court import Court from tournaments.models import Club, LiveMatch, TeamScore, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamRegistration, PlayerRegistration, Purchase, FailedApiCall, DateInterval, Log, DeviceToken, UnregisteredTeam, UnregisteredPlayer from django.contrib.auth import password_validation from django.utils.translation import gettext_lazy as _ +from django.db.utils import IntegrityError +from django.conf import settings + # email from django.template.loader import render_to_string from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode from django.utils.encoding import force_bytes from django.core.mail import EmailMessage from django.contrib.sites.shortcuts import get_current_site + from api.tokens import account_activation_token from shared.cryptography import encryption_util @@ -48,6 +52,9 @@ class UserSerializer(serializers.ModelSerializer): if 'country' in validated_data: country = validated_data['country'] + if CustomUser.objects.filter(username__iexact=validated_data['username'].lower()): + raise IntegrityError("Le nom d'utilisateur existe déjà") + user = CustomUser.objects.create_user( username=validated_data['username'], email=validated_data['email'], @@ -73,7 +80,8 @@ class UserSerializer(serializers.ModelSerializer): origin=UserOrigin.APP, ) - self.send_email(self.context['request'], user) + if not settings.DEBUG: + self.send_email(self.context['request'], user) # RegistrationProfile.objects.filter(user=user).send_activation_email() return user diff --git a/api/views.py b/api/views.py index 0f12567..b2f2d8f 100644 --- a/api/views.py +++ b/api/views.py @@ -59,7 +59,7 @@ class CustomAuthToken(APIView): user = CustomUser.objects.get(email=email) return user.username except ObjectDoesNotExist: - return None # or handle the case where the user doesn't exist + return None class Logout(APIView): permission_classes = (IsAuthenticated,) diff --git a/tournaments/forms.py b/tournaments/forms.py index aef159a..82373bc 100644 --- a/tournaments/forms.py +++ b/tournaments/forms.py @@ -58,6 +58,14 @@ class SimpleCustomUserCreationForm(UserCreationForm): 'password2': 'Confirmer le mot de passe', } + def clean_username(self): + username = self.cleaned_data.get('username') + if username: + username = username.lower() + if CustomUser.objects.filter(username__iexact=username).exists(): + raise forms.ValidationError("Le nom d'utilisateur existe déjà") + return username + class CustomUserChangeForm(UserChangeForm): diff --git a/tournaments/signals.py b/tournaments/signals.py index 735f1ec..ea47ab2 100644 --- a/tournaments/signals.py +++ b/tournaments/signals.py @@ -6,6 +6,7 @@ from django.conf import settings from tournaments.models.tournament import Tournament from tournaments.models.unregistered_player import UnregisteredPlayer from django.utils import timezone +from django.db.utils import IntegrityError from .models import Club, FailedApiCall, CustomUser, Log, TeamRegistration, PlayerRegistration, UnregisteredTeam, UnregisteredPlayer, TeamSortingType import requests @@ -15,6 +16,12 @@ from tournaments.models import PlayerDataSource from shared.discord import send_discord_log_message, send_discord_failed_calls_message from datetime import datetime +# @receiver(pre_save, sender=CustomUser) +# def username_check(instance, sender, **kwargs): +# """Ensure that username unique constraint is case insensitive""" +# if sender.objects.filter(username__iexact=instance.username.lower()): +# raise IntegrityError("Le nom d'utilisateur existe déjà") + def generate_unique_code(): characters = string.ascii_lowercase + string.digits while True: diff --git a/tournaments/views.py b/tournaments/views.py index 33fbc32..5eefc8c 100644 --- a/tournaments/views.py +++ b/tournaments/views.py @@ -1,17 +1,21 @@ # Standard library imports import os import csv + from django.shortcuts import render, get_object_or_404 -from django.http import HttpResponse +from django.http import JsonResponse, HttpResponse from django.utils.encoding import force_str from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode from django.urls import reverse +from django.conf import settings from django.views.decorators.csrf import csrf_exempt from django.contrib.admin.views.decorators import staff_member_required from django.core.files.storage import default_storage from django.core.files.base import ContentFile from django.views.generic import View +from django.db.models import Q +from django.template import loader from tournaments.models.device_token import DeviceToken @@ -20,10 +24,7 @@ from .models import TeamSummon from datetime import datetime, timedelta import time -from django.template import loader from datetime import date -from django.http import JsonResponse, HttpResponse -from django.db.models import Q import json import time import asyncio @@ -638,7 +639,8 @@ def signup(request): user.origin = UserOrigin.SITE user.save() - send_verification_email(request, user, next_url) + if not settings.DEBUG: + send_verification_email(request, user, next_url) return render(request, 'registration/signup_success.html', { 'next_url': next_url,