Coverage for backend/django/Economics/shared/serializer_base.py: 92%

20 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2026-06-23 21:51 +0000

1from rest_framework import serializers 

2 

3from core.validation import get_current_flowsheet 

4 

5 

6def _current_flowsheet_id() -> int | None: 

7 context = get_current_flowsheet() or {} 

8 flowsheet_id = context.get("flowsheet") 

9 return int(flowsheet_id) if flowsheet_id is not None else None 

10 

11 

12def _validate_same_flowsheet(instance, field_name: str, flowsheet_id: int | None) -> None: 

13 if instance is not None and flowsheet_id is not None and instance.flowsheet_id != flowsheet_id: 13 ↛ 14line 13 didn't jump to line 14 because the condition on line 13 was never true

14 raise serializers.ValidationError({field_name: "Referenced row must belong to the active flowsheet."}) 

15 

16 

17class FlowsheetScopedSerializer(serializers.ModelSerializer): 

18 """Serializer base that validates user-provided relations against request flowsheet context.""" 

19 

20 same_flowsheet_fields: tuple[str, ...] = () 

21 

22 def validate(self, attrs): 

23 attrs = super().validate(attrs) 

24 flowsheet_id = _current_flowsheet_id() 

25 for field_name in self.same_flowsheet_fields: 

26 value = attrs.get(field_name) 

27 if value is None and self.instance is not None: 

28 value = getattr(self.instance, field_name, None) 

29 _validate_same_flowsheet(value, field_name, flowsheet_id) 

30 return attrs