1
0
forked from erp-dev/erp
Files
erpnew/api_v2/views/shipment_delivery_photo.py
2026-05-01 22:43:22 +08:00

144 lines
6.0 KiB
Python

from rest_framework import permissions, serializers, status
from rest_framework.parsers import FormParser, MultiPartParser
from rest_framework.response import Response
from rest_framework.views import APIView
from shipment import models as shipment_models
def _get_employee(request):
employee = getattr(request.user, 'employee', None)
if employee is None:
raise serializers.ValidationError('当前用户未关联员工')
return employee
class ShipmentDeliveryPhotoWriteSerializer(serializers.ModelSerializer):
shipment = serializers.PrimaryKeyRelatedField(queryset=shipment_models.Shipment.objects.all())
delivery = serializers.PrimaryKeyRelatedField(queryset=shipment_models.ShipmentDelivery.objects.all())
class Meta:
model = shipment_models.ShipmentDeliveryPhoto
fields = ['shipment', 'delivery', 'photo', 'remark']
def validate(self, attrs):
employee = self.context['employee']
instance = self.instance
shipment = attrs.get('shipment', getattr(instance, 'shipment', None))
delivery = attrs.get('delivery', getattr(instance, 'delivery', None))
if shipment is None:
raise serializers.ValidationError({'shipment': '出货单不能为空'})
if delivery is None:
raise serializers.ValidationError({'delivery': '送货单不能为空'})
if shipment.merchant_id != employee.merchant_id:
raise serializers.ValidationError({'shipment': '出货单不属于当前商户'})
if delivery.merchant_id != employee.merchant_id:
raise serializers.ValidationError({'delivery': '送货单不属于当前商户'})
if shipment.delivery_id != delivery.id:
raise serializers.ValidationError({'delivery': '送货单与出货单当前绑定关系不一致'})
return attrs
class ShipmentDeliveryPhotoReadSerializer(serializers.ModelSerializer):
created_by = serializers.IntegerField(source='created_by_id', read_only=True, allow_null=True)
shipment_id = serializers.IntegerField(read_only=True)
delivery_id = serializers.IntegerField(read_only=True)
class Meta:
model = shipment_models.ShipmentDeliveryPhoto
fields = [
'id',
'shipment_id',
'delivery_id',
'photo',
'remark',
'created_by',
'created_at',
'updated_at',
]
read_only_fields = fields
class ShipmentDeliveryPhotoListCreateView(APIView):
permission_classes = [permissions.IsAuthenticated]
parser_classes = [MultiPartParser, FormParser]
def _queryset(self, employee):
return shipment_models.ShipmentDeliveryPhoto.objects.select_related(
'shipment', 'delivery', 'created_by'
).filter(
shipment__merchant=employee.merchant,
delivery__merchant=employee.merchant,
)
def get(self, request):
employee = _get_employee(request)
queryset = self._queryset(employee)
shipment_id = request.query_params.get('shipment_id')
delivery_id = request.query_params.get('delivery_id')
if shipment_id:
queryset = queryset.filter(shipment_id=shipment_id)
if delivery_id:
queryset = queryset.filter(delivery_id=delivery_id)
return Response(ShipmentDeliveryPhotoReadSerializer(queryset, many=True, context={'request': request}).data)
def post(self, request):
employee = _get_employee(request)
serializer = ShipmentDeliveryPhotoWriteSerializer(data=request.data, context={'employee': employee})
serializer.is_valid(raise_exception=True)
photo = serializer.save(created_by=request.user)
return Response(
ShipmentDeliveryPhotoReadSerializer(photo, context={'request': request}).data,
status=status.HTTP_201_CREATED,
)
class ShipmentDeliveryPhotoDetailView(APIView):
permission_classes = [permissions.IsAuthenticated]
parser_classes = [MultiPartParser, FormParser]
def get_object(self, request, photo_id):
employee = _get_employee(request)
return shipment_models.ShipmentDeliveryPhoto.objects.select_related(
'shipment', 'delivery', 'created_by'
).filter(
shipment__merchant=employee.merchant,
delivery__merchant=employee.merchant,
id=photo_id,
).first()
def get(self, request, photo_id):
photo = self.get_object(request, photo_id)
if photo is None:
return Response({'detail': '未找到送达照片'}, status=status.HTTP_404_NOT_FOUND)
return Response(ShipmentDeliveryPhotoReadSerializer(photo, context={'request': request}).data)
def patch(self, request, photo_id):
photo = self.get_object(request, photo_id)
if photo is None:
return Response({'detail': '未找到送达照片'}, status=status.HTTP_404_NOT_FOUND)
employee = _get_employee(request)
serializer = ShipmentDeliveryPhotoWriteSerializer(photo, data=request.data, partial=True, context={'employee': employee})
serializer.is_valid(raise_exception=True)
photo = serializer.save()
return Response(ShipmentDeliveryPhotoReadSerializer(photo, context={'request': request}).data)
def put(self, request, photo_id):
photo = self.get_object(request, photo_id)
if photo is None:
return Response({'detail': '未找到送达照片'}, status=status.HTTP_404_NOT_FOUND)
employee = _get_employee(request)
serializer = ShipmentDeliveryPhotoWriteSerializer(photo, data=request.data, context={'employee': employee})
serializer.is_valid(raise_exception=True)
photo = serializer.save()
return Response(ShipmentDeliveryPhotoReadSerializer(photo, context={'request': request}).data)
def delete(self, request, photo_id):
photo = self.get_object(request, photo_id)
if photo is None:
return Response({'detail': '未找到送达照片'}, status=status.HTTP_404_NOT_FOUND)
photo.delete()
return Response(status=status.HTTP_204_NO_CONTENT)