Coverage for backend/core/auxiliary/viewsets/FlowsheetViewSet.py: 96%
83 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-11-06 23:27 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-11-06 23:27 +0000
1from rest_framework import serializers, viewsets
2from rest_framework import status
3from rest_framework.response import Response
4from django.db.models import QuerySet
5from core.auxiliary.models.Flowsheet import Flowsheet
6from core.auxiliary.enums.FlowsheetTemplateType import FlowsheetTemplateType
7from core.auxiliary.serializers.FlowsheetSerializer import FlowsheetSerializer
8from drf_spectacular.utils import extend_schema
9from rest_framework.decorators import action
10from drf_spectacular.types import OpenApiTypes
11from drf_spectacular.utils import OpenApiParameter
12from authentication.user.AccessTable import AccessTable
13import core.auxiliary.enums.ViewType as ViewType
15class ImportFlowsheetSerializer(serializers.Serializer):
16 data = serializers.JSONField()
18class FlowsheetSharingSerializer(serializers.Serializer):
19 flowsheet = serializers.IntegerField()
20 user_email = serializers.EmailField()
22class ListSharedUsersSerializer(serializers.Serializer):
23 users = serializers.ListField(child=serializers.EmailField())
25class FlowsheetViewSet(viewsets.ModelViewSet):
27 serializer_class = FlowsheetSerializer
29 def get_queryset(self) -> QuerySet[Flowsheet]:
30 current_user = self.request.user
31 return Flowsheet.objects.filter(owner=current_user, flowsheet_template_type=FlowsheetTemplateType.NotTemplate)
33 @extend_schema(
34 parameters=[
35 OpenApiParameter(name="type", required=True, type=OpenApiTypes.STR),
36 ]
37 )
38 def list(self, request, *args, **kwargs):
39 type = request.query_params.get('type', ViewType.OWNED)
40 queryset = Flowsheet.get_flowsheets_by_view_type(request.user, type)
41 queryset = queryset.filter(flowsheet_template_type=FlowsheetTemplateType.NotTemplate)
42 serializer = self.get_serializer(queryset, many=True)
43 return Response(serializer.data)
45 def retrieve(self, request, *args, **kwargs):
46 # Update the savedDate field
47 instance = Flowsheet.objects.get(id=kwargs['pk'])
48 if AccessTable.objects.filter(
49 user=request.user,
50 flowsheet=instance
51 ).exists():
52 instance.set_saved_date()
53 serializer = self.get_serializer(instance)
55 return Response(serializer.data)
56 elif instance.flowsheet_template_type == FlowsheetTemplateType.PublicTemplate and request.user.is_staff:
57 # Allow admins to view contents of public templates
58 serializer = self.get_serializer(instance)
60 return Response(serializer.data)
61 else:
62 return Response({"error": "You do not have access to this flowsheet"}, status=status.HTTP_403_FORBIDDEN)
64 def create(self, request, *args, **kwargs):
65 flowsheet_serializer = FlowsheetSerializer(
66 data=request.data, context={"request": request})
67 flowsheet_serializer.is_valid(raise_exception=True)
68 flowsheet_serializer.save()
70 return Response(flowsheet_serializer.data, status=status.HTTP_201_CREATED)
72 @extend_schema(request=FlowsheetSharingSerializer, responses=None)
73 @action(detail=False, methods=['post'], url_path='share-flowsheet')
74 def share_flowsheet(self, request):
75 serializer = FlowsheetSharingSerializer(data=request.data)
76 serializer.is_valid(raise_exception=True)
77 flowsheet = serializer.validated_data['flowsheet']
78 user_email = serializer.validated_data['user_email']
80 try:
81 Flowsheet.share_flowsheet(request.user, flowsheet, user_email)
82 return Response({"message": "Flowsheet shared successfully"}, status=status.HTTP_200_OK)
83 except:
84 return Response({"error": "Failed to share flowsheet"}, status=status.HTTP_404_NOT_FOUND)
86 @extend_schema(responses=ListSharedUsersSerializer)
87 @action(detail=False, methods=['get','delete'], url_path='list-shared-users')
88 def list_shared_users(self, request, *args, **kwargs):
89 flowsheet_id = request.query_params.get("flowsheet")
90 if not flowsheet_id: 90 ↛ 91line 90 didn't jump to line 91 because the condition on line 90 was never true
91 return Response({"error": "Flowsheet ID is required"}, status=status.HTTP_400_BAD_REQUEST)
93 try:
94 users = Flowsheet.get_shared_users(request.user, flowsheet_id)
95 serializer = ListSharedUsersSerializer({"users": users})
96 return Response(serializer.data, status=status.HTTP_200_OK)
97 except:
98 return Response({"error": "Failed to retrieve list of user"}, status=status.HTTP_404_NOT_FOUND)
100 @extend_schema(request=FlowsheetSharingSerializer, responses=None)
101 @action(detail=False, methods=['post'], url_path='remove-user')
102 def remove_user(self, request, *args, **kwargs):
103 flowsheet_id = request.data.get("flowsheet")
104 user_email = request.data.get("user_email")
106 if not flowsheet_id or not user_email: 106 ↛ 107line 106 didn't jump to line 107 because the condition on line 106 was never true
107 return Response({"error": "Flowsheet ID and user email are required"}, status=status.HTTP_400_BAD_REQUEST)
109 try:
110 Flowsheet.remove_user(request.user, flowsheet_id, user_email)
111 return Response({"message": "User removed successfully"}, status=status.HTTP_200_OK)
112 except:
113 return Response({"error": "Failed to remove user"}, status=status.HTTP_404_NOT_FOUND)