Add allocation variety change history UI

This commit is contained in:
akira
2026-04-05 16:55:44 +09:00
parent 1d5bcc9dd6
commit ae0249be69
4 changed files with 130 additions and 25 deletions

View File

@@ -35,6 +35,8 @@ class PlanSerializer(serializers.ModelSerializer):
crop_name = serializers.ReadOnlyField(source='crop.name')
variety_name = serializers.ReadOnlyField(source='variety.name')
field_name = serializers.ReadOnlyField(source='field.name')
variety_change_count = serializers.SerializerMethodField()
latest_variety_change = serializers.SerializerMethodField()
class Meta:
model = Plan
@@ -52,6 +54,32 @@ class PlanSerializer(serializers.ModelSerializer):
notes=validated_data.get('notes', NO_CHANGE),
)
def get_variety_change_count(self, obj):
prefetched = getattr(obj, '_prefetched_objects_cache', {})
changes = prefetched.get('variety_changes')
if changes is not None:
return len(changes)
return obj.variety_changes.count()
def get_latest_variety_change(self, obj):
prefetched = getattr(obj, '_prefetched_objects_cache', {})
changes = prefetched.get('variety_changes')
if changes is not None:
latest = changes[0] if changes else None
else:
latest = obj.variety_changes.select_related('old_variety', 'new_variety').first()
if latest is None:
return None
return {
'id': latest.id,
'changed_at': latest.changed_at,
'old_variety_id': latest.old_variety_id,
'old_variety_name': latest.old_variety.name if latest.old_variety else None,
'new_variety_id': latest.new_variety_id,
'new_variety_name': latest.new_variety.name if latest.new_variety else None,
'fertilizer_moved_entry_count': latest.fertilizer_moved_entry_count,
}
class RiceTransplantEntrySerializer(serializers.ModelSerializer):
field_name = serializers.CharField(source='field.name', read_only=True)

View File

@@ -25,11 +25,15 @@ class VarietyViewSet(viewsets.ModelViewSet):
class PlanViewSet(viewsets.ModelViewSet):
queryset = Plan.objects.all()
queryset = Plan.objects.select_related('crop', 'variety', 'field').prefetch_related(
'variety_changes',
'variety_changes__old_variety',
'variety_changes__new_variety',
)
serializer_class = PlanSerializer
def get_queryset(self):
queryset = Plan.objects.all()
queryset = self.queryset
year = self.request.query_params.get('year')
if year:
queryset = queryset.filter(year=year)