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