Coverage for backend/django/core/auxiliary/viewsets/ExpressionViewSet.py: 68%
26 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-12-18 04:00 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-12-18 04:00 +0000
1from core.viewset import ModelViewSet
2from django.db.models import QuerySet
3from rest_framework.response import Response
4from core.auxiliary.models.Expression import Expression
5from core.auxiliary.serializers.ExpressionSerializer import ExpressionSerializer
6from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes
7from rest_framework.decorators import action
8from rest_framework.serializers import DictField, IntegerField
11class ExpressionViewSet(ModelViewSet):
12 serializer_class = ExpressionSerializer
14 # Filter to only show expressions for a specific flowsheet
15 def get_queryset(self) -> QuerySet[Expression]:
16 queryset = Expression.objects.all()
17 scenario_id = self.request.query_params.get("scenario")
18 if scenario_id is not None:
19 queryset = queryset.filter(scenario_id=scenario_id)
20 return queryset
22 @extend_schema(
23 parameters=[
24 OpenApiParameter(name="scenario", required=True, type=OpenApiTypes.INT),
25 ]
26 )
27 def list(self, request):
28 return super().list(request)
31 @extend_schema(responses=DictField(child=IntegerField()),
32 parameters=[
33 OpenApiParameter(name="scenario", required=True, type=OpenApiTypes.INT),
34 OpenApiParameter(name="flowsheet", required=True, type=OpenApiTypes.INT),
35 ])
36 @action(detail=False,methods=["get"])
37 def download_tag_mappings(self, request):
38 return Response(create_expression_json(self.get_queryset()),
39 content_type="text/json",
40 headers={
41 'Content-Disposition': 'attachment; filename="mss-tag-mappings.json"'
42 })
45def create_expression_json(queryset: QuerySet[Expression, Expression]) -> dict[str, int]:
46 """
47 Create a JSON representation of the MSS columns in the scenario.
48 The keys are the expression names, and the values are the IDs of the associated PropertyValues.
49 """
50 expr: Expression
51 data = {
52 expr.name: {"property": expr.property.values.first().pk,
53 "units": expr.property.unit
54 } for expr in queryset.all()
55 }
56 return data