Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

176 changes: 110 additions & 66 deletions commerce/controllers.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
from typing import List
import random
import string

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 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'])
Expand Down Expand Up @@ -53,74 +57,52 @@ 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, ...]
.
.
.
@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, {'detail': 'error'}

select * from merchant where id in (mids) * 4 for (label, category and vendor)

4+1
@address_controller.get('address/{id}', response={
200: AddressSchemaOut,
404: MessageOut
})
def address(request, id: UUID4):
return get_object_or_404(Address, id=id)

"""
@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):
Expand All @@ -133,28 +115,40 @@ def list_cities(request):


@address_controller.get('cities/{id}', response={
200: CitiesOut,
200: CityOut,
404: MessageOut
})
def retrieve_city(request, id: UUID4):
return get_object_or_404(City, id=id)


@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()
Expand All @@ -167,7 +161,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={
Expand Down Expand Up @@ -212,6 +206,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
})
Expand All @@ -220,3 +225,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 '}
61 changes: 53 additions & 8 deletions commerce/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -15,7 +15,6 @@ class UUIDSchema(Schema):
id: UUID4


# ProductSchemaOut = create_schema(Product, depth=2)

class VendorOut(UUIDSchema):
name: str
Expand Down Expand Up @@ -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:
Expand All @@ -90,3 +131,7 @@ class ItemCreate(Schema):

class ItemOut(UUIDSchema, ItemSchema):
pass

class CheckoutSchema(Schema):
note: str =None
addresss: UUID4