A-2 実装内容まとめ:

バックエンド: POST /api/plans/bulk_update/ API(field_ids, year, crop, variety を受けて一括設定)
フロントエンド: チェックボックス列、全選択/個別選択、一括操作バー(作物・品種セレクタ + 確認ダイアログ)
This commit is contained in:
Akira
2026-02-19 12:29:54 +09:00
parent 8b5e0fc66e
commit cce119b1a8
4 changed files with 154 additions and 13 deletions

View File

@@ -79,6 +79,44 @@ class PlanViewSet(viewsets.ModelViewSet):
return Response({'message': f'Copied {len(new_plans)} plans from {from_year} to {to_year}'})
@action(detail=False, methods=['post'])
def bulk_update(self, request):
"""複数圃場の作付け計画を一括更新"""
field_ids = request.data.get('field_ids', [])
year = request.data.get('year')
crop_id = request.data.get('crop')
variety_id = request.data.get('variety')
if not field_ids or not year or not crop_id:
return Response({'error': 'field_ids, year, crop are required'}, status=status.HTTP_400_BAD_REQUEST)
try:
crop = Crop.objects.get(id=crop_id)
except Crop.DoesNotExist:
return Response({'error': 'Crop not found'}, status=status.HTTP_400_BAD_REQUEST)
variety = None
if variety_id:
try:
variety = Variety.objects.get(id=variety_id)
except Variety.DoesNotExist:
pass
updated = 0
created = 0
for field_id in field_ids:
plan, was_created = Plan.objects.update_or_create(
field_id=field_id,
year=year,
defaults={'crop': crop, 'variety': variety}
)
if was_created:
created += 1
else:
updated += 1
return Response({'created': created, 'updated': updated, 'total': created + updated})
@action(detail=False, methods=['get'])
def get_crops_with_varieties(self, request):
crops = Crop.objects.prefetch_related('varieties').all()