From 213028ffe29cadb16c2656603584ea62802158d4 Mon Sep 17 00:00:00 2001 From: Ahmed abd aljbar Date: Thu, 4 Nov 2021 07:50:05 +0300 Subject: [PATCH] task_commerce_4 --- .idea/misc.xml | 5 +- commerce/controllers.py | 103 +++++++++++++++++++++++++++++++++++++--- commerce/schemas.py | 24 +++++++++- 3 files changed, 124 insertions(+), 8 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 0c95c56..c75fe34 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,7 @@ - + + + \ No newline at end of file diff --git a/commerce/controllers.py b/commerce/controllers.py index 0d8791b..f307406 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -1,13 +1,18 @@ +from os import name from typing import List +import random, string +import json from django.contrib.auth.models import User +from django.core.checks import messages from django.db.models import Q from django.shortcuts import get_object_or_404 from ninja import Router +from ninja.orm import create_schema from pydantic import UUID4 -from commerce.models import Product, Category, City, Vendor, Item -from commerce.schemas import MessageOut, ProductOut, CitiesOut, CitySchema, VendorOut, ItemOut, ItemSchema, ItemCreate +from commerce.models import Address, Order, OrderStatus, Product, Category, City, Vendor, Item +from commerce.schemas import AddressCreate, AddressOut, AddressUpdate, CheckOut, MessageOut, ProductOut, CitiesOut, CitySchema, VendorOut, ItemOut, ItemSchema, ItemCreate products_controller = Router(tags=['products']) address_controller = Router(tags=['addresses']) @@ -109,9 +114,38 @@ def list_products( """ -@address_controller.get('') +@address_controller.get('addresses', response={ + 200: List[AddressOut], + 400: MessageOut +}) def list_addresses(request): - pass + addresses_qs = Address.objects.all() + if addresses_qs: + return addresses_qs + else: + return 400, {'detail': 'No addresses found'} + + +@address_controller.post("add-address", response=MessageOut) +def create_address(request, data_in: AddressCreate): + + user = User.objects.first() + address = Address(**data_in.dict()) + address.user = user + address.save() + return {'detail': 'Address added succsesfully'} + + +@address_controller.post("update-address", response=MessageOut) +def update_address(request, data_in: AddressUpdate): + address = get_object_or_404(Address, id=data_in.id) + + for attr, value in data_in.dict().items(): + setattr(address, attr, value) + address.save() + + return {'detail': 'Address updated succsesfully'} + # @products_controller.get('categories', response=List[CategoryOut]) @@ -176,7 +210,7 @@ def delete_city(request, id: UUID4): }) def view_cart(request): cart_items = Item.objects.filter(user=User.objects.first(), ordered=False) - + if cart_items: return cart_items @@ -194,8 +228,9 @@ def add_update_cart(request, item_in: ItemCreate): item.save() except Item.DoesNotExist: Item.objects.create(**item_in.dict(), user=User.objects.first()) + return 200, {'detail': 'Added to cart successfully'} - return 200, {'detail': 'Added to cart successfully'} + @order_controller.post('item/{id}/reduce-quantity', response={ @@ -220,3 +255,59 @@ def delete_item(request, id: UUID4): item.delete() return 204, {'detail': 'Item deleted!'} + + +@order_controller.put("item/{id}/increase-quantity", response={ + 200: MessageOut +}) +def increase_qty(request, id: UUID4): + item = get_object_or_404(Item, id=id, user = User.objects.first()) + item.item_qty += 1 + item.save() + return 200, {'detail': 'The item quanity has been updated'} + + +@order_controller.post("create", response={ + 200: MessageOut +}) +def create_order(request): + items = Item.objects.filter(user=User.objects.first()) + + items.update(ordered=True) + + + order = Order( + user = User.objects.first(), + ref_code = ref_code(), + status = OrderStatus.objects.get(is_default=True), + ordered = False, + ) + order.save() + + dic = list(items.values('id')) + for entry in dic: + print(entry["id"]) + order.items.add(entry["id"]) + order.total = order.order_total + order.save() + + #debugging + #print(order.items) + + return 200, {'detail': 'the order has been succsesfuly created'} + + + +@order_controller.put('checkout') +def checkout(request, data_in: CheckOut): + order = get_object_or_404(Order, user=User.objects.first()) + order.note = data_in.note + order.address = Address.objects.get(id=data_in.address_id) + order.ordered = True + order.status = OrderStatus.objects.get(title='PROCESSING') + order.save() + return 200, {'detail': 'Check out done sucsessfuly'} + +def ref_code(): + x = ''.join(random.choices(string.ascii_letters + string.digits, k=6)) + return x \ No newline at end of file diff --git a/commerce/schemas.py b/commerce/schemas.py index 5b7d0d4..23a2bfa 100644 --- a/commerce/schemas.py +++ b/commerce/schemas.py @@ -1,10 +1,12 @@ from typing import List +from django.contrib.auth.models import User from ninja import ModelSchema, Schema from ninja.orm import create_schema from pydantic import UUID4 +from pydantic.schema import schema -from commerce.models import Product, Merchant +from commerce.models import City, Order, Product, Merchant class MessageOut(Schema): @@ -75,6 +77,22 @@ class CitySchema(Schema): class CitiesOut(CitySchema, UUIDSchema): pass +class AddressSchema(Schema): + work_address: bool + address1: str + address2: str + phone: str + + +class AddressCreate(AddressSchema): + city_id: UUID4 + +class AddressUpdate(AddressCreate, UUIDSchema): + pass + + +class AddressOut(AddressSchema, UUIDSchema): + city: CitiesOut class ItemSchema(Schema): # user: @@ -90,3 +108,7 @@ class ItemCreate(Schema): class ItemOut(UUIDSchema, ItemSchema): pass + +class CheckOut(Schema): + address_id: UUID4 + note: str