From ada40b00e6a1761a95fef841cc961f73ebd5f05e Mon Sep 17 00:00:00 2001 From: Israa27 Date: Mon, 1 Nov 2021 06:45:36 +0300 Subject: [PATCH 1/2] solve task --- .gitignore | 3 +- commerce/controllers.py | 171 ++++++++++++++++++++++++++-------------- commerce/schemas.py | 21 ++++- 3 files changed, 135 insertions(+), 60 deletions(-) diff --git a/.gitignore b/.gitignore index 7d0fc73..68d053f 100644 --- a/.gitignore +++ b/.gitignore @@ -141,4 +141,5 @@ cython_debug/ static/ media/ -.idea/ \ No newline at end of file +.idea/ +env1/ \ No newline at end of file diff --git a/commerce/controllers.py b/commerce/controllers.py index 0d8791b..781607d 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -1,13 +1,14 @@ from typing import List - +import string +import random 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 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']) @@ -53,61 +54,6 @@ 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('') def list_addresses(request): @@ -212,6 +158,20 @@ 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()) + if item.item_qty <= 1: + item.delete() + return 200, {'detail': 'Item deleted!'} + item.item_qty += 1 + item.save() + + return 200, {'detail': 'Item quantity increase successfully!'} + + @order_controller.delete('item/{id}', response={ 204: MessageOut }) @@ -220,3 +180,98 @@ 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)) + +#-----------create-order---------------- +@order_controller.post('create-order', response=MessageOut) +def create_order(request): + + order_qs = Order.objects.create( + 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()).filter(ordered=False) + + order_qs.items.add(*user_items) + order_qs.total = order_qs.order_total + user_items.update(ordered=True) + order_qs.save() + + return {'detail': 'order created successfully'} + +#-----------address---------------- + +@order_controller.get('address', response={ + 200: List[AddressOut], + 404: MessageOut +}) +def list_address(request): + address_qs =Address.objects.all() + + if address_qs: + return address_qs + + return 404, {'detail': 'No address found'} + + +@address_controller.get('order_address/{id}', response={ + 200: AddressOut, + 404: MessageOut +}) +def retrieve_address(request, id: UUID4): + return get_object_or_404(Address, id=id) + + +@order_controller.post('order_address', response={ + 201: AddressOut, + 400: MessageOut +}) +def create_address(request, address_in:AddressSchema): + address = Address(**address_in.dict()) + address.save() + return 201, address + + +@order_controller.put('order_address/{id}', response={ + 200: AddressOut, + 400: MessageOut +}) +def update_address(request, id: UUID4, address_in:AddressSchema): + address = get_object_or_404(Address, id=id) + address.address1 = address_in.address1 + address.address2 = address_in.address2 + address.phone = address_in.phone + address.work_address=address_in.work_address + address.save() + return 200, address + + +@order_controller.delete('order_address/{id}', response={ + 204: MessageOut +}) +def delete_city(request, id: UUID4): + address = get_object_or_404(Address, id=id) + address.delete() + return 204, {'detail': ''} + + +#----------------checkout----------- + +@order_controller.post('checkout', response=MessageOut) +def checkout(request ,order_address:CheckOut): + order_item = Order.objects.filter(user=User.objects.first()).filter(ordered=False) + if order_item: + order_item.note=order_address.note + order_item.address=order_address.address + order_item.update(ordered=True) + order_item.status=OrderStatus.objects.get(is_default=False) + order_item.save() + return {'detail':'done checkout'} + else: + return{'detail': 'nothing'} + diff --git a/commerce/schemas.py b/commerce/schemas.py index 5b7d0d4..dac6d0f 100644 --- a/commerce/schemas.py +++ b/commerce/schemas.py @@ -4,7 +4,7 @@ from ninja.orm import create_schema from pydantic import UUID4 -from commerce.models import Product, Merchant +from commerce.models import Address, City, Product, Merchant class MessageOut(Schema): @@ -90,3 +90,22 @@ class ItemCreate(Schema): class ItemOut(UUIDSchema, ItemSchema): pass + +class StatusOrder(Schema): + is_default:bool + title:str + +class AddressSchema(Schema): + work_address:bool + address1:str + address2:str + phone:int + +class AddressOut(UUIDSchema,AddressSchema): + city:CitiesOut + +class CheckOut(Schema): + note:str + address:AddressOut + + From 0e479c96f1a6f628dac93b4ebc72b6af362cd8f5 Mon Sep 17 00:00:00 2001 From: Israa27 Date: Sun, 14 Nov 2021 02:37:32 +0300 Subject: [PATCH 2/2] edit solution --- commerce/controllers.py | 66 +++++++++++++++++++++++++---------------- commerce/schemas.py | 13 ++++---- config/urls.py | 4 +-- 3 files changed, 49 insertions(+), 34 deletions(-) diff --git a/commerce/controllers.py b/commerce/controllers.py index 781607d..45f2f5a 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -184,26 +184,7 @@ def delete_item(request, id: UUID4): def generate_ref_code(): return ''.join(random.sample(string.ascii_letters + string.digits, 6)) -#-----------create-order---------------- -@order_controller.post('create-order', response=MessageOut) -def create_order(request): - - order_qs = Order.objects.create( - 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()).filter(ordered=False) - - order_qs.items.add(*user_items) - order_qs.total = order_qs.order_total - user_items.update(ordered=True) - order_qs.save() - return {'detail': 'order created successfully'} - #-----------address---------------- @order_controller.get('address', response={ @@ -232,7 +213,12 @@ def retrieve_address(request, id: UUID4): 400: MessageOut }) def create_address(request, address_in:AddressSchema): - address = Address(**address_in.dict()) + city = City(**address_in.city.dict()) + city.save() + address=Address.objects.create(address1=address_in.address1,address2=address_in.address2, + phone=address_in.phone, + work_address=address_in.work_address, + city=city,user=User.objects.first()) address.save() return 201, address @@ -242,11 +228,14 @@ def create_address(request, address_in:AddressSchema): 400: MessageOut }) def update_address(request, id: UUID4, address_in:AddressSchema): + city = City(**address_in.city.dict()) + city.save() address = get_object_or_404(Address, id=id) address.address1 = address_in.address1 address.address2 = address_in.address2 address.phone = address_in.phone address.work_address=address_in.work_address + address.city=city address.save() return 200, address @@ -260,18 +249,43 @@ def delete_city(request, id: UUID4): return 204, {'detail': ''} +#-----------create-order---------------- +@order_controller.post('create-order', response=MessageOut) +def create_order(request): + order_qs = Order.objects.create( + 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()).filter(ordered=False) + + order_qs.items.add(*user_items) + order_qs.total = order_qs.order_total + user_items.update(ordered=True) + order_qs.save() + + return {'detail': 'order created successfully'} + + #----------------checkout----------- @order_controller.post('checkout', response=MessageOut) def checkout(request ,order_address:CheckOut): order_item = Order.objects.filter(user=User.objects.first()).filter(ordered=False) + print(order_item) + city = City(**order_address.address.city.dict()) + city.save() + if order_item: order_item.note=order_address.note - order_item.address=order_address.address + order_item.address=Address.objects.create(address1=order_address.address.address1,address2=order_address.address.address2, + phone=order_address.address.phone, + work_address=order_address.address.work_address, + city=city,user=User.objects.first()) order_item.update(ordered=True) - order_item.status=OrderStatus.objects.get(is_default=False) - order_item.save() + order_item.status=OrderStatus.objects.get(is_default=True) return {'detail':'done checkout'} - else: - return{'detail': 'nothing'} - + + return{'detail': 'nothing'} diff --git a/commerce/schemas.py b/commerce/schemas.py index dac6d0f..9615294 100644 --- a/commerce/schemas.py +++ b/commerce/schemas.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Optional from ninja import ModelSchema, Schema from ninja.orm import create_schema @@ -95,17 +95,18 @@ class StatusOrder(Schema): is_default:bool title:str + class AddressSchema(Schema): work_address:bool address1:str address2:str phone:int + city:CitySchema +class AddressOut(AddressSchema,UUIDSchema): + pass -class AddressOut(UUIDSchema,AddressSchema): - city:CitiesOut + class CheckOut(Schema): note:str - address:AddressOut - - + address:AddressSchema diff --git a/config/urls.py b/config/urls.py index fea5e70..c18c3d0 100644 --- a/config/urls.py +++ b/config/urls.py @@ -27,6 +27,7 @@ api.add_router('addresses', address_controller) api.add_router('vendors', vendor_controller) api.add_router('orders', order_controller) +api.add_router('orders', order_controller) urlpatterns = [ path('admin/', admin.site.urls), @@ -35,5 +36,4 @@ ] if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file