From 3e748ed428064fc94692c29fd424b575fe22b31f Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 28 Jan 2025 12:11:00 +0100 Subject: [PATCH 1/4] Adds origin to the user to indicate where the account comes from --- api/serializers.py | 2 ++ tournaments/admin.py | 2 +- .../migrations/0107_customuser_origin.py | 18 ++++++++++++++++++ tournaments/models/__init__.py | 2 +- tournaments/models/custom_user.py | 4 +++- tournaments/models/enums.py | 5 +++++ tournaments/views.py | 3 ++- 7 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 tournaments/migrations/0107_customuser_origin.py diff --git a/api/serializers.py b/api/serializers.py index 380a849..9588991 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -13,6 +13,7 @@ from api.tokens import account_activation_token from shared.cryptography import encryption_util from tournaments.models.draw_log import DrawLog +from tournaments.models.enums import UserOrigin class EncryptedUserField(serializers.Field): def to_representation(self, value): @@ -69,6 +70,7 @@ class UserSerializer(serializers.ModelSerializer): group_stage_match_format_preference=validated_data.get('group_stage_match_format_preference'), loser_bracket_match_format_preference=validated_data.get('loser_bracket_match_format_preference'), loser_bracket_mode=validated_data.get('loser_bracket_mode'), + origin=UserOrigin.APP, ) self.send_email(self.context['request'], user) diff --git a/tournaments/admin.py b/tournaments/admin.py index 2bfaf36..e06ad45 100644 --- a/tournaments/admin.py +++ b/tournaments/admin.py @@ -27,7 +27,7 @@ class CustomUserAdmin(UserAdmin): 'summons_message_body', 'summons_message_signature', 'summons_available_payment_methods', 'summons_display_format', 'summons_display_entry_fee', 'summons_use_full_custom_message', 'match_formats_default_duration', 'bracket_match_format_preference', 'group_stage_match_format_preference', - 'loser_bracket_match_format_preference', 'device_id', 'loser_bracket_mode', 'groups' + 'loser_bracket_match_format_preference', 'device_id', 'loser_bracket_mode', 'groups', 'origin' ]}), ] add_fieldsets = [ diff --git a/tournaments/migrations/0107_customuser_origin.py b/tournaments/migrations/0107_customuser_origin.py new file mode 100644 index 0000000..2e88038 --- /dev/null +++ b/tournaments/migrations/0107_customuser_origin.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1 on 2025-01-28 07:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tournaments', '0106_alter_customuser_licence_id'), + ] + + operations = [ + migrations.AddField( + model_name='customuser', + name='origin', + field=models.IntegerField(blank=True, choices=[(0, 'Admin'), (1, 'Site'), (2, 'App')], default=0, null=True), + ), + ] diff --git a/tournaments/models/__init__.py b/tournaments/models/__init__.py index 3920dde..f076f05 100644 --- a/tournaments/models/__init__.py +++ b/tournaments/models/__init__.py @@ -2,7 +2,7 @@ from .custom_user import CustomUser from .club import Club from .court import Court from .date_interval import DateInterval -from .enums import TournamentPayment, FederalCategory, FederalLevelCategory, FederalAgeCategory, FederalMatchCategory, OnlineRegistrationStatus +from .enums import UserOrigin, TournamentPayment, FederalCategory, FederalLevelCategory, FederalAgeCategory, FederalMatchCategory, OnlineRegistrationStatus from .player_enums import PlayerSexType, PlayerDataSource, PlayerPaymentType from .event import Event from .tournament import Tournament, TeamSummon, TeamSortingType, TeamItem diff --git a/tournaments/models/custom_user.py b/tournaments/models/custom_user.py index e49d474..befa50d 100644 --- a/tournaments/models/custom_user.py +++ b/tournaments/models/custom_user.py @@ -32,6 +32,8 @@ class CustomUser(AbstractUser): device_id = models.CharField(max_length=50, null=True, blank=True) loser_bracket_mode = models.IntegerField(default=0) + origin = models.IntegerField(default=enums.UserOrigin.ADMIN, choices=enums.UserOrigin.choices, null=True, blank=True) + ### ### ### ### ### ### ### ### ### ### ### WARNING ### ### ### ### ### ### ### ### ### ### ### WARNING : Any added field MUST be inserted in the method below: fields_for_update() ### ### ### ### ### ### ### ### ### ### ### ### WARNING ### ### ### ### ### ### ### ### ### ### @@ -43,7 +45,7 @@ class CustomUser(AbstractUser): 'summons_message_body', 'summons_message_signature', 'summons_available_payment_methods', 'summons_display_format', 'summons_display_entry_fee', 'summons_use_full_custom_message', 'match_formats_default_duration', 'bracket_match_format_preference', - 'group_stage_match_format_preference', 'loser_bracket_match_format_preference', 'device_id', 'loser_bracket_mode'] + 'group_stage_match_format_preference', 'loser_bracket_match_format_preference', 'device_id', 'loser_bracket_mode', 'origin'] def __str__(self): return self.username diff --git a/tournaments/models/enums.py b/tournaments/models/enums.py index 0ee32ce..3269327 100644 --- a/tournaments/models/enums.py +++ b/tournaments/models/enums.py @@ -1,6 +1,11 @@ from django.db import models import uuid +class UserOrigin(models.IntegerChoices): + ADMIN = 0, 'Admin' + SITE = 1, 'Site' + APP = 2, 'App' + class TournamentPayment(models.IntegerChoices): FREE = 0, 'Gratuit' UNIT = 1, 'Unité' diff --git a/tournaments/views.py b/tournaments/views.py index 2d84130..7ed4012 100644 --- a/tournaments/views.py +++ b/tournaments/views.py @@ -14,7 +14,7 @@ from django.core.files.base import ContentFile from tournaments.models.device_token import DeviceToken -from .models import Court, DateInterval, Club, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamScore, TeamRegistration, PlayerRegistration, Purchase, FailedApiCall +from .models import Court, DateInterval, Club, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamScore, TeamRegistration, PlayerRegistration, Purchase, FailedApiCall, UserOrigin from .models import TeamSummon from datetime import datetime, timedelta import time @@ -627,6 +627,7 @@ def signup(request): if form.is_valid(): user = form.save(commit=False) user.is_active = False + user.origin = UserOrigin.SITE user.save() send_verification_email(request, user, next_url) From fe7a50ecf7cf1f62751ab1f4c69a2099f50b5841 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 28 Jan 2025 12:22:36 +0100 Subject: [PATCH 2/4] Adds origin to the users list --- tournaments/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tournaments/admin.py b/tournaments/admin.py index e06ad45..af0dd2d 100644 --- a/tournaments/admin.py +++ b/tournaments/admin.py @@ -19,7 +19,7 @@ class CustomUserAdmin(UserAdmin): form = CustomUserChangeForm add_form = CustomUserCreationForm model = CustomUser - list_display = ['email', 'username', 'is_active', 'is_staff', 'first_name', 'last_name', 'date_joined', 'event_count', 'latest_event_club_name'] + list_display = ['email', 'username', 'is_active', 'is_staff', 'first_name', 'last_name', 'date_joined', 'event_count', 'latest_event_club_name', 'origin'] ordering = ['-date_joined'] fieldsets = [ (None, {'fields': ['id', 'username', 'email', 'password', 'first_name', 'last_name', 'is_active', From 51aba89847924e087c2e0c08a4e4f330a5e55405 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 28 Jan 2025 12:31:49 +0100 Subject: [PATCH 3/4] adds origin as a filter in the admin --- tournaments/admin.py | 1 + tournaments/models/enums.py | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/tournaments/admin.py b/tournaments/admin.py index af0dd2d..95e4167 100644 --- a/tournaments/admin.py +++ b/tournaments/admin.py @@ -20,6 +20,7 @@ class CustomUserAdmin(UserAdmin): add_form = CustomUserCreationForm model = CustomUser list_display = ['email', 'username', 'is_active', 'is_staff', 'first_name', 'last_name', 'date_joined', 'event_count', 'latest_event_club_name', 'origin'] + list_filter = ['is_active', 'origin'] ordering = ['-date_joined'] fieldsets = [ (None, {'fields': ['id', 'username', 'email', 'password', 'first_name', 'last_name', 'is_active', diff --git a/tournaments/models/enums.py b/tournaments/models/enums.py index 3269327..666aca2 100644 --- a/tournaments/models/enums.py +++ b/tournaments/models/enums.py @@ -1,11 +1,6 @@ from django.db import models import uuid -class UserOrigin(models.IntegerChoices): - ADMIN = 0, 'Admin' - SITE = 1, 'Site' - APP = 2, 'App' - class TournamentPayment(models.IntegerChoices): FREE = 0, 'Gratuit' UNIT = 1, 'Unité' @@ -136,3 +131,8 @@ class OnlineRegistrationStatus(models.IntegerChoices): OnlineRegistrationStatus.ENDED_WITH_RESULTS: "Tournoi terminé" } return status_map.get(self, "") + +class UserOrigin(models.IntegerChoices): + ADMIN = 0, 'Admin' + SITE = 1, 'Site' + APP = 2, 'App' From 194e13d5d834a4d75f44a752f9bff169448b8345 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 28 Jan 2025 15:03:06 +0100 Subject: [PATCH 4/4] Adds id as field to search --- tournaments/admin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tournaments/admin.py b/tournaments/admin.py index 95e4167..9933d31 100644 --- a/tournaments/admin.py +++ b/tournaments/admin.py @@ -50,14 +50,17 @@ class TournamentAdmin(admin.ModelAdmin): list_display = ['display_name', 'event', 'is_private', 'start_date', 'payment', 'creator'] list_filter = ['is_deleted', 'event__creator'] ordering = ['-start_date'] + search_fields = ['id'] class TeamRegistrationAdmin(admin.ModelAdmin): list_display = ['player_names', 'group_stage_position', 'name', 'tournament'] list_filter = [SimpleTournamentListFilter] + search_fields = ['id'] class TeamScoreAdmin(admin.ModelAdmin): list_display = ['team_registration', 'score', 'walk_out', 'match'] list_filter = [TeamScoreTournamentListFilter] + search_fields = ['id'] class RoundAdmin(admin.ModelAdmin): list_display = ['tournament', 'name', 'index', 'parent']