Files
hossein-por-shop/backend/order/views.py
T
2025-03-13 19:15:04 +03:30

173 lines
6.1 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
from .permissons import CanDeleteCartItemPermissions
try:
pass
except DiscountNotAvailableError:
pass
"""
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)
# from rest_framework.views import APIView
# from rest_framework.response import Response
# from rest_framework import status
# from azbankgateways import bankfactories, models as bank_models
# class PaymentView(APIView):
# def post(self, request):
# amount = request.data.get('amount')
# user = request.user
# payment = Payment.objects.create(amount=amount, bank_type='ZARINPAL')
# factory = bankfactories.ZarinpalBankFactory()
# try:
# bank = factory.create(
# amount=amount,
# user=user,
# callback_url='http://.com/callback/',
# reference_model=payment,
# )
# bank.ready()
# return Response({'gateway_url': bank.redirect_url}, status=status.HTTP_200_OK)
# except Exception as e:
# return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST)
# 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.POST.get('tracking_code')
# payment_id = request.POST.get('payment_id')
# payment = Payment.objects.get(id=payment_id)
# bank_type = payment.bank_type
# factory = bankfactories.BankFactory.get_bank(bank_type)
# try:
# result = factory.verify_transaction(tracking_code)
# if result.is_success:
# payment.status = 'Paid'
# payment.tracking_code = tracking_code
# payment.save()
# return Response({'status': 'Payment successful'})
# else:
# payment.status = 'Failed'
# payment.save()
# return Response({'status': 'Payment failed'})
# except Exception as e:
# return Response({'error': str(e)})