Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Orders(CustomerCompanyMixin, CreateModelMixin, UpdateModelMixin, ReadOnlyModelViewSet):
- pagination_class = LargeResultsSetPagination
- serializer_class = OrderSerializer
- permission_classes = [IsAuthenticatedOnList]
- queryset = Order.objects.prefetch_related('items')
- def get_queryset(self):
- qs = super().get_queryset()
- if self.action == 'list':
- qs = qs.filter(customer=self.request.user)
- return qs
- def get_serializer_class(self, *args, **kwargs):
- if self.action in ['create', 'retrieve']:
- return OrderDetailSerializer
- if self.action in ['update', 'partial_update']:
- return OrderPersonalDataUpdateSerializer
- return super().get_serializer_class()
- def create(self, request, *args, **kwargs):
- serializer = OrderCreateSerializer(data=request.data, context={
- 'request': request, 'region': request.region, 'outlet': request.outlet
- })
- serializer.is_valid(raise_exception=True)
- outlet = serializer.validated_data.get('outlet')
- delivery_payment_option = serializer.validated_data.get('delivery_payment_option')
- delivery_type = serializer.validated_data['delivery_type']
- payment_type = serializer.validated_data.get('payment_type')
- address = serializer.validated_data.get('address', '')
- recipient_phone = serializer.validated_data.get('recipient_phone', '')
- recipient_email = serializer.validated_data.get('recipient_email', '')
- recipient_name = serializer.validated_data.get('recipient_name', '')
- employee = serializer.validated_data.get('employee', None)
- with transaction.atomic():
- order = Order(
- state=Order.NEW_STATE,
- created=timezone.now(),
- number=Order.generate_number(),
- company=request.company,
- customer=request.user if request.user.is_authenticated else None,
- delivery_type=delivery_type,
- payment_type=payment_type,
- address=address,
- outlet=outlet,
- recipient_phone=recipient_phone,
- recipient_email=recipient_email,
- recipient_name=recipient_name,
- employee=employee
- )
- order.save()
- new_cart_items = []
- cart_items = list(serializer.validated_data['cart_items'])
- try:
- order_items = OrderItem.generate_items_from_cart(
- cart_items,
- delivery_type,
- order=order,
- region=request.region,
- outlet=outlet,
- address=address
- )
- except ValueError as e:
- raise ValidationError(detail=e)
- OrderItem.objects.bulk_create(order_items)
- if request.user.is_authenticated:
- CartItem.actualize(request.user, order_items, new_cart_items)
- # find delivery outlet
- if order.delivery_type == DeliveryType.DELIVERY:
- order.outlet = Order.get_delivery_outlet(order_items, request.region.pk)
- order.save(update_fields=('outlet', ))
- order.update_total()
- order.update_money_fields()
- order.update_estimated_delivery()
- order.process_delivery_payment_option(delivery_payment_option)
- order.check_trigger(order.state)
- order_serializer = self.get_serializer(order)
- return Response(order_serializer.data, status=status.HTTP_201_CREATED)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement