From 5b3fa81d2d23fae81579bb8c464cd4ae0c660ad9 Mon Sep 17 00:00:00 2001 From: Abdullah Amer Date: Mon, 1 Nov 2021 15:06:08 +0300 Subject: [PATCH 1/3] done abdullah amer --- .idea/misc.xml | 3 + commerce/controllers.py | 171 ++++++++++++++++++++++++---------------- commerce/schemas.py | 61 ++++++++++++-- 3 files changed, 160 insertions(+), 75 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 0c95c56..8372d3e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,7 @@ + + \ No newline at end of file diff --git a/commerce/controllers.py b/commerce/controllers.py index 0d8791b..1be6ade 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -1,4 +1,6 @@ from typing import List +import random +import string from django.contrib.auth.models import User from django.db.models import Q @@ -6,8 +8,10 @@ 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 Product, Address, Category, City, OrderStatus, Vendor, Order +from commerce.schemas import MessageOut, AddressSchemaOut, AddressCreateDataIn, ProductOut \ + , CitySchemaOut, CityOut, VendorOut, CheckoutSchema, \ + ItemOut, ItemSchema, ItemCreate products_controller = Router(tags=['products']) address_controller = Router(tags=['addresses']) @@ -53,74 +57,45 @@ 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) +@address_controller.get('address', response={ + 200: list[AddressSchemaOut], + 404: MessageOut +}) +def list_addresses(request): + address = Address.objects.all() + if address: + return address + else: + return 404, {'detal': 'error'} -4+1 -""" +@address_controller.post('adrress', response={ + 201: AddressSchemaOut, + 404: MessageOut +}) +def add_adress(request, adress_in: AddressCreateDataIn): + address = Address.objects.create(**address_in.dict(), user=User.objects.first()) + address.save() + return 201, address -@address_controller.get('') -def list_addresses(request): - pass +@address_controller.put('address/{id}') +def address_update(request, id: UUID4, adress_in: AddressCreateDataIn): + address = get_object_or_404(Address, id=id) + for attr, value in adress_in.dict().items(): + setattr(employee, attr, value) + address.save() -# @products_controller.get('categories', response=List[CategoryOut]) -# def list_categories(request): -# return Category.objects.all() +@address_controller.delete('address/{id}', response=MessageOut) +def address_delete(request, id: UUID4, ): + address = get_object_or_404(Address, id=id) + address.delete() + return 200, {'detail': 'done'} @address_controller.get('cities', response={ - 200: List[CitiesOut], + 200: List[CityOut], 404: MessageOut }) def list_cities(request): @@ -133,7 +108,7 @@ def list_cities(request): @address_controller.get('cities/{id}', response={ - 200: CitiesOut, + 200: CityOut, 404: MessageOut }) def retrieve_city(request, id: UUID4): @@ -141,20 +116,32 @@ def retrieve_city(request, id: UUID4): @address_controller.post('cities', response={ - 201: CitiesOut, + 201: CityOut, 400: MessageOut }) -def create_city(request, city_in: CitySchema): +def create_city(request, city_in: CitySchemaOut): city = City(**city_in.dict()) city.save() + return 201, city +# +# @address_controller.post('city', response={ +# 201: CityOut, +# 400: MessageOut +# }) +# def create_city(request, city_in: CitySchemaOut): +# city = City(**city_in.dict()) +# city.save() +# return 201, city + + @address_controller.put('cities/{id}', response={ - 200: CitiesOut, + 200: CityOut, 400: MessageOut }) -def update_city(request, id: UUID4, city_in: CitySchema): +def update_city(request, id: UUID4, city_in: CitySchemaOut): city = get_object_or_404(City, id=id) city.name = city_in.name city.save() @@ -167,7 +154,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 200, {'detail': ''} @order_controller.get('cart', response={ @@ -212,6 +199,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 reduce_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 increase successfully!'} + + @order_controller.delete('item/{id}', response={ 204: MessageOut }) @@ -220,3 +218,42 @@ def delete_item(request, id: UUID4): item.delete() return 204, {'detail': 'Item deleted!'} + + +def generta_ref_Code(): + return ''.join(random.smaple(string.ascii_letters + string.digits, 6)) + + +@order_controller.post('ceate-order', response=MessageOut) +def create_order(request): + order_qs = Order( + user=User.objects.first(), + status=OrderStatus.objects.get(is_default=True), + red_code=generta_ref_Code(), + ordered=False + ) + user_items = Item.objects.filter(user=User.objects.first()) + user_items.update(ordered=True) + order_qs.items.append(*user_items) + order_qs.total = order_qs.order_total + order_qs.save() + + return {'detail': 'create done'} + + +@order_controller.post('/checkout', response={ + 200: MessageOut, + 404: MessageOut +}) +def checkout(request, checkout_info: CheckoutSchema): + order = get_object_or_404(Order, user=User.objects.first(), ordered=False) + + if order: + order.note = checkout_info.note + order.address = Address.objects.get(id=checkout_info.address) + order.status = OrderStatus.objects.get(is_default=False) + order.ordered = True + order.save() + return 200, {'detail': 'checkout succifully'} + else: + return 404, {'detail': 'No active orders '} diff --git a/commerce/schemas.py b/commerce/schemas.py index 5b7d0d4..75f15a0 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 Product, Merchant, Address,City class MessageOut(Schema): @@ -15,7 +15,6 @@ class UUIDSchema(Schema): id: UUID4 -# ProductSchemaOut = create_schema(Product, depth=2) class VendorOut(UUIDSchema): name: str @@ -60,21 +59,63 @@ class Config: 'category', 'label', 'merchant', - ] +# +# +# class AddressOut(UUIDSchema): +# # city = CitiesOut +# class Config: +# model: Address +# model_fields = [ +# 'user', +# 'work_address', +# 'address1', +# 'address2', +# 'city', +# 'phone' +# ] +# +# +# class AddressSchema(Schema): +# user: UUID4 +# work_address: bool +# address1: str +# address2: str +# city: CitySchemaOut +# phone: str +# +# +class CitySchemaOut(Schema): + name: str -# class ProductManualSchemaOut(Schema): -# pass +class CityOut(CitySchemaOut, UUIDSchema): + class Config: + model = City + model_fields = ['name'] + +# +# class CitySchema(Schema): - name: str + city: str +class AddressSchemaOut(Schema): + id: UUID4 + work_address: bool + address1: str + address2: str + city: CitySchemaOut + phone: str -class CitiesOut(CitySchema, UUIDSchema): - pass +class AddressCreateDataIn(Schema): + work_address: bool + address1: str + address2: str + city_id: UUID4 + phone: int class ItemSchema(Schema): # user: @@ -90,3 +131,7 @@ class ItemCreate(Schema): class ItemOut(UUIDSchema, ItemSchema): pass + +class CheckoutSchema(Schema): + note: str =None + addresss: UUID4 From 293a28311dd60b16a2cdd9b9944bd4fc4d95c580 Mon Sep 17 00:00:00 2001 From: Abdullah Amer Date: Mon, 1 Nov 2021 17:02:18 +0300 Subject: [PATCH 2/3] abdullah amer update address id --- commerce/controllers.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/commerce/controllers.py b/commerce/controllers.py index 1be6ade..e560f8e 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -66,9 +66,16 @@ def list_addresses(request): if address: return address else: - return 404, {'detal': 'error'} + return 404, {'detail': 'error'} +@address_controller.get('address/{id}', response={ + 200: AddressesOut, + 404: MessageOut +}) +def address(request, id: UUID4): + return get_object_or_404(Address, id=id) + @address_controller.post('adrress', response={ 201: AddressSchemaOut, 404: MessageOut From 9825fbf41bfacc90c8790bd44b5d9f89e5dd6da0 Mon Sep 17 00:00:00 2001 From: Abdullah Amer Date: Mon, 1 Nov 2021 17:03:08 +0300 Subject: [PATCH 3/3] abdullah amer update address id --- commerce/controllers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commerce/controllers.py b/commerce/controllers.py index e560f8e..04ac145 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -70,7 +70,7 @@ def list_addresses(request): @address_controller.get('address/{id}', response={ - 200: AddressesOut, + 200: AddressSchemaOut, 404: MessageOut }) def address(request, id: UUID4):