From e2bbbcad0397c86e8897a7d8206e1ee8cf40b07d Mon Sep 17 00:00:00 2001 From: heshamamer98 Date: Tue, 2 Nov 2021 00:04:57 +0300 Subject: [PATCH] done by Hesham Amer --- commerce/controllers.py | 134 +++++++++++++++++++++++++++++++++++----- commerce/models.py | 2 +- commerce/schemas.py | 46 +++++++++++++- 3 files changed, 164 insertions(+), 18 deletions(-) diff --git a/commerce/controllers.py b/commerce/controllers.py index 389aff6..d633198 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -8,8 +8,8 @@ from ninja import Router from pydantic import UUID4 -from commerce.models import Product, Category, City, Vendor, Item, Order, OrderStatus -from commerce.schemas import MessageOut, ProductOut, CitiesOut, CitySchema, VendorOut, ItemOut, ItemSchema, ItemCreate +from commerce.models import Address, Product, Category, City, Vendor, Item, Order, OrderStatus +from commerce.schemas import AddressSchema, MessageOut, ProductOut, CitiesOut, CitySchema, VendorOut, ItemOut, ItemSchema, ItemCreate, OrderOut, AddressOut, AddressCreate, OrderSchema, CheckOut products_controller = Router(tags=['products']) address_controller = Router(tags=['addresses']) @@ -60,7 +60,7 @@ def list_products( # print(product) # # order = Product.objects.all().select_related('address', 'user').prefetch_related('items') - + # try: # one_product = Product.objects.get(id='8d3dd0f1-2910-457c-89e3-1b0ed6aa720a') # except Product.DoesNotExist: @@ -69,7 +69,7 @@ def list_products( # # shortcut_function = get_object_or_404(Product, id='8d3dd0f1-2910-457c-89e3-1b0ed6aa720a') # print(shortcut_function) - + # print(type(product)) # print(product.merchant.name) # print(type(product.merchant)) @@ -111,9 +111,44 @@ def list_products( """ -@address_controller.get('') +@address_controller.get('', response={ + 200: List[AddressOut], + 404: MessageOut +}) def list_addresses(request): - pass + address = Address.objects.all() + if address: + return address + + return 404, {'datail': 'no addresses'} + + +@address_controller.get('address/{id}', response={ + 200: AddressOut, + 404: MessageOut +}) +def retrieve_address(request, id: UUID4): + return get_object_or_404(Address, id=id) + + + +@address_controller.post('create', response={ + 200: AddressSchema, + 400: MessageOut +}) +def create_address(request, address_in: AddressCreate): + address = Address(**address_in.dict(), user=User.objects.first()) + address.save() + return address + + +@address_controller.delete('address/{id}', response={ + 204: MessageOut +}) +def delete_address(request, id: UUID4): + address = get_object_or_404(Address, id=id) + address.delete() + return 204, {'detail': 'deleted'} # @products_controller.get('categories', response=List[CategoryOut]) @@ -214,6 +249,18 @@ def reduce_item_quantity(request, id: UUID4): return 200, {'detail': 'Item quantity reduced successfully!'} + +@order_controller.post('item/{id}/increase-quantity', response={ + 200: MessageOut, +}) +def increase_item_quantity(request, id: UUID4): + item = get_object_or_404(Item, id=id, user=User.objects.first()) + item.item_qty += 1 + item.save() + + return 200, {'detail': 'Item quantity reduced successfully!'} + + @order_controller.delete('item/{id}', response={ 204: MessageOut }) @@ -224,23 +271,31 @@ def delete_item(request, id: UUID4): return 204, {'detail': 'Item deleted!'} -def generate_ref_code(): + +@order_controller.get('', response={ + 200: List[OrderSchema], + 404: MessageOut +}) +def get_orders(request): + orders = Order.objects.all() + + if orders: + return orders + + return 404, {'detail': 'No cities found'} + + +def create_ref_code(): return ''.join(random.sample(string.ascii_letters + string.digits, 6)) + @order_controller.post('create-order', response=MessageOut) def create_order(request): - ''' - * add items and mark (ordered) field as True - * add ref_number - * add NEW status - * calculate the total - ''' - order_qs = Order.objects.create( user=User.objects.first(), status=OrderStatus.objects.get(is_default=True), - ref_code=generate_ref_code(), + ref_code=create_ref_code(), ordered=False, ) @@ -252,3 +307,52 @@ def create_order(request): order_qs.save() return {'detail': 'order created successfully'} + + + + + +# checkout + + + + +@order_controller.post('ordered_item/{id}/reduce-quantity', response={ + 200: MessageOut, +}) +def reduce_ordered_item_quantity(request, id: UUID4): + item = get_object_or_404(Item, id=id, user=User.objects.first()) + if item.item_qty <= 1: + item.delete() + return 200, {'detail': 'Item deleted!'} + item.item_qty -= 1 + item.save() + + return 200, {'detail': 'Item quantity reduced successfully!'} + + + +@order_controller.post('ordered_item/{id}/increase-quantity', response={ + 200: MessageOut, +}) +def increase_ordered_item_quantity(request, id: UUID4): + item = get_object_or_404(Item, id=id, user=User.objects.first()) + item.item_qty += 1 + item.save() + + return 200, {'detail': 'Item quantity increased successfully!'} + + +@order_controller.post('checkout', response={ + 200: MessageOut, +}) +def checkout(request, item_in: CheckOut): + order=get_object_or_404(Order, user=User.objects.first(), ordered=False) + + order.note = item_in.note + order.address = Address.objects.get(id=item_in.address_id) + order.ordered = True + order.status = OrderStatus.objects.get(title='COMPLETED') + + order.save() + return 200, {'detail': 'checkout complated successfully'} \ No newline at end of file diff --git a/commerce/models.py b/commerce/models.py index edbedee..2d9bfa6 100644 --- a/commerce/models.py +++ b/commerce/models.py @@ -82,7 +82,7 @@ class Item(Entity): ordered = models.BooleanField('ordered', default=False) def __str__(self): - return self.product.name + return f'' class OrderStatus(Entity): diff --git a/commerce/schemas.py b/commerce/schemas.py index 0944297..f08257b 100644 --- a/commerce/schemas.py +++ b/commerce/schemas.py @@ -1,4 +1,5 @@ from typing import List +from uuid import UUID, uuid4 from ninja import ModelSchema, Schema from ninja.orm import create_schema @@ -78,9 +79,9 @@ class CitiesOut(CitySchema, UUIDSchema): class ItemSchema(Schema): # user: - product: ProductOut item_qty: int ordered: bool + product: ProductOut class ItemCreate(Schema): @@ -88,7 +89,48 @@ class ItemCreate(Schema): item_qty: int -class ItemOut(UUIDSchema, ItemSchema): +class ItemOut(ItemSchema, UUIDSchema): + pass + + +class AddressSchema(Schema): + work_address: bool + address1: str + address2: str + phone: str + city: CitiesOut + + +class AddressCreate(Schema): + work_address: bool + address1: str + address2: str + phone: str + city_id: UUID4 + + +class AddressOut(AddressSchema, UUIDSchema): pass +class OrderOut(Schema): + note: str = None + ref_code: str + ordered: bool + address: AddressSchema = None + items: List[ItemOut] + + +class OrderSchema(OrderOut, UUIDSchema): + pass + + +class OrderChange(Schema): + item_id: UUID4 + prodect_id: UUID4 + + + +class CheckOut(Schema): + note: str + address_id: UUID4 \ No newline at end of file