Coverage for backend/django/Economics/reference_data/viewsets.py: 91%
52 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-06-23 21:51 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-06-23 21:51 +0000
1from drf_spectacular.utils import OpenApiParameter, OpenApiTypes, extend_schema
2from rest_framework.decorators import action
3from rest_framework.response import Response
5from core.viewset import ReadOnlyModelViewSet
6from Economics.reference_data.models import CostIndexSeries, EconomicsDefaultRate, EconomicsLangFactorDefault
7from Economics.reference_data.serializers import (
8 CostIndexSeriesSerializer,
9 EconomicsDefaultRatePreviewRequestSerializer,
10 EconomicsDefaultRatePreviewSerializer,
11 EconomicsDefaultRateSerializer,
12 EconomicsLangFactorDefaultSerializer,
13 default_rate_preview_payload,
14)
17class CostIndexSeriesViewSet(ReadOnlyModelViewSet):
18 serializer_class = CostIndexSeriesSerializer
20 @extend_schema(parameters=[OpenApiParameter(name="flowsheet", required=True, type=OpenApiTypes.INT)])
21 def list(self, request):
22 return super().list(request)
24 def get_queryset(self):
25 queryset = CostIndexSeries.objects.prefetch_related("values")
26 provider = self.request.query_params.get("provider")
27 return queryset.filter(provider=provider) if provider else queryset
30class EconomicsDefaultRateViewSet(ReadOnlyModelViewSet):
31 serializer_class = EconomicsDefaultRateSerializer
33 @extend_schema(
34 parameters=[
35 OpenApiParameter(name="category", type=OpenApiTypes.STR, required=False),
36 OpenApiParameter(name="rate_type", type=OpenApiTypes.STR, required=False),
37 OpenApiParameter(name="value_kind", type=OpenApiTypes.STR, required=False),
38 OpenApiParameter(name="review_status", type=OpenApiTypes.STR, required=False),
39 ]
40 )
41 def list(self, request, *args, **kwargs):
42 return super().list(request, *args, **kwargs)
44 @extend_schema(
45 request=EconomicsDefaultRatePreviewRequestSerializer,
46 responses=EconomicsDefaultRatePreviewSerializer,
47 )
48 @action(detail=False, methods=["post"], url_path="preview")
49 def preview(self, request, *args, **kwargs):
50 serializer = EconomicsDefaultRatePreviewRequestSerializer(data=request.data)
51 serializer.is_valid(raise_exception=True)
52 default_rate = serializer.validated_data["default_rate"]
53 payload = default_rate_preview_payload(
54 default_rate,
55 override={
56 "boiler_efficiency_percent": serializer.validated_data.get("boiler_efficiency_percent"),
57 "steam_energy_gj_per_t": serializer.validated_data.get("steam_energy_gj_per_t"),
58 "target_display_unit": serializer.validated_data.get("target_display_unit", ""),
59 },
60 )
61 return Response(payload)
63 def get_queryset(self):
64 queryset = EconomicsDefaultRate.objects.all()
65 for field_name in ("category", "rate_type", "value_kind", "review_status"):
66 value = self.request.query_params.get(field_name)
67 if value:
68 queryset = queryset.filter(**{field_name: value})
69 return queryset
72class EconomicsLangFactorDefaultViewSet(ReadOnlyModelViewSet):
73 serializer_class = EconomicsLangFactorDefaultSerializer
75 def get_queryset(self):
76 queryset = EconomicsLangFactorDefault.objects.all()
77 scope = self.request.query_params.get("scope")
78 unit_operation_type = self.request.query_params.get("unit_operation_type")
79 equipment_category = self.request.query_params.get("equipment_category")
80 equipment_subtype = self.request.query_params.get("equipment_subtype")
81 if scope: 81 ↛ 82line 81 didn't jump to line 82 because the condition on line 81 was never true
82 queryset = queryset.filter(scope=scope)
83 if unit_operation_type: 83 ↛ 84line 83 didn't jump to line 84 because the condition on line 83 was never true
84 queryset = queryset.filter(unit_operation_type=unit_operation_type)
85 if equipment_category:
86 queryset = queryset.filter(equipment_category=equipment_category)
87 if equipment_subtype: 87 ↛ 88line 87 didn't jump to line 88 because the condition on line 87 was never true
88 queryset = queryset.filter(equipment_subtype=equipment_subtype)
89 return queryset