diff --git a/backend/core/migrations/0004_auto_20210619_1245.py b/backend/core/migrations/0004_auto_20210619_1245.py new file mode 100644 index 0000000..c9a2a7b --- /dev/null +++ b/backend/core/migrations/0004_auto_20210619_1245.py @@ -0,0 +1,31 @@ +# Generated by Django 3.2 on 2021-06-19 12:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0003_product_image'), + ] + + operations = [ + migrations.AlterModelOptions( + name='orderitem', + options={'verbose_name': 'OrderItem', 'verbose_name_plural': 'OrderItems'}, + ), + migrations.AlterModelOptions( + name='shippingaddress', + options={'verbose_name': 'ShippingAddress', 'verbose_name_plural': 'ShippingAddresses'}, + ), + migrations.AddField( + model_name='order', + name='shippingPrice', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True), + ), + migrations.AddField( + model_name='order', + name='totalPrice', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True), + ), + ] diff --git a/backend/core/migrations/0005_rename_postalcode_shippingaddress_pincode.py b/backend/core/migrations/0005_rename_postalcode_shippingaddress_pincode.py new file mode 100644 index 0000000..9c49ba8 --- /dev/null +++ b/backend/core/migrations/0005_rename_postalcode_shippingaddress_pincode.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2 on 2021-06-19 12:51 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0004_auto_20210619_1245'), + ] + + operations = [ + migrations.RenameField( + model_name='shippingaddress', + old_name='postalCode', + new_name='pincode', + ), + ] diff --git a/backend/core/models.py b/backend/core/models.py index 3c81ecb..2194b53 100644 --- a/backend/core/models.py +++ b/backend/core/models.py @@ -67,11 +67,35 @@ class Order(models.Model): related_name='order', on_delete=models.CASCADE ) - paymentMethord = models.CharField(max_length=255, blank=True, null=True) + paymentMethord = models.CharField( + max_length=255, + blank=True, + null=True + ) taxPrice = models.DecimalField( - max_digits=7, decimal_places=2, blank=True, null=True) + max_digits=7, + decimal_places=2, + blank=True, + null=True + ) + shippingPrice = models.DecimalField( + max_digits=7, + decimal_places=2, + blank=True, + null=True + ) + totalPrice = models.DecimalField( + max_digits=7, + decimal_places=2, + blank=True, + null=True + ) isPaid = models.BooleanField(default=False) - createdAt = models.DateTimeField(auto_now_add=False, blank=True, null=True) + createdAt = models.DateTimeField( + auto_now_add=False, + blank=True, + null=True + ) isDeliverd = models.BooleanField(default=False) deliverdAt = models.DateTimeField( auto_now_add=False, @@ -129,10 +153,26 @@ class ShippingAddress(models.Model): null=True, blank=True ) - address = models.CharField(max_length=200, null=True, blank=True) - city = models.CharField(max_length=200, null=True, blank=True) - postalCode = models.CharField(max_length=200, null=True, blank=True) - country = models.CharField(max_length=200, null=True, blank=True) + address = models.CharField( + max_length=200, + null=True, + blank=True + ) + city = models.CharField( + max_length=200, + null=True, + blank=True + ) + pincode = models.CharField( + max_length=200, + null=True, + blank=True + ) + country = models.CharField( + max_length=200, + null=True, + blank=True + ) shippingPrice = models.DecimalField( max_digits=7, decimal_places=2, diff --git a/backend/core/serializer.py b/backend/core/serializer.py index 13cb085..6a47e62 100644 --- a/backend/core/serializer.py +++ b/backend/core/serializer.py @@ -68,3 +68,45 @@ class Meta: model = Product fields = '__all__' # Product Serializer - end + + +class ShippingAddressSerializer(ModelSerializer): + class Meta: + model = ShippingAddress + fields = '__all__' + + +class OrderItemSerializer(ModelSerializer): + class Meta: + model = OrderItem + fields = '__all__' + + +class OrderSerializer(ModelSerializer): + orders = SerializerMethodField(read_only=True) + shippingAddress = SerializerMethodField(read_only=True) + user = SerializerMethodField(read_only=True) + + class Meta: + model = Order + fields = '__all__' + + def get_orders(self, obj): + items = obj.orderitem_set.all() + serializer = OrderItemSerializer(items, many=True) + return serializer.data + + def get_shippingAddress(self, obj): + try: + address = ShippingAddressSerializer( + obj.shippingAddress, + many=False + ) + except: + address = False + return address + + def get_user(self, obj): + user = obj.user + serializer = UserSerializer(user, many=False) + return serializer.data diff --git a/backend/core/urls.py b/backend/core/urls.py index a6761ea..dec3a3e 100644 --- a/backend/core/urls.py +++ b/backend/core/urls.py @@ -7,7 +7,8 @@ getUserProfile, getUsers, registerUser, - updateUserProfile + updateUserProfile, + addOrderItem ) app_name = 'core' @@ -25,4 +26,5 @@ path('product//', getProduct, name="get-product"), # orders urls + path('orders/add', addOrderItem, name="order-add"), ] diff --git a/backend/core/views.py b/backend/core/views.py index cc229ac..21f12a0 100644 --- a/backend/core/views.py +++ b/backend/core/views.py @@ -16,7 +16,8 @@ MyTokenObtainPairSerializer, ProductSerializer, UserSerializer, - UserSerializerWithToken + UserSerializerWithToken, + OrderSerializer ) # Users views @@ -100,4 +101,58 @@ def getProduct(request, id): # Products views - end # Order views + + +@api_view(['POST']) +@permission_classes(['IsAuthenticated']) +def addOrderItem(request): + user = request.user + data = request.data + + orderItems = data['orderItems'] + + if orderItems and len(orderItems) == 0: + return Response( + {'detail': 'No Order Items'}, + status=HTTP_400_BAD_REQUEST + ) + else: + # (1): Create Order + order = Order.objects.create( + user=user, + paymentMethord=data.get('paymentMethord'), + taxPrice=data.get('taxPrice'), + shippingPrice=data.get('shippingPrice'), + totalPrice=data.get('totalPrice') + ) + # (2): Shipping Address + shipping = ShippingAddress.objects.create( + order=order, + address=data.get('shippingAddress').get('address'), + city=data.get('shippingAddress').get('city'), + pincode=data.get('shippingAddress').get('pincode'), + country=data.get('shippingAddress').get('country'), + ) + # (3): Create OrderItem and set order to orderItems relationship + for item in orderItems: + product = Product.objects.get(_id=item.get('product')) + item = OrderItem.objects.create( + product=product, + order=order, + name=product.name, + qty=item.get('qtn'), + price=item.get('price'), + image=product.image.url + ) + + # (4) Update Stock + + product.countInStock -= item.qty + product.save() + + serializer = OrderSerializer(order, many=True) + + return Response(serializer.data) + + # Order views - end