71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
from rest_framework import status, viewsets
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from apps.plans.models import Plan
|
|
from .models import LeveeWorkSession
|
|
from .serializers import LeveeWorkSessionSerializer, LeveeWorkSessionWriteSerializer
|
|
|
|
|
|
class LeveeWorkSessionViewSet(viewsets.ModelViewSet):
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get_queryset(self):
|
|
queryset = LeveeWorkSession.objects.prefetch_related(
|
|
'items',
|
|
'items__field',
|
|
'items__plan',
|
|
).select_related('work_record')
|
|
year = self.request.query_params.get('year')
|
|
if year:
|
|
queryset = queryset.filter(year=year)
|
|
return queryset
|
|
|
|
def get_serializer_class(self):
|
|
if self.action in ['create', 'update', 'partial_update']:
|
|
return LeveeWorkSessionWriteSerializer
|
|
return LeveeWorkSessionSerializer
|
|
|
|
|
|
class LeveeWorkCandidatesView(APIView):
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get(self, request):
|
|
year = request.query_params.get('year')
|
|
if not year:
|
|
return Response(
|
|
{'detail': 'year が必要です。'},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
|
|
try:
|
|
year = int(year)
|
|
except (TypeError, ValueError):
|
|
return Response(
|
|
{'detail': 'year は数値で指定してください。'},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
|
|
plans = (
|
|
Plan.objects.select_related('field', 'crop', 'variety')
|
|
.filter(year=year, crop__name='水稲')
|
|
.order_by('field__display_order', 'field__id')
|
|
)
|
|
|
|
data = [
|
|
{
|
|
'field_id': plan.field_id,
|
|
'field_name': plan.field.name,
|
|
'field_area_tan': str(plan.field.area_tan),
|
|
'group_name': plan.field.group_name,
|
|
'plan_id': plan.id,
|
|
'crop_name': plan.crop.name,
|
|
'variety_name': plan.variety.name if plan.variety else '',
|
|
'selected': True,
|
|
}
|
|
for plan in plans
|
|
]
|
|
return Response(data)
|
|
|