from django.shortcuts import render from .execptions import DiscountNotAvailableError from rest_framework.views import APIView, Response from django.shortcuts import get_object_or_404 from product.models import ProductVariant from rest_framework.permissions import IsAuthenticated from .serializers import * # from cart.models import from rest_framework import status from .models import OrderItemModel, OrderModel, DiscountCode, PaymentModel from .permissons import CanDeleteCartItemPermissions from azbankgateways import bankfactories, models as bank_models from azbankgateways.exceptions import AZBankGatewaysException try: pass except DiscountNotAvailableError: pass from django.urls import reverse """ add post remove delete show get pay """ class ApplyDiscountView(APIView): serializer_class = DiscountCodeSerializer permission_classes = [IsAuthenticated] def post(self, request): cart_order, created = OrderModel.objects.get_or_create( user=request.user, status='CART' ) discount_code = get_object_or_404(DiscountCode, code=request.data.get('code')) if not discount_code.is_valid(): return Response({'detail': discount_code.not_valid_reason()}, status=status.HTTP_400_BAD_REQUEST) cart_order.discount_code = discount_code cart_order.save() return Response({'detail': 'کد تخفیف با موفقیت اعمال شد'}, status=status.HTTP_200_OK) class CartItemClear(APIView): permission_classes = [IsAuthenticated] serializer_class = OrderItemSerailzier def delete(self, request): cart_order, created = OrderModel.objects.get_or_create( user=request.user, status='CART' ) cart_order.items.all().delete() return Response({'detail': f'سبد خرید با موفقیت خالی شد'}, status=status.HTTP_204_NO_CONTENT) class CartItemViews(APIView): permission_classes = [IsAuthenticated] serializer_class = OrderItemSerailzier def post(self, request, pk): product_variant = get_object_or_404(ProductVariant, pk=pk) response = 'محصول با موفقیت به سبد خرید اضافه شد' quantity = request.data.get('quantity', 1) quantity = max(quantity, 0) if product_variant.in_stock < quantity: quantity = product_variant.in_stock response = 'تعداد درخواستی بیشتر از موجودی محصول میباشد' cart_order, created = OrderModel.objects.get_or_create(user=request.user, status='CART') order_item, created = OrderItemModel.objects.get_or_create(order=cart_order, product=product_variant, defaults={'quantity': quantity}) if not created and order_item.quantity: order_item.quantity = quantity order_item.save() if not order_item.quantity: order_item.delete() return Response({'detail': response, 'count': quantity}, status=status.HTTP_202_ACCEPTED) def delete(self, request, pk): order_item = get_object_or_404(OrderItemModel, pk=pk) permission = CanDeleteCartItemPermissions() if not permission.has_object_permission(request, self, order_item): return Response({"detail": permission.message}, status=status.HTTP_403_FORBIDDEN) order_item.delete() return Response( {"detail": "محصول با موفقیت از سبد خرید شما حذف شد"}, status=status.HTTP_204_NO_CONTENT, ) class CartView(APIView): permission_classes = [IsAuthenticated] serializer_class = CartSerializer def get(self, request): user = request.user cart_instance, created = OrderModel.objects.get_or_create(user=user, status='CART') cart_ser = self.serializer_class(instance=cart_instance, context={'request': request}) return Response(cart_ser.data, status=status.HTTP_200_OK) class OrderlistView(APIView): permission_classes = [IsAuthenticated] serializer_class = OrderSerializer def get(self, request): user = request.user orders = OrderModel.objects.filter(user=user).exclude(status="CART") orders_ser = self.serializer_class(instance=orders, many=True, context={'request': request}) return Response(orders_ser.data, status=status.HTTP_200_OK) class PaymentView(APIView): def post(self, request): amount = 10000000 user_mobile_number = request.user.phone factory = bankfactories.BankFactory() try: bank = ( factory.create(bank_models.BankType.ZARINPAL) ) bank.set_request(request) bank.set_amount(amount) bank.set_client_callback_url(request.build_absolute_uri(reverse("callback-gateway"))) bank.set_mobile_number(user_mobile_number) bank_record = bank.ready() return Response(bank.redirect_gateway().url) except AZBankGatewaysException as e: print(e) return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST) return Response({'gateway_url': bank.redirect_url}, status=status.HTTP_200_OK) from django.views.decorators.csrf import csrf_exempt from rest_framework.decorators import api_view from rest_framework.response import Response from azbankgateways import bankfactories, models as bank_models @csrf_exempt @api_view(['POST']) def callback_view(request): tracking_code = request.GET.get(settings.TRACKING_CODE_QUERY_PARAM, None) if not tracking_code: logging.debug("این لینک معتبر نیست.") raise Http404 try: bank_record = bank_models.Bank.objects.get(tracking_code=tracking_code) except bank_models.Bank.DoesNotExist: logging.debug("این لینک معتبر نیست.") raise Http404 if bank_record.is_success: return HttpResponse("پرداخت با موفقیت انجام شد.") return HttpResponse( "پرداخت با شکست مواجه شده است. اگر پول کم شده است ظرف مدت ۴۸ ساعت پول به حساب شما بازخواهد گشت." )