diff --git a/multinet/api/models/session.py b/multinet/api/models/session.py index d90afa0..626f183 100644 --- a/multinet/api/models/session.py +++ b/multinet/api/models/session.py @@ -15,6 +15,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 5fe2f33..b32783a 100644 --- a/multinet/api/views/session.py +++ b/multinet/api/views/session.py @@ -1,4 +1,4 @@ -from django.http.response import Http404, HttpResponseForbidden +from django.http.response import Http404, HttpResponseBadRequest, HttpResponseForbidden from django.shortcuts import get_object_or_404 from drf_yasg.utils import swagger_auto_schema from rest_framework import serializers, status @@ -57,7 +57,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) @@ -93,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') @@ -101,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)