Skip to content

Commit ef6ac62

Browse files
authored
Merge pull request #273 from ZdruzenieSTROM/add_endpoint_for_react_admin
Add endpoint for react admin
2 parents 873a7c5 + 1a7912b commit ef6ac62

File tree

4 files changed

+41
-10
lines changed

4 files changed

+41
-10
lines changed

competition/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class Meta:
6060

6161
@ts_interface(context='competition')
6262
class CompetitionSerializer(serializers.ModelSerializer):
63-
competition_type = CompetitionTypeSerializer(many=False)
63+
competition_type = CompetitionTypeSerializer(many=False, read_only=True)
6464
upcoming_or_current_event = serializers.SerializerMethodField(
6565
'get_upcoming_or_current')
6666
history_events = serializers.SerializerMethodField('get_history_events')

competition/tests.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -316,11 +316,11 @@ def test_get_competition_list(self):
316316

317317
def test_get_competition_detail(self):
318318
'''detail format OK'''
319-
response = self.client.get(self.URL_PREFIX + '/strom', {}, 'json')
319+
response = self.client.get(self.URL_PREFIX + '/slug/strom', {}, 'json')
320320
self.assertEqual(response.status_code, 200)
321321
self.competition_assert_format(response.json(), 0)
322322

323-
response = self.client.get(self.URL_PREFIX + '/matik', {}, 'json')
323+
response = self.client.get(self.URL_PREFIX + '/slug/matik', {}, 'json')
324324
self.assertEqual(response.status_code, 200)
325325
self.competition_assert_format(response.json(), 1)
326326

@@ -331,13 +331,25 @@ def test_permission_list(self):
331331

332332
def test_permission_get(self):
333333
'''retrieve permission OK'''
334-
self.check_permissions(self.URL_PREFIX + '/strom/',
334+
self.check_permissions(self.URL_PREFIX + '/slug/strom/',
335335
'GET', self.PUBLIC_OK_RESPONSES)
336336

337337
def test_permission_update(self):
338338
''' update permission OK'''
339-
self.check_permissions(self.URL_PREFIX + '/strom/', 'PUT',
340-
self.ALL_FORBIDDEN, {'start_year': 2020})
339+
self.check_permissions(self.URL_PREFIX + '/0/', 'PUT',
340+
self.ONLY_STROM_OK_RESPONSES,
341+
{
342+
"id": 0,
343+
"name": "STROM",
344+
"slug": "strom",
345+
"start_year": 1976,
346+
"description": "popis",
347+
"rules": "# Pravidlá",
348+
"min_years_until_graduation": 0,
349+
"sites": [
350+
0
351+
]
352+
})
341353

342354
def test_permission_create(self):
343355
''' create permission OK'''

competition/views.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from rest_framework.decorators import action
1313
from rest_framework.exceptions import ValidationError
1414
from rest_framework.permissions import IsAdminUser, IsAuthenticated
15+
from rest_framework.request import Request
1516
from rest_framework.response import Response
1617

1718
from base.utils import mime_type
@@ -100,13 +101,22 @@ def generate_result_row(
100101
}
101102

102103

103-
class CompetitionViewSet(viewsets.ReadOnlyModelViewSet):
104+
class CompetitionViewSet(mixins.RetrieveModelMixin,
105+
mixins.UpdateModelMixin,
106+
mixins.ListModelMixin,
107+
viewsets.GenericViewSet):
104108
"""Naše aktivity"""
105109
queryset = Competition.objects.all()
106110
serializer_class = CompetitionSerializer
107-
lookup_field = 'slug'
108111
permission_classes = (CompetitionRestrictedPermission,)
109112

113+
@action(detail=False, url_path=r'slug/(?P<slug>\w+)')
114+
def slug(self, request: Request, slug: str = None) -> Response:
115+
competition: Competition = self.get_queryset().get(slug=slug)
116+
return Response(
117+
CompetitionSerializer(competition, many=False).data
118+
)
119+
110120

111121
class CommentViewSet(
112122
mixins.RetrieveModelMixin,

personal/views.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django_filters.rest_framework import DjangoFilterBackend
2-
from rest_framework import status, viewsets
2+
from rest_framework import exceptions, status, viewsets
33
from rest_framework.decorators import action
44
from rest_framework.filters import SearchFilter
55
from rest_framework.permissions import IsAdminUser, IsAuthenticated
@@ -26,14 +26,23 @@ class DistrictViewSet(viewsets.ReadOnlyModelViewSet):
2626
filterset_fields = ['county', ]
2727

2828

29-
class SchoolViewSet(viewsets.ReadOnlyModelViewSet):
29+
class SchoolViewSet(viewsets.ModelViewSet):
3030
"""Školy"""
3131
queryset = School.objects.all()
3232
serializer_class = SchoolSerializer
3333
filterset_fields = ['district', 'district__county']
3434
filter_backends = [DjangoFilterBackend, SearchFilter]
3535
search_fields = ['name', 'street']
3636

37+
def destroy(self, request, *args, **kwargs):
38+
"""Zmazanie školy"""
39+
instance = self.get_object()
40+
if Profile.objects.filter(school=instance).exists():
41+
raise exceptions.ValidationError(
42+
detail='Nie je možné zmazať školu, ktorá má priradených užívateľov.')
43+
self.perform_destroy(instance)
44+
return Response(status=status.HTTP_204_NO_CONTENT)
45+
3746

3847
class ProfileViewSet(viewsets.ModelViewSet):
3948
"""Užívateľské profily"""

0 commit comments

Comments
 (0)