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

1from drf_spectacular.utils import OpenApiParameter, OpenApiTypes, extend_schema 

2from rest_framework.decorators import action 

3from rest_framework.response import Response 

4 

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) 

15 

16 

17class CostIndexSeriesViewSet(ReadOnlyModelViewSet): 

18 serializer_class = CostIndexSeriesSerializer 

19 

20 @extend_schema(parameters=[OpenApiParameter(name="flowsheet", required=True, type=OpenApiTypes.INT)]) 

21 def list(self, request): 

22 return super().list(request) 

23 

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 

28 

29 

30class EconomicsDefaultRateViewSet(ReadOnlyModelViewSet): 

31 serializer_class = EconomicsDefaultRateSerializer 

32 

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) 

43 

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) 

62 

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 

70 

71 

72class EconomicsLangFactorDefaultViewSet(ReadOnlyModelViewSet): 

73 serializer_class = EconomicsLangFactorDefaultSerializer 

74 

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