diff --git a/.idea/03-commerce.iml b/.idea/03-commerce.iml index f602895..4d779de 100644 --- a/.idea/03-commerce.iml +++ b/.idea/03-commerce.iml @@ -16,7 +16,7 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index 0c95c56..dc9ea49 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/commerce/controllers.py b/commerce/controllers.py index 0d8791b..923d9ce 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -1,18 +1,19 @@ -from typing import List - from django.contrib.auth.models import User from django.db.models import Q from django.shortcuts import get_object_or_404 from ninja import Router +import string +import random 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 * +from commerce.schemas import * products_controller = Router(tags=['products']) address_controller = Router(tags=['addresses']) vendor_controller = Router(tags=['vendors']) order_controller = Router(tags=['orders']) +checkout_controller = Router(tags=['checkouts']) @vendor_controller.get('', response=List[VendorOut]) @@ -109,9 +110,32 @@ def list_products( """ -@address_controller.get('') +@address_controller.get('', response={ + 200: AddressesOut, + 404: MessageOut +}) def list_addresses(request): - pass + address_list = Address.objects.all() + if address_list: + return Address + return 400, {'detail': 'No address'} + + +@address_controller.get('{id}', response={ + 200: AddressesOut, + 404: MessageOut +}) +def retrieve_address(request, id: UUID4): + return get_object_or_404(City, id=id) + + +@address_controller.delete('{id}', response={ + 204: MessageOut +}) +def delete_address(request, id: UUID4): + address = get_object_or_404(Address, id=id) + address.delete() + return 204, {'detail': 'Address was deleted'} # @products_controller.get('categories', response=List[CategoryOut]) @@ -167,7 +191,7 @@ def update_city(request, id: UUID4, city_in: CitySchema): def delete_city(request, id: UUID4): city = get_object_or_404(City, id=id) city.delete() - return 204, {'detail': ''} + return 204, {'detail': 'City was deleted'} @order_controller.get('cart', response={ @@ -212,6 +236,17 @@ 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 increased successfully!'} + + @order_controller.delete('item/{id}', response={ 204: MessageOut }) @@ -220,3 +255,40 @@ def delete_item(request, id: UUID4): item.delete() return 204, {'detail': 'Item deleted!'} + + +def generate_ref_code(): + return ''.join(random.sample(string.ascii_letters + string.digits, 6)) + + +@order_controller.post('create_order', response={ + 200: MessageOut, + 400: MessageOut, +}) +def create_order(request): + order_qs = Order( + user=User.objects.first, + status=OrderStatus.objects.get(is_default=True), + ref_code=generate_ref_code(), + ordered=False, + ) + + user_items = Item.objects.filter(user=User.objects.first()), + user_items.update(ordered=True) + order_qs.items.add(*user_items) + order_qs.total = order_qs.order_total + order_qs.save() + + return {'details': 'Order was created successfully'} + + +@checkout_controller.post('checkout', response={ + 200: MessageOut, + 400: MessageOut, +}) +def checkout(request, address_in: AddressesOut, city: str): + address_qs = Address(**address_in.dict(), user=User.objects.first(), city=UUID4) + address_qs.save() + order = Order.objects.get(user=User.objects.first(), ordered=False) + + return {'details': 'Checkout was created successfully'} diff --git a/commerce/schemas.py b/commerce/schemas.py index 5b7d0d4..1fc0b2b 100644 --- a/commerce/schemas.py +++ b/commerce/schemas.py @@ -90,3 +90,14 @@ class ItemCreate(Schema): class ItemOut(UUIDSchema, ItemSchema): pass + + +class AddressSchema(Schema): + workaddress: bool = None + address1: str + address2: str = None + phone: str + + +class AddressesOut(UUIDSchema, AddressSchema): + city: CitiesOut diff --git a/config/urls.py b/config/urls.py index fea5e70..a526d6b 100644 --- a/config/urls.py +++ b/config/urls.py @@ -18,7 +18,8 @@ from django.urls import path from ninja import NinjaAPI -from commerce.controllers import products_controller, address_controller, vendor_controller, order_controller +from commerce.controllers import products_controller, address_controller, vendor_controller, order_controller,\ + checkout_controller from config import settings api = NinjaAPI() @@ -27,6 +28,7 @@ api.add_router('addresses', address_controller) api.add_router('vendors', vendor_controller) api.add_router('orders', order_controller) +api.add_router('checkouts', checkout_controller) urlpatterns = [ path('admin/', admin.site.urls), diff --git a/requirements.txt b/requirements.txt index 5d025cd..9f43ccc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ asgiref==3.4.1 -Django==3.2.8 +Django==3.2.9 django-ninja==0.16.1 Pillow==8.4.0 pydantic==1.8.2