From b97d39ccef288e5fe60f156eda3a2b705020c757 Mon Sep 17 00:00:00 2001 From: ROQAYA_AMEER Date: Mon, 1 Nov 2021 16:58:43 +0300 Subject: [PATCH 1/3] first commit --- commerce/controllers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/commerce/controllers.py b/commerce/controllers.py index 0d8791b..3b82f62 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -13,6 +13,7 @@ address_controller = Router(tags=['addresses']) vendor_controller = Router(tags=['vendors']) order_controller = Router(tags=['orders']) +#Nothing to do @vendor_controller.get('', response=List[VendorOut]) From ee50d6cba8898f121c5d1e1d07c05fd53516cf3c Mon Sep 17 00:00:00 2001 From: ROQAYA_AMEER Date: Mon, 1 Nov 2021 17:06:42 +0300 Subject: [PATCH 2/3] task4 --- .idea/misc.xml | 3 ++ commerce/controllers.py | 93 +++++++++++++++++++++++++++++++++++++++-- commerce/schemas.py | 18 ++++++++ config/urls.py | 2 +- 4 files changed, 111 insertions(+), 5 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 3b82f62..595fb89 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -7,14 +7,12 @@ 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.schemas import MessageOut, ProductOut, CitiesOut, CitySchema, VendorOut, ItemOut, ItemSchema, ItemCreate,AddressOut, AddressSchema products_controller = Router(tags=['products']) address_controller = Router(tags=['addresses']) vendor_controller = Router(tags=['vendors']) order_controller = Router(tags=['orders']) -#Nothing to do - +Address_controller = Router(tags=['ADDRESS']) @vendor_controller.get('', response=List[VendorOut]) def list_vendors(request): @@ -221,3 +219,90 @@ def delete_item(request, id: UUID4): item.delete() return 204, {'detail': 'Item deleted!'} + +@Address_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 cities found'} + + +@Address_controller.get('address/{id}', response={ + 200: AddressOut, + 404: MessageOut +}) +def retrieve_city(request, id: UUID4): + return get_object_or_404(City, id=id) + + +@Address_controller.post('address', response={ + 201: AddressOut, + 400: MessageOut +}) +def create_city(request, address_in: AddressSchema): + address = Address(**address_in.dict()) + address.save() + return 201, address + + +@Address_controller.delete('address/{id}', response={ + 204: MessageOut +}) +def delete_city(request, id: UUID4): + address = get_object_or_404(Address, id=id) + address.delete() + return 204, {'detail': ''} + + +@address_controller.put('cities/{id}', response={ + 200: CitiesOut, + 400: MessageOut +}) +def update_address(request, id: UUID4, address_in: AddressSchema): + address = get_object_or_404(City, id=id) + address.address1 = address_in.address1 + address.address2 = address_in.address2 + address.phone = address_in.phone + address.save() + return 200, address + + +def generate_ref_code(): + return ''.join(random.sample(string.ascii_letters + string.digits, 6)) + + +@order_controller.post('create-order') +def crate_order(request): + order_qs = Order( + user=User.objects.first(), + stats=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.addend() + order_qs.total = order_qs.order_total + order_qs.save() + return {'detail': 'order create successfully'} + +@order_controller.post('CheckOut', response={ + 201: AddressOut, + 400: MessageOut +}) +def cheackOut(request): + address_qs = Order( + user=User.objects.first(), + stats=OrderStatus.objects.get(is_default=True), + ordered=False, + ) + address_qs.address.addend() + address_qs.note.addend() + address_qs.update(ordered=False) + address_qs.save() + return {'detail': 'checkout successfully'} \ No newline at end of file diff --git a/commerce/schemas.py b/commerce/schemas.py index 5b7d0d4..09fdb18 100644 --- a/commerce/schemas.py +++ b/commerce/schemas.py @@ -90,3 +90,21 @@ class ItemCreate(Schema): class ItemOut(UUIDSchema, ItemSchema): pass +class AddressSchema(Schema): + work_address = bool + address1 = str + address2 = str + city = CitiesOut + phone = int + + +class AddressCreate(Schema): + work_address = bool + address1 = str + address2 = str + city = CitiesOut + phone = int + + +class AddressOut(UUIDSchema, AddressSchema): + pass diff --git a/config/urls.py b/config/urls.py index fea5e70..4152a25 100644 --- a/config/urls.py +++ b/config/urls.py @@ -27,7 +27,7 @@ api.add_router('addresses', address_controller) api.add_router('vendors', vendor_controller) api.add_router('orders', order_controller) - +api.add_router('ADDRESS',Address_controller) urlpatterns = [ path('admin/', admin.site.urls), path('api/', api.urls), From 6e114d3115b69e0a1ae295133c6af5b46a8d8b69 Mon Sep 17 00:00:00 2001 From: ROQAYA_AMEER Date: Mon, 15 Nov 2021 10:29:17 +0300 Subject: [PATCH 3/3] last solution --- .idea/misc.xml | 2 +- commerce/controllers.py | 124 ++++++++++++++++++++++------------------ commerce/schemas.py | 29 +++++----- config/urls.py | 5 +- 4 files changed, 88 insertions(+), 72 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 8372d3e..e4364ab 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/commerce/controllers.py b/commerce/controllers.py index 595fb89..daa2102 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -1,18 +1,23 @@ +import string +from random import random 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 +from ninja import Router, ModelSchema 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,AddressOut, AddressSchema +from commerce.models import Product, Category, City, Vendor, Item, Order, Address, OrderStatus +from commerce.schemas import MessageOut, ProductOut, CitiesOut, CitySchema, VendorOut, ItemOut, ItemSchema, ItemCreate, \ + AddressOut, AddressSchema + products_controller = Router(tags=['products']) address_controller = Router(tags=['addresses']) vendor_controller = Router(tags=['vendors']) order_controller = Router(tags=['orders']) -Address_controller = Router(tags=['ADDRESS']) +ADDRESS_controller = Router(tags=['Address']) + @vendor_controller.get('', response=List[VendorOut]) def list_vendors(request): @@ -220,77 +225,86 @@ def delete_item(request, id: UUID4): return 204, {'detail': 'Item deleted!'} -@Address_controller.get('address', response={ + +'''def generate_ref_code(): + return ''.join(random.sample(string.ascii_letters + string.digits, 6))''' + + +@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'} + + +@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!'} + + +@ADDRESS_controller.get('Address', response={ 200: List[AddressOut], 404: MessageOut }) -def list_address(request): +def list_cities(request): address_qs = Address.objects.all() + if address_qs: return address_qs - return 404, {'detail': 'No cities found'} + return 404, {'detail': 'No cities found'} -@Address_controller.get('address/{id}', response={ - 200: AddressOut, - 404: MessageOut +@ADDRESS_controller.post('create address', response={ + 200: List[AddressOut], + 400: MessageOut }) -def retrieve_city(request, id: UUID4): - return get_object_or_404(City, id=id) - +def create_address(request, address_in: AddressSchema): + address = Address.objects.create(**address_in.dict()) + address.save() + return 200 -@Address_controller.post('address', response={ - 201: AddressOut, +@ADDRESS_controller.put('address/{id}', response={ + 200: AddressOut, 400: MessageOut }) -def create_city(request, address_in: AddressSchema): - address = Address(**address_in.dict()) - address.save() - return 201, address +def update_address(request, id: UUID4, address_in: AddressSchema): + address = get_object_or_404(Address, id=id) + address .address1 = address .address1 + address.address2 = address.address2 + address.phone = address.phone + address .save() + return 200, address -@Address_controller.delete('address/{id}', response={ +@ADDRESS_controller.delete('address/{id}', response={ 204: MessageOut }) -def delete_city(request, id: UUID4): +def delete_address(request, id: UUID4): address = get_object_or_404(Address, id=id) address.delete() return 204, {'detail': ''} - -@address_controller.put('cities/{id}', response={ - 200: CitiesOut, - 400: MessageOut -}) -def update_address(request, id: UUID4, address_in: AddressSchema): - address = get_object_or_404(City, id=id) - address.address1 = address_in.address1 - address.address2 = address_in.address2 - address.phone = address_in.phone - address.save() - return 200, address - - -def generate_ref_code(): - return ''.join(random.sample(string.ascii_letters + string.digits, 6)) - - -@order_controller.post('create-order') -def crate_order(request): - order_qs = Order( - user=User.objects.first(), - stats=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.addend() - order_qs.total = order_qs.order_total - order_qs.save() - return {'detail': 'order create successfully'} - @order_controller.post('CheckOut', response={ 201: AddressOut, 400: MessageOut diff --git a/commerce/schemas.py b/commerce/schemas.py index 09fdb18..c727602 100644 --- a/commerce/schemas.py +++ b/commerce/schemas.py @@ -90,21 +90,22 @@ class ItemCreate(Schema): class ItemOut(UUIDSchema, ItemSchema): pass -class AddressSchema(Schema): - work_address = bool - address1 = str - address2 = str - city = CitiesOut - phone = int - -class AddressCreate(Schema): - work_address = bool - address1 = str - address2 = str - city = CitiesOut - phone = int +class AddressSchema(Schema): + work_address : bool + address1 : str + address2 : str + phone : int + city: CitySchema class AddressOut(UUIDSchema, AddressSchema): - pass + work_address : bool = False + address1 : str + address2 : str = None + phone : int + city : CitiesOut + +'''class OrderCreate(Schema): + user_id: UUID4 + status: str''' diff --git a/config/urls.py b/config/urls.py index 4152a25..cb626e6 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, \ + ADDRESS_controller from config import settings api = NinjaAPI() @@ -27,7 +28,7 @@ api.add_router('addresses', address_controller) api.add_router('vendors', vendor_controller) api.add_router('orders', order_controller) -api.add_router('ADDRESS',Address_controller) +api.add_router('orders', ADDRESS_controller) urlpatterns = [ path('admin/', admin.site.urls), path('api/', api.urls),