Advertisement
Guest User

Untitled

a guest
Jul 20th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.65 KB | None | 0 0
  1. class Orders(CustomerCompanyMixin, CreateModelMixin, UpdateModelMixin, ReadOnlyModelViewSet):
  2.     pagination_class = LargeResultsSetPagination
  3.     serializer_class = OrderSerializer
  4.     permission_classes = [IsAuthenticatedOnList]
  5.     queryset = Order.objects.prefetch_related('items')
  6.  
  7.     def get_queryset(self):
  8.         qs = super().get_queryset()
  9.         if self.action == 'list':
  10.             qs = qs.filter(customer=self.request.user)
  11.         return qs
  12.  
  13.     def get_serializer_class(self, *args, **kwargs):
  14.         if self.action in ['create', 'retrieve']:
  15.             return OrderDetailSerializer
  16.         if self.action in ['update', 'partial_update']:
  17.             return OrderPersonalDataUpdateSerializer
  18.         return super().get_serializer_class()
  19.  
  20.     def create(self, request, *args, **kwargs):
  21.         serializer = OrderCreateSerializer(data=request.data, context={
  22.             'request': request, 'region': request.region, 'outlet': request.outlet
  23.         })
  24.  
  25.         serializer.is_valid(raise_exception=True)
  26.  
  27.         outlet = serializer.validated_data.get('outlet')
  28.         delivery_payment_option = serializer.validated_data.get('delivery_payment_option')
  29.         delivery_type = serializer.validated_data['delivery_type']
  30.         payment_type = serializer.validated_data.get('payment_type')
  31.         address = serializer.validated_data.get('address', '')
  32.         recipient_phone = serializer.validated_data.get('recipient_phone', '')
  33.         recipient_email = serializer.validated_data.get('recipient_email', '')
  34.         recipient_name = serializer.validated_data.get('recipient_name', '')
  35.         employee = serializer.validated_data.get('employee', None)
  36.  
  37.         with transaction.atomic():
  38.             order = Order(
  39.                 state=Order.NEW_STATE,
  40.                 created=timezone.now(),
  41.                 number=Order.generate_number(),
  42.                 company=request.company,
  43.                 customer=request.user if request.user.is_authenticated else None,
  44.                 delivery_type=delivery_type,
  45.                 payment_type=payment_type,
  46.                 address=address,
  47.                 outlet=outlet,
  48.                 recipient_phone=recipient_phone,
  49.                 recipient_email=recipient_email,
  50.                 recipient_name=recipient_name,
  51.                 employee=employee
  52.             )
  53.             order.save()
  54.             new_cart_items = []
  55.             cart_items = list(serializer.validated_data['cart_items'])
  56.  
  57.             try:
  58.                 order_items = OrderItem.generate_items_from_cart(
  59.                     cart_items,
  60.                     delivery_type,
  61.                     order=order,
  62.                     region=request.region,
  63.                     outlet=outlet,
  64.                     address=address
  65.                 )
  66.             except ValueError as e:
  67.                 raise ValidationError(detail=e)
  68.  
  69.             OrderItem.objects.bulk_create(order_items)
  70.  
  71.             if request.user.is_authenticated:
  72.                 CartItem.actualize(request.user, order_items, new_cart_items)
  73.  
  74.             # find delivery outlet
  75.             if order.delivery_type == DeliveryType.DELIVERY:
  76.                 order.outlet = Order.get_delivery_outlet(order_items, request.region.pk)
  77.                 order.save(update_fields=('outlet', ))
  78.  
  79.             order.update_total()
  80.             order.update_money_fields()
  81.             order.update_estimated_delivery()
  82.             order.process_delivery_payment_option(delivery_payment_option)
  83.             order.check_trigger(order.state)
  84.  
  85.         order_serializer = self.get_serializer(order)
  86.         return Response(order_serializer.data, status=status.HTTP_201_CREATED)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement