A-2 実装内容まとめ:
バックエンド: POST /api/plans/bulk_update/ API(field_ids, year, crop, variety を受けて一括設定) フロントエンド: チェックボックス列、全選択/個別選択、一括操作バー(作物・品種セレクタ + 確認ダイアログ)
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user