Skip to content

Commit

Permalink
updated shop serializers and order views to reflect associate shops d…
Browse files Browse the repository at this point in the history
…uring creation
  • Loading branch information
miclemabasie committed Feb 29, 2024
1 parent 59e79c4 commit 202b8f4
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 11 deletions.
2 changes: 1 addition & 1 deletion src/apps/orders/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
urlpatterns = [
path("", views.order_list_view, name="order-list"),
path("<str:transaction_id>", views.order_detail_view, name="order-detail"),
path("create/", views.create_order_view, name="order-create"),
path("create/<str:shop_id>", views.create_order_view, name="order-create"),
path("update/<str:transaction_id>/", views.update_order_view, name="order-update"),
path("delete/<str:transaction_id>/", views.delete_order_view, name="order-delete"),
]
38 changes: 31 additions & 7 deletions src/apps/orders/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
from .serializers import OrderItemSerializers, OrderSerializer, OrderCreateSerializer
from django.contrib.auth import get_user_model
from apps.customers.models import Customer

from apps.shop.models import Shop

User = get_user_model()


@api_view(["GET"])
@permission_classes([permissions.IsAuthenticated])
def order_list_view(request):
def order_list_view(request, shop_id):
#
orders = Order.objects.all()
serializer = OrderSerializer(orders, many=True)
Expand All @@ -23,7 +23,7 @@ def order_list_view(request):

@api_view(["GET"])
@permission_classes([permissions.IsAuthenticated])
def order_detail_view(request, transaction_id):
def order_detail_view(request, transaction_id, shop_id):
orders = Order.objects.get(transaction_id=transaction_id)
serializer = OrderSerializer(orders)
print(request.headers)
Expand All @@ -33,7 +33,7 @@ def order_detail_view(request, transaction_id):

@api_view(["GET"])
@permission_classes([permissions.IsAuthenticated])
def orderitem_list_view(request):
def orderitem_list_view(request, shop_id):
#
orders = OrderItem.objects.all()
serializer = OrderItemSerializers(orders, many=True)
Expand All @@ -43,22 +43,39 @@ def orderitem_list_view(request):

@api_view(["POST"])
@permission_classes([permissions.IsAuthenticated])
def create_order_view(request, *a, **kw):
def create_order_view(request, shop_id, *a, **kw):
data = request.data

# extract thet order items from the request
orderitems = data["orderitems"]

# Add some useful data to the response object

meta_data = {}
meta_data["new_customer"] = False

# Get shop which order belongs to ...
shops = Shop.objects.filter(shop_id=shop_id)
if shops.exists() and len(shops) == 1:
shop = shops.first()
else:
return Response({"error": "shop with given ID not found"})

# to be fixed / get a user from the database
user = User.objects.get(username="admin")
# for now, we are just getting the shop owner and assigning the order to him
user = User.objects.filter(shop=shop)
if user.exists():
user = user.first()


# get customer based on id
customer, created = Customer.objects.get_or_create(
name=data["customer"], phone_number=data["phone"]
)
# Check if the the customer was just created or has been in the system
# Then let the shop owner know if this was a new user
# by adding "new_customer" as metadata to the response
# Which could be used to do custome things.
if created:
meta_data["new_customer"] = True

Expand All @@ -67,8 +84,12 @@ def create_order_view(request, *a, **kw):
"customer": customer,
"status": data["status"],
}
order = Order.objects.create(**order_create_data)

# Create a new order for a particular shop in the database
order = Order.objects.create(**order_create_data, shop=shop)

# Add all the order items to the created order
# By attaching the order pkid to every orderitem
for orderitem in orderitems:
orderitem["order"] = order.pkid
orderitem_serializer = OrderItemSerializers(data=orderitem)
Expand All @@ -77,6 +98,9 @@ def create_order_view(request, *a, **kw):
else:
return Response({"error": orderitem_serializer.errors})

# Validate the order instance
# This is done to allow the price transaction inside the save method to now take place
# since all the orderitems have now been added to the created order
order.validated = True
order.save()

Expand Down
5 changes: 5 additions & 0 deletions src/apps/shop/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from apps.common.models import TimeStampedUUIDModel
from django.utils.translation import gettext_lazy as _
import uuid
from django.urls import reverse

User = get_user_model()

Expand All @@ -29,6 +30,10 @@ def save(self, *a, **kw) -> None:
def __str__(self):
return f"Shop-{self.shop_name}"

@property
def get_absolute_url(self):
return reverse('shop:shop-detail', kwargs={'shop_id': self.shop_id})


class StaffMember(TimeStampedUUIDModel):
STAFF_ROLES = (
Expand Down
25 changes: 25 additions & 0 deletions src/apps/shop/serializers.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
from rest_framework import serializers
from .models import Shop
from django.urls import reverse
from django.http import HttpRequest


class ShopListSerializer(serializers.ModelSerializer):
# url = serializers.SerializerMethodField(read_only=True)
url = serializers.HyperlinkedIdentityField(
view_name='shop:shop-detail',
lookup_field='shop_id'
)

place_order_url = serializers.SerializerMethodField(read_only=True)

class Meta:
model = Shop
fields = [
Expand All @@ -13,8 +23,23 @@ class Meta:
"is_verified",
"shop_id",
"logo",
"url",
"place_order_url",
]

def __init__(self, instance=None, data=serializers.empty, context=None, **kwargs):
# Access the request from the context
self.request = context.get('request') if context else None

# Your custom initialization logic here, using the request if needed

super().__init__(instance=instance, data=data, context=context, **kwargs)

def get_place_order_url(self, obj):
relative_path = reverse("orders:order-create", kwargs={"shop_id": obj.shop_id})
full_path = self.request.build_absolute_uri(relative_path)
return full_path

class ShopUpdateSerializer(serializers.ModelSerializer):

class Meta:
Expand Down
5 changes: 2 additions & 3 deletions src/apps/shop/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def list_all_shop_view(request):
"""

queryset = Shop.objects.all()
serializer = ShopListSerializer(queryset, many=True)
serializer = ShopListSerializer(queryset, many=True, context={"request": request})
print("this is a response")

print(serializer.data)
Expand All @@ -25,12 +25,11 @@ def list_all_shop_view(request):


@api_view(["GET"])
@permission_classes([permissions.IsAuthenticated])
def get_shop_detial(request, shop_id):
shop = Shop.objects.filter(shop_id=shop_id)
if shop.exists():
shop_instance = shop.first()
serializer = ShopListSerializer(shop_instance)
serializer = ShopListSerializer(shop_instance, context={"request": request})
return Response(serializer.data, status=status.HTTP_200_OK)
else:
return Response({"error": "Shop not found"}, status=status.HTTP_404_NOT_FOUND)
Expand Down

0 comments on commit 202b8f4

Please sign in to comment.