From fc1fe83c553aacb06fa6ca0e35ea0ac76c7df877 Mon Sep 17 00:00:00 2001 From: kovacspe Date: Fri, 8 Dec 2023 21:10:48 +0100 Subject: [PATCH 01/12] Add slug to permission tests --- competition/tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/competition/tests.py b/competition/tests.py index 023281ff..b5981315 100644 --- a/competition/tests.py +++ b/competition/tests.py @@ -331,12 +331,12 @@ def test_permission_list(self): def test_permission_get(self): '''retrieve permission OK''' - self.check_permissions(self.URL_PREFIX + '/strom/', + self.check_permissions(self.URL_PREFIX + '/slug/strom/', 'GET', self.PUBLIC_OK_RESPONSES) def test_permission_update(self): ''' update permission OK''' - self.check_permissions(self.URL_PREFIX + '/strom/', 'PUT', + self.check_permissions(self.URL_PREFIX + '/slug/strom/', 'PUT', self.ALL_FORBIDDEN, {'start_year': 2020}) def test_permission_create(self): From ef089d4e22ae4bcede7130b0ffb65c135ea23d9e Mon Sep 17 00:00:00 2001 From: kovacspe Date: Fri, 8 Dec 2023 21:55:33 +0100 Subject: [PATCH 02/12] typo --- competition/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/competition/models.py b/competition/models.py index f3bbab87..51615fb4 100644 --- a/competition/models.py +++ b/competition/models.py @@ -150,7 +150,7 @@ class Meta: start = models.DateTimeField(verbose_name='dátum začiatku súťaže') end = models.DateTimeField(verbose_name='dátum konca súťaže') additional_name = models.CharField( - max_length=50, verbose_name='Prísvlastok súťaže', null=True, blank=True) + max_length=50, verbose_name='Prívlastok súťaže', null=True, blank=True) objects = ActiveQuerySet.as_manager() From 70d61e7e90d3a9841ab9bf5e87568f659a9d3234 Mon Sep 17 00:00:00 2001 From: kovacspe Date: Fri, 8 Dec 2023 22:12:05 +0100 Subject: [PATCH 03/12] =?UTF-8?q?Django=20admin=20by=20uz=20nemal=20uklada?= =?UTF-8?q?=C5=A5=20pr=C3=A1zdny=20string=20miesto=20NULL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- competition/models.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/competition/models.py b/competition/models.py index 51615fb4..e4984d43 100644 --- a/competition/models.py +++ b/competition/models.py @@ -204,6 +204,11 @@ class Meta: blank=True, default=None) + def save(self, *args, **kwargs) -> None: + if not self.frozen_results: + self.frozen_results = None + return super().save(*args, **kwargs) + def get_first_series(self): return self.series_set.get(order=1) @@ -251,6 +256,11 @@ class Meta: blank=True, default=None) + def save(self, *args, **kwargs) -> None: + if not self.frozen_results: + self.frozen_results = None + return super().save(*args, **kwargs) + def __str__(self): return f'{self.semester} - {self.order}. séria' @@ -415,6 +425,11 @@ class Meta: hidden_response = models.TextField( null=True, blank=True, verbose_name='Skrytá odpoveď na komentár') + def save(self, *args, **kwargs) -> None: + if not self.hidden_response: + self.hidden_response = None + return super().save(*args, **kwargs) + def publish(self): self.state = CommentPublishState.PUBLISHED self.hidden_response = None From d4bbd24f5c50ee905c7b85c5b75ff7503b005b48 Mon Sep 17 00:00:00 2001 From: kovacspe Date: Sun, 12 Nov 2023 14:37:42 +0100 Subject: [PATCH 04/12] Allow edit on competition --- competition/views.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/competition/views.py b/competition/views.py index c45d0d9f..941ec21a 100644 --- a/competition/views.py +++ b/competition/views.py @@ -100,13 +100,17 @@ def generate_result_row( } -class CompetitionViewSet(viewsets.ReadOnlyModelViewSet): +class CompetitionViewSet(viewsets.ModelViewSet): """Naše aktivity""" queryset = Competition.objects.all() serializer_class = CompetitionSerializer lookup_field = 'slug' permission_classes = (CompetitionRestrictedPermission,) + def destroy(self, request, *args, **kwargs): + raise exceptions.PermissionDenied( + 'Zmazanie súťaže je povolené iba v django admin') + class CommentViewSet( mixins.RetrieveModelMixin, From cb2524526ce6b3b7f96f41b82d7c487825faf68b Mon Sep 17 00:00:00 2001 From: kovacspe Date: Sun, 12 Nov 2023 14:54:38 +0100 Subject: [PATCH 05/12] Disable delete for Competition --- competition/views.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/competition/views.py b/competition/views.py index 941ec21a..3c3f1a98 100644 --- a/competition/views.py +++ b/competition/views.py @@ -100,17 +100,17 @@ def generate_result_row( } -class CompetitionViewSet(viewsets.ModelViewSet): +class CompetitionViewSet(mixins.CreateModelMixin, + mixins.RetrieveModelMixin, + mixins.UpdateModelMixin, + mixins.ListModelMixin, + viewsets.GenericViewSet): """Naše aktivity""" queryset = Competition.objects.all() serializer_class = CompetitionSerializer lookup_field = 'slug' permission_classes = (CompetitionRestrictedPermission,) - def destroy(self, request, *args, **kwargs): - raise exceptions.PermissionDenied( - 'Zmazanie súťaže je povolené iba v django admin') - class CommentViewSet( mixins.RetrieveModelMixin, From cfd4d46c1c8e6daefa8b33374794287ecd04d36d Mon Sep 17 00:00:00 2001 From: kovacspe Date: Sun, 12 Nov 2023 15:04:15 +0100 Subject: [PATCH 06/12] Allow edit for schools --- personal/views.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/personal/views.py b/personal/views.py index cf030313..61dc107c 100644 --- a/personal/views.py +++ b/personal/views.py @@ -1,5 +1,5 @@ from django_filters.rest_framework import DjangoFilterBackend -from rest_framework import status, viewsets +from rest_framework import exceptions, status, viewsets from rest_framework.decorators import action from rest_framework.filters import SearchFilter from rest_framework.permissions import IsAdminUser, IsAuthenticated @@ -26,7 +26,7 @@ class DistrictViewSet(viewsets.ReadOnlyModelViewSet): filterset_fields = ['county', ] -class SchoolViewSet(viewsets.ReadOnlyModelViewSet): +class SchoolViewSet(viewsets.ModelViewSet): """Školy""" queryset = School.objects.all() serializer_class = SchoolSerializer @@ -34,6 +34,15 @@ class SchoolViewSet(viewsets.ReadOnlyModelViewSet): filter_backends = [DjangoFilterBackend, SearchFilter] search_fields = ['name', 'street'] + def destroy(self, request, *args, **kwargs): + """Zmazanie školy""" + instance = self.get_object() + if Profile.objects.filter(school=instance).exists(): + raise exceptions.ValidationError( + detail='Nie je možné zmazať školu, ktorá má priradených užívateľov.') + self.perform_destroy(instance) + return Response(status=status.HTTP_204_NO_CONTENT) + class ProfileViewSet(viewsets.ModelViewSet): """Užívateľské profily""" From 56c5869688470eefa9cd60c50a22da1f0b00d0e0 Mon Sep 17 00:00:00 2001 From: kovacspe Date: Mon, 13 Nov 2023 21:41:01 +0100 Subject: [PATCH 07/12] Remove competition create --- competition/views.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/competition/views.py b/competition/views.py index 3c3f1a98..b2fffe1d 100644 --- a/competition/views.py +++ b/competition/views.py @@ -100,8 +100,7 @@ def generate_result_row( } -class CompetitionViewSet(mixins.CreateModelMixin, - mixins.RetrieveModelMixin, +class CompetitionViewSet(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): From 67ddad303ec4c66471394e75e60ee319ff541f64 Mon Sep 17 00:00:00 2001 From: kovacspe Date: Mon, 13 Nov 2023 22:29:20 +0100 Subject: [PATCH 08/12] Fix tests --- competition/serializers.py | 2 +- competition/tests.py | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/competition/serializers.py b/competition/serializers.py index 70151eb7..9f37b0bc 100644 --- a/competition/serializers.py +++ b/competition/serializers.py @@ -60,7 +60,7 @@ class Meta: @ts_interface(context='competition') class CompetitionSerializer(serializers.ModelSerializer): - competition_type = CompetitionTypeSerializer(many=False) + competition_type = CompetitionTypeSerializer(many=False, read_only=True) upcoming_or_current_event = serializers.SerializerMethodField( 'get_upcoming_or_current') history_events = serializers.SerializerMethodField('get_history_events') diff --git a/competition/tests.py b/competition/tests.py index b5981315..14c4cdc5 100644 --- a/competition/tests.py +++ b/competition/tests.py @@ -336,8 +336,20 @@ def test_permission_get(self): def test_permission_update(self): ''' update permission OK''' - self.check_permissions(self.URL_PREFIX + '/slug/strom/', 'PUT', - self.ALL_FORBIDDEN, {'start_year': 2020}) + self.check_permissions(self.URL_PREFIX + '/strom/', 'PUT', + self.ONLY_STROM_OK_RESPONSES, + { + "id": 0, + "name": "STROM", + "slug": "strom", + "start_year": 1976, + "description": "popis", + "rules": "# Pravidlá", + "min_years_until_graduation": 0, + "sites": [ + 0 + ] + }) def test_permission_create(self): ''' create permission OK''' From e635687ccb16de5ef3f74788f1efa0ab27aff6b5 Mon Sep 17 00:00:00 2001 From: kovacspe Date: Fri, 8 Dec 2023 14:18:29 +0100 Subject: [PATCH 09/12] Change lookup field to id and add get_one by slug --- competition/views.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/competition/views.py b/competition/views.py index b2fffe1d..fd88360f 100644 --- a/competition/views.py +++ b/competition/views.py @@ -12,6 +12,7 @@ from rest_framework.decorators import action from rest_framework.exceptions import ValidationError from rest_framework.permissions import IsAdminUser, IsAuthenticated +from rest_framework.request import Request from rest_framework.response import Response from base.utils import mime_type @@ -107,9 +108,15 @@ class CompetitionViewSet(mixins.RetrieveModelMixin, """Naše aktivity""" queryset = Competition.objects.all() serializer_class = CompetitionSerializer - lookup_field = 'slug' permission_classes = (CompetitionRestrictedPermission,) + @action(detail=False, url_path=r'slug/(?P\w+)') + def slug(self, request: Request, slug: str = None) -> Response: + competition: Competition = self.get_queryset().get(slug=slug) + return Response( + CompetitionSerializer(competition, many=False).data + ) + class CommentViewSet( mixins.RetrieveModelMixin, From 3eec8ef893f808c0213b2916894f4eef53773f3d Mon Sep 17 00:00:00 2001 From: kovacspe Date: Fri, 8 Dec 2023 21:06:18 +0100 Subject: [PATCH 10/12] Fix test url --- competition/tests.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/competition/tests.py b/competition/tests.py index 14c4cdc5..ef172ec7 100644 --- a/competition/tests.py +++ b/competition/tests.py @@ -316,11 +316,11 @@ def test_get_competition_list(self): def test_get_competition_detail(self): '''detail format OK''' - response = self.client.get(self.URL_PREFIX + '/strom', {}, 'json') + response = self.client.get(self.URL_PREFIX + '/slug/strom', {}, 'json') self.assertEqual(response.status_code, 200) self.competition_assert_format(response.json(), 0) - response = self.client.get(self.URL_PREFIX + '/matik', {}, 'json') + response = self.client.get(self.URL_PREFIX + '/slug/matik', {}, 'json') self.assertEqual(response.status_code, 200) self.competition_assert_format(response.json(), 1) @@ -336,7 +336,7 @@ def test_permission_get(self): def test_permission_update(self): ''' update permission OK''' - self.check_permissions(self.URL_PREFIX + '/strom/', 'PUT', + self.check_permissions(self.URL_PREFIX + '/slug/strom/', 'PUT', self.ONLY_STROM_OK_RESPONSES, { "id": 0, From 752144407a196b991c198ea237d24ff17f6de52d Mon Sep 17 00:00:00 2001 From: kovacspe Date: Fri, 8 Dec 2023 21:18:00 +0100 Subject: [PATCH 11/12] Patch on /{id} endpoint instead of /slug/{slug} --- competition/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/competition/tests.py b/competition/tests.py index ef172ec7..4df28c50 100644 --- a/competition/tests.py +++ b/competition/tests.py @@ -336,7 +336,7 @@ def test_permission_get(self): def test_permission_update(self): ''' update permission OK''' - self.check_permissions(self.URL_PREFIX + '/slug/strom/', 'PUT', + self.check_permissions(self.URL_PREFIX + '/0/', 'PUT', self.ONLY_STROM_OK_RESPONSES, { "id": 0, From e09b32d9ba466d0ab3bd446ad36b39c024982cab Mon Sep 17 00:00:00 2001 From: kovacspe Date: Fri, 8 Dec 2023 21:48:15 +0100 Subject: [PATCH 12/12] empty commit