From 67667fb4bd59611dad8f14bb92e2dfdeb97454b2 Mon Sep 17 00:00:00 2001 From: Douha Hasoon Date: Tue, 9 Nov 2021 03:34:51 +0300 Subject: [PATCH] douha --- account/controllers.py | 10 +- account/migrations/0002_alter_user_options.py | 17 ++ commerce/controllers.py | 161 +++++++++++++++--- commerce/schemas.py | 31 +++- config/urls.py | 8 +- 5 files changed, 195 insertions(+), 32 deletions(-) create mode 100644 account/migrations/0002_alter_user_options.py diff --git a/account/controllers.py b/account/controllers.py index b32b209..7fe2b52 100644 --- a/account/controllers.py +++ b/account/controllers.py @@ -11,7 +11,7 @@ account_controller = Router(tags=['auth']) -@account_controller.post('signup', response={ +@account_controller.post('signup',auth=None, response={ 400: MessageOut, 201: AuthOut, }) @@ -39,7 +39,7 @@ def signup(request, account_in: AccountCreate): return 400, {'detail': 'User already registered!'} -@account_controller.post('signin', response={ +@account_controller.post('signin',auth=None, response={ 200: AuthOut, 404: MessageOut, }) @@ -57,12 +57,12 @@ def signin(request, signin_in: SigninSchema): } -@account_controller.get('', auth=GlobalAuth(), response=AccountOut) +@account_controller.get('', response=AccountOut) def me(request): return get_object_or_404(User, id=request.auth['pk']) -@account_controller.put('', auth=GlobalAuth(), response={ +@account_controller.put('', response={ 200: AccountOut, }) @@ -71,7 +71,7 @@ def update_account(request, update_in: AccountUpdate): return get_object_or_404(User, id=request.auth['pk']) -@account_controller.post('change-password', auth=GlobalAuth(), response={ +@account_controller.post('change-password', response={ 200: MessageOut, 400: MessageOut }) diff --git a/account/migrations/0002_alter_user_options.py b/account/migrations/0002_alter_user_options.py new file mode 100644 index 0000000..a29308c --- /dev/null +++ b/account/migrations/0002_alter_user_options.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.8 on 2021-11-06 01:28 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='user', + options={'verbose_name': 'user', 'verbose_name_plural': 'users'}, + ), + ] diff --git a/commerce/controllers.py b/commerce/controllers.py index a8a551a..4d16f55 100644 --- a/commerce/controllers.py +++ b/commerce/controllers.py @@ -7,25 +7,34 @@ from django.shortcuts import get_object_or_404 from ninja import Router from pydantic import UUID4 - +from ninja import NinjaAPI from account.authorization import GlobalAuth -from commerce.models import Product, Category, City, Vendor, Item, Order, OrderStatus -from commerce.schemas import ProductOut, CitiesOut, CitySchema, VendorOut, ItemOut, ItemSchema, ItemCreate +from commerce.models import Product, Category, City, Vendor, Item, Order, OrderStatus,Address +from commerce.schemas import (MessageOut, ProductOut, CitiesOut, + CitySchema, VendorOut, ItemOut, + ItemSchema, ItemCreate, Add_address, AddressSchema,AddressOut,OrderSchema) from config.utils.schemas import MessageOut + + +api = NinjaAPI(auth=GlobalAuth()) + products_controller = Router(tags=['products']) address_controller = Router(tags=['addresses']) vendor_controller = Router(tags=['vendors']) order_controller = Router(tags=['orders']) +city_controller = Router(tags=['City']) +checkout_controller = Router(tags=['checkout']) + User = get_user_model() -@vendor_controller.get('', response=List[VendorOut]) +@vendor_controller.get('',auth=None, response=List[VendorOut]) def list_vendors(request): return Vendor.objects.all() -@products_controller.get('', response={ +@products_controller.get('',auth=None, response={ 200: List[ProductOut], 404: MessageOut }) @@ -114,7 +123,7 @@ def list_products( """ -@address_controller.get('') +@city_controller.get('',auth=None) def list_addresses(request): pass @@ -124,7 +133,7 @@ def list_addresses(request): # return Category.objects.all() -@address_controller.get('cities', response={ +@city_controller.get('cities',auth=None, response={ 200: List[CitiesOut], 404: MessageOut }) @@ -137,7 +146,8 @@ def list_cities(request): return 404, {'detail': 'No cities found'} -@address_controller.get('cities/{id}', response={ + +@city_controller.get('cities/{id}',auth=None, response={ 200: CitiesOut, 404: MessageOut }) @@ -145,7 +155,8 @@ def retrieve_city(request, id: UUID4): return get_object_or_404(City, id=id) -@address_controller.post('cities', response={ + +@city_controller.post('cities', response={ 201: CitiesOut, 400: MessageOut }) @@ -155,7 +166,7 @@ def create_city(request, city_in: CitySchema): return 201, city -@address_controller.put('cities/{id}', response={ +@city_controller.put('cities/{id}',response={ 200: CitiesOut, 400: MessageOut }) @@ -166,7 +177,7 @@ def update_city(request, id: UUID4, city_in: CitySchema): return 200, city -@address_controller.delete('cities/{id}', response={ +@city_controller.delete('cities/{id}', response={ 204: MessageOut }) def delete_city(request, id: UUID4): @@ -175,12 +186,17 @@ def delete_city(request, id: UUID4): return 204, {'detail': ''} + +#--------------------------------- Order -------------------------------- +#------------------------------------------------------------------------ + + @order_controller.get('cart', 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 +204,29 @@ def view_cart(request): return 404, {'detail': 'Your cart is empty, go shop like crazy!'} + @order_controller.post('add-to-cart', 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={ 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!'} @@ -221,7 +240,7 @@ def reduce_item_quantity(request, id: UUID4): 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!'} @@ -231,7 +250,7 @@ def generate_ref_code(): return ''.join(random.sample(string.ascii_letters + string.digits, 6)) -@order_controller.post('create-order', auth=GlobalAuth(), response=MessageOut) +@order_controller.post('create-order',auth=None, response=MessageOut) def create_order(request): ''' * add items and mark (ordered) field as True @@ -239,19 +258,119 @@ def create_order(request): * add NEW status * calculate the total ''' - - order_qs = Order.objects.create( - user=User.objects.first(), + + order_qs = Order( + user=request.auth['pk'], 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) + user_items = Item.objects.filter(user=request.auth['pk'], ordered=False) + user_items.update(ordered=True) + + 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'} + + + #--------------------------- Addresses ----------------------------- + #------------------------------------------------------------------- + + +@address_controller.get('address',auth=None, 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('address/{id}',auth=None, response={ + 200: AddressOut, + 404: MessageOut +}) +def retrieve_address(request, id: UUID4): + return get_object_or_404(Address, id=id) + + +@address_controller.post('', response={ + 201: AddressOut, + 400: MessageOut +}) +def create_address(request, address_in: Add_address): + city_instance = City.objects.get(id=address_in.city) + del address_in.city + address = Address.objects.create(**address_in.dict(), city=city_instance, user=request.auth['pk']) + address.save() + return 201, address + + +@address_controller.put('/{id}', response={ + 200: AddressOut, + 404: MessageOut +}) +def update_address(request, id: UUID4, new_data:Add_address): + address = get_object_or_404(Address, id=id) + city_instance = City.objects.get(id=new_data.city) + new_data.city = city_instance + for attr, value in new_data.dict().items(): + setattr(address, attr, value) + address.save() + return 200, address + + +@address_controller.delete('addresses/{id}', response={ + 204: MessageOut +}) +def delete_address(request, id: UUID4): + city = get_object_or_404(Address, id=id) + city.delete() + return 204, {'detail': ''} + + +##--------------------------- checkOut -------------------------------- +##--------------------------------------------------------------------- + + +@checkout_controller.post('create-checkout', response= +{ 200: MessageOut}) + +def create_checkout(request,order_in:OrderSchema,note:str=None): + ''' + * create the checkout endpoint + * you should be able to add an optional note + * you should be able to add an address to the order + * set (ordered field) to True, thus the order becomes sealed + * change order status accordingly + + ''' + + if get_object_or_404(City): + check_order=Order( + user=request.auth['pk'], + status=OrderStatus.objects.get(title='SHIPPED'), + + + ) + + check_order.note=note + check_order.ordered=True + check_order.address=Address.objects.get(id=order_in.address) + check_order.save() + return {'detail': ' checkout created successfully'} + else: + return MessageOut + + \ No newline at end of file diff --git a/commerce/schemas.py b/commerce/schemas.py index 5d68396..9f8108b 100644 --- a/commerce/schemas.py +++ b/commerce/schemas.py @@ -4,10 +4,11 @@ from ninja.orm import create_schema from pydantic import UUID4 -from commerce.models import Product, Merchant - +from commerce.models import Product, Merchant,Address,Order +class MessageOut(Schema): + detail: str class UUIDSchema(Schema): @@ -15,7 +16,7 @@ class UUIDSchema(Schema): # ProductSchemaOut = create_schema(Product, depth=2) - +##orderSchemaOut= create_schema(Order,depth=2,fields=['user', 'address','note','items']) class VendorOut(UUIDSchema): name: str image: str @@ -91,3 +92,27 @@ class ItemOut(UUIDSchema, ItemSchema): pass +##--------------------- + +class AddressSchema(Schema): + + address1: str + + + +class Add_address(Schema): + work_address: bool + address1: str + address2: str + city: UUID4 + phone: str + + + +class AddressOut(AddressSchema, UUIDSchema): + pass + + + +class OrderSchema(Schema): + address:UUID4 diff --git a/config/urls.py b/config/urls.py index 3851026..3f0cb71 100644 --- a/config/urls.py +++ b/config/urls.py @@ -18,18 +18,20 @@ from django.urls import path from ninja import NinjaAPI +from account.authorization import GlobalAuth 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,city_controller from config import settings -api = NinjaAPI() +api = NinjaAPI(auth=GlobalAuth()) api.add_router('products', products_controller) api.add_router('addresses', address_controller) api.add_router('vendors', vendor_controller) api.add_router('orders', order_controller) api.add_router('auth', account_controller) - +api.add_router('city', city_controller) +api.add_router('checkout', checkout_controller) urlpatterns = [ path('admin/', admin.site.urls), path('api/', api.urls),