From 85d3106a0ff2daeed668c0ea069852131cff2571 Mon Sep 17 00:00:00 2001 From: Janna Tammar Al-Ward Date: Fri, 12 Nov 2021 01:03:50 +0300 Subject: [PATCH] Janna Tammar --- commerce/controllers.py | 129 ++++++++++++++++++---------------------- commerce/schemas.py | 12 +++- config/urls.py | 5 +- 3 files changed, 71 insertions(+), 75 deletions(-) diff --git a/commerce/controllers.py b/commerce/controllers.py index a8a551a..2c5c160 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -17,9 +17,11 @@ address_controller = Router(tags=['addresses']) vendor_controller = Router(tags=['vendors']) order_controller = Router(tags=['orders']) +checkout_controller = Router(tags=['checkouts']) User = get_user_model() + @vendor_controller.get('', response=List[VendorOut]) def list_vendors(request): return Vendor.objects.all() @@ -58,70 +60,32 @@ def list_products( return products_qs -""" -# product = Product.objects.all().select_related('merchant', 'category', 'vendor', 'label') - # 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: - # return {"detail": "Not found"} - # print(one_product) - # - # 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)) - # print(type(product.category)) - - -Product <- Merchant, Label, Category, Vendor - -Retrieve 1000 Products form DB - -products = Product.objects.all()[:1000] (select * from product limit 1000) - -for p in products: - print(p) - -for every product, we retrieve (Merchant, Label, Category, Vendor) records - -Merchant.objects.get(id=p.merchant_id) (select * from merchant where id = 'p.merchant_id') -Label.objects.get(id=p.label_id) (select * from merchant where id = 'p.label_id') -Category.objects.get(id=p.category_id) (select * from merchant where id = 'p.category_id') -Vendor.objects.get(id=p.vendor_id) (select * from merchant where id = 'p.vendor_id') - -4*1000+1 - -Solution: Eager loading - -products = (select * from product limit 1000) - -mids = [p1.merchant_id, p2.merchant_id, ...] -[p1.label_id, p2.label_id, ...] -. -. -. - -select * from merchant where id in (mids) * 4 for (label, category and vendor) - -4+1 - -""" +@address_controller.get('', response={ + 200: AddressesOut, + 404: MessageOut +}) +def list_addresses(request): + address_list = Address.objects.all() + if address_list: + return Address + return 400, {'detail': 'No address'} -@address_controller.get('') -def list_addresses(request): - pass +@address_controller.get('{id}', response={ + 200: AddressesOut, + 404: MessageOut +}) +def retrieve_address(request, id: UUID4): + return get_object_or_404(City, id=id) -# @products_controller.get('categories', response=List[CategoryOut]) -# def list_categories(request): -# return Category.objects.all() +@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'} @address_controller.get('cities', response={ @@ -172,15 +136,15 @@ 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={ +@order_controller.get('cart', auth=GlobalAuth(), response={ 200: List[ItemOut], 404: MessageOut }) def view_cart(request): - cart_items = Item.objects.filter(user=User.objects.first(), ordered=False) + cart_items = Item.objects.filter(user=request.auth['pk'], ordered=False) if cart_items: return cart_items @@ -188,26 +152,26 @@ def view_cart(request): return 404, {'detail': 'Your cart is empty, go shop like crazy!'} -@order_controller.post('add-to-cart', response={ +@order_controller.post('add-to-cart', auth=GlobalAuth(), response={ 200: MessageOut, # 400: MessageOut }) def add_update_cart(request, item_in: ItemCreate): try: - item = Item.objects.get(product_id=item_in.product_id, user=User.objects.first()) + item = Item.objects.get(product_id=item_in.product_id, user=request.auth['pk']) item.item_qty += 1 item.save() except Item.DoesNotExist: - Item.objects.create(**item_in.dict(), user=User.objects.first()) + Item.objects.create(**item_in.dict(), user=request.auth['pk']) return 200, {'detail': 'Added to cart successfully'} -@order_controller.post('item/{id}/reduce-quantity', response={ +@order_controller.post('item/{id}/reduce-quantity', auth=GlobalAuth(), response={ 200: MessageOut, }) def reduce_item_quantity(request, id: UUID4): - item = get_object_or_404(Item, id=id, user=User.objects.first()) + item = get_object_or_404(Item, id=id, user=request.auth['pk']) if item.item_qty <= 1: item.delete() return 200, {'detail': 'Item deleted!'} @@ -217,11 +181,22 @@ def reduce_item_quantity(request, id: UUID4): return 200, {'detail': 'Item quantity reduced successfully!'} -@order_controller.delete('item/{id}', response={ +@order_controller.post('item/{id}/increase-quantity', auth=GlobalAuth(), response={ + 200: MessageOut, +}) +def increase_item_quantity(request, id: UUID4): + item = get_object_or_404(Item, id=id, user=request.auth['pk']) + item.item_qty += 1 + item.save() + + return 200, {'detail': 'Item quantity increased successfully!'} + + +@order_controller.delete('item/{id}',auth=GlobalAuth(), response={ 204: MessageOut }) def delete_item(request, id: UUID4): - item = get_object_or_404(Item, id=id, user=User.objects.first()) + item = get_object_or_404(Item, id=id, user=request.auth['pk']) item.delete() return 204, {'detail': 'Item deleted!'} @@ -247,7 +222,7 @@ def create_order(request): ordered=False, ) - user_items = Item.objects.filter(user=User.objects.first()).filter(ordered=False) + user_items = Item.objects.filter(user=request.auth['pk']).filter(ordered=False) order_qs.items.add(*user_items) order_qs.total = order_qs.order_total @@ -255,3 +230,15 @@ def create_order(request): order_qs.save() return {'detail': 'order created successfully'} + + +@checkout_controller.post('checkout', auth=GlobalAuth(), response={ + 200: MessageOut, + 400: MessageOut, +}) +def checkout(request, address_in: AddressesOut, city: str): + address_qs = Address(**address_in.dict(), user=request.auth['pk'], city=UUID4) + address_qs.save() + order = Order.objects.get(user=request.auth['pk'], ordered=False) + + return {'details': 'Checkout was created successfully'} diff --git a/commerce/schemas.py b/commerce/schemas.py index 5d68396..e632d8a 100644 --- a/commerce/schemas.py +++ b/commerce/schemas.py @@ -7,9 +7,6 @@ from commerce.models import Product, Merchant - - - class UUIDSchema(Schema): id: UUID4 @@ -91,3 +88,12 @@ 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 3851026..95aab94 100644 --- a/config/urls.py +++ b/config/urls.py @@ -19,7 +19,8 @@ from ninja import NinjaAPI from account.controllers import account_controller -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() @@ -29,6 +30,8 @@ api.add_router('vendors', vendor_controller) api.add_router('orders', order_controller) api.add_router('auth', account_controller) +api.add_router('checkouts', checkout_controller) + urlpatterns = [ path('admin/', admin.site.urls),