171 lines
6.2 KiB
Python
171 lines
6.2 KiB
Python
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(
|
|
"پرداخت با شکست مواجه شده است. اگر پول کم شده است ظرف مدت ۴۸ ساعت پول به حساب شما بازخواهد گشت."
|
|
) |