From 5218717674f0a2f4ced0e39ef44796b8aee5389c Mon Sep 17 00:00:00 2001 From: Jack Wilburn Date: Thu, 10 Aug 2023 10:37:25 -0600 Subject: [PATCH 1/3] Require that Session state is a python dictionary --- multinet/api/models/session.py | 6 ++++++ multinet/api/views/session.py | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/multinet/api/models/session.py b/multinet/api/models/session.py index 909d2a8..9ad0c18 100644 --- a/multinet/api/models/session.py +++ b/multinet/api/models/session.py @@ -14,6 +14,12 @@ class Session(TimeStampedModel): class Meta: abstract = True + def save(self, *args, **kwargs): + if not isinstance(self.state, dict): + raise ValueError("State must be a dict") + + super().save(*args, **kwargs) + class TableSession(Session): table = models.ForeignKey(Table, on_delete=models.CASCADE) diff --git a/multinet/api/views/session.py b/multinet/api/views/session.py index 51e75de..905bb56 100644 --- a/multinet/api/views/session.py +++ b/multinet/api/views/session.py @@ -1,4 +1,4 @@ -from django.http.response import Http404 +from django.http.response import Http404, HttpResponseBadRequest from django.shortcuts import get_object_or_404 from drf_yasg.utils import swagger_auto_schema from rest_framework import serializers, status @@ -64,7 +64,11 @@ def state(self, request, parent_lookup_workspace__name: str, pk=None): data = serializer.validated_data['state'] session.state = data - session.save() + + try: + session.save() + except ValueError as e: + return HttpResponseBadRequest(str(e)) return Response(status=status.HTTP_204_NO_CONTENT) From 1180fb184a7309a06b592f952815ed24f2fad38b Mon Sep 17 00:00:00 2001 From: Jack Wilburn Date: Thu, 10 Aug 2023 17:40:29 -0600 Subject: [PATCH 2/3] Use different serializers for create requests and responses --- multinet/api/views/session.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/multinet/api/views/session.py b/multinet/api/views/session.py index ecde34b..b32783a 100644 --- a/multinet/api/views/session.py +++ b/multinet/api/views/session.py @@ -97,6 +97,19 @@ def get_serializer_class(self): return NetworkSessionCreateSerializer return NetworkSessionSerializer + @swagger_auto_schema( + request_body=NetworkSessionCreateSerializer, responses={201: NetworkSessionSerializer} + ) + @require_workspace_permission(WorkspaceRoleChoice.WRITER) + def create(self, request, parent_lookup_workspace__name: str): + input_serializer = NetworkSessionCreateSerializer(data=request.data) + input_serializer.is_valid(raise_exception=True) + + instance = NetworkSession.objects.create(**input_serializer.validated_data) + + output_serializer = NetworkSessionSerializer(instance) + return Response(output_serializer.data, status=status.HTTP_201_CREATED) + class TableSessionViewSet(TableWorkspaceChildMixin, SessionViewSet): queryset = TableSession.objects.all().select_related('table__workspace') @@ -105,3 +118,16 @@ def get_serializer_class(self): if self.action == 'create': return TableSessionCreateSerializer return TableSessionSerializer + + @swagger_auto_schema( + request_body=TableSessionCreateSerializer, responses={201: TableSessionSerializer} + ) + @require_workspace_permission(WorkspaceRoleChoice.WRITER) + def create(self, request): + input_serializer = TableSessionCreateSerializer(data=request.data) + input_serializer.is_valid(raise_exception=True) + + instance = TableSession.objects.create(**input_serializer.validated_data) + + output_serializer = TableSessionSerializer(instance) + return Response(output_serializer.data, status=status.HTTP_201_CREATED) From 6d12d41273ea030954bdff5b039fdcb13e8cc2d9 Mon Sep 17 00:00:00 2001 From: Jack Wilburn Date: Thu, 10 Aug 2023 17:41:47 -0600 Subject: [PATCH 3/3] Fix linting issues --- multinet/api/models/session.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/multinet/api/models/session.py b/multinet/api/models/session.py index 5e3480a..626f183 100644 --- a/multinet/api/models/session.py +++ b/multinet/api/models/session.py @@ -17,7 +17,7 @@ class Meta: def save(self, *args, **kwargs): if not isinstance(self.state, dict): - raise ValueError("State must be a dict") + raise ValueError('State must be a dict') super().save(*args, **kwargs)