From eb7ea048c534f81f3b13ebbfcbdbb2fb8b39e7c3 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 23 Aug 2024 15:51:30 +0200 Subject: [PATCH] Adds ways for club to have umpires, and umpires can retrieve tournaments from that club --- api/views.py | 60 +++++++++++-------- .../0080_club_manager_club_umpires.py | 25 ++++++++ tournaments/models/club.py | 13 ++++ 3 files changed, 73 insertions(+), 25 deletions(-) create mode 100644 tournaments/migrations/0080_club_manager_club_umpires.py diff --git a/api/views.py b/api/views.py index ec5d64e..0793c4b 100644 --- a/api/views.py +++ b/api/views.py @@ -81,6 +81,20 @@ class UserViewSet(viewsets.ModelViewSet): return UserSerializer return self.serializer_class +class ChangePasswordView(UpdateAPIView): + serializer_class = ChangePasswordSerializer + + def update(self, request, *args, **kwargs): + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + user = serializer.save() + # if using drf authtoken, create a new token + if hasattr(user, 'auth_token'): + user.auth_token.delete() + token, created = Token.objects.get_or_create(user=user) + # return new token + return Response({'token': token.key}, status=status.HTTP_200_OK) + class ClubViewSet(viewsets.ModelViewSet): queryset = Club.objects.all() serializer_class = ClubSerializer @@ -89,14 +103,33 @@ class ClubViewSet(viewsets.ModelViewSet): def perform_create(self, serializer): serializer.save(creator=self.request.user) +class EventViewSet(viewsets.ModelViewSet): + queryset = Event.objects.all() + serializer_class = EventSerializer + + def get_queryset(self): + user = self.request.user + if user.is_anonymous: + return [] + events = set(self.queryset.filter(creator=user)) + for club in user.authorized_clubs.all(): + for event in club.event_set.all(): + events.add(event) + return events + class TournamentViewSet(viewsets.ModelViewSet): queryset = Tournament.objects.all() serializer_class = TournamentSerializer def get_queryset(self): - if self.request.user.is_anonymous: + user = self.request.user + if user.is_anonymous: return [] - return self.queryset.filter(event__creator=self.request.user) + tournaments = set(self.queryset.filter(event__creator=user)) + for club in user.authorized_clubs.all(): + for tournament in club.tournaments_set(): + tournaments.add(tournament) + return tournaments class PurchaseViewSet(viewsets.ModelViewSet): queryset = Purchase.objects.all() @@ -120,29 +153,6 @@ class PurchaseViewSet(viewsets.ModelViewSet): # queryset = Tournament.objects.all() # serializer_class = ExpandedTournamentSerializer -class ChangePasswordView(UpdateAPIView): - serializer_class = ChangePasswordSerializer - - def update(self, request, *args, **kwargs): - serializer = self.get_serializer(data=request.data) - serializer.is_valid(raise_exception=True) - user = serializer.save() - # if using drf authtoken, create a new token - if hasattr(user, 'auth_token'): - user.auth_token.delete() - token, created = Token.objects.get_or_create(user=user) - # return new token - return Response({'token': token.key}, status=status.HTTP_200_OK) - -class EventViewSet(viewsets.ModelViewSet): - queryset = Event.objects.all() - serializer_class = EventSerializer - - def get_queryset(self): - if self.request.user.is_anonymous: - return [] - return self.queryset.filter(creator=self.request.user) - class RoundViewSet(viewsets.ModelViewSet): queryset = Round.objects.all() serializer_class = RoundSerializer diff --git a/tournaments/migrations/0080_club_manager_club_umpires.py b/tournaments/migrations/0080_club_manager_club_umpires.py new file mode 100644 index 0000000..f0a5ab7 --- /dev/null +++ b/tournaments/migrations/0080_club_manager_club_umpires.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.11 on 2024-08-23 13:32 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('tournaments', '0079_alter_event_creator'), + ] + + operations = [ + migrations.AddField( + model_name='club', + name='manager', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='managers', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='club', + name='umpires', + field=models.ManyToManyField(blank=True, related_name='authorized_clubs', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/tournaments/models/club.py b/tournaments/models/club.py index 0fc4f0d..bd75419 100644 --- a/tournaments/models/club.py +++ b/tournaments/models/club.py @@ -4,6 +4,9 @@ import uuid class Club(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True) creator = models.ForeignKey('CustomUser', blank=True, null=True, on_delete=models.SET_NULL) # string to avoid circular import + manager = models.ForeignKey('CustomUser', blank=True, null=True, on_delete=models.SET_NULL, related_name="managers") + umpires = models.ManyToManyField('CustomUser', blank=True, related_name="authorized_clubs") + name = models.CharField(max_length=50) acronym = models.CharField(max_length=10) phone = models.CharField(max_length=15, null=True, blank=True) @@ -22,6 +25,16 @@ class Club(models.Model): def __str__(self): return self.name + # def events_set(self): + # return set(self.event_set.all()) + + def tournaments_set(self): + tournaments = set() + for event in self.event_set.all(): + for tournament in event.tournament_set.all(): + tournaments.add(tournament) + return tournaments + def events_count(self): return len(self.event_set.all())