Skip to content

Commit a052e71

Browse files
committed
refactor(orders): update viewsets, serializers, managers for order model
1 parent c2f424e commit a052e71

File tree

6 files changed

+59
-84
lines changed

6 files changed

+59
-84
lines changed

apps/orders/managers.py

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,41 @@
66
class OrderManager(BaseManager):
77
"""Manager for Order Model."""
88

9+
def get_list_by_user(self, user):
10+
return (
11+
self.get_available()
12+
.filter(user_id=user)
13+
.select_related(
14+
"restaurant_id",
15+
)
16+
.only(
17+
"id",
18+
"shipping_name",
19+
"transaction",
20+
"restaurant_id",
21+
"amount",
22+
"status",
23+
"updated_at",
24+
"created_at",
25+
)
26+
)
27+
28+
def get_detail_by_user(self, user):
29+
return (
30+
self.get_available()
31+
.filter(user_id=user)
32+
.select_related(
33+
"user_id",
34+
"city_id",
35+
"state_id",
36+
"country_id",
37+
"restaurant_id",
38+
)
39+
)
40+
941
def get_by_status(self, status):
10-
"""Get orders by status"""
1142
return self.get_available().filter(status=status)
1243

13-
def get_by_user(self, user):
14-
"""Get orders by status"""
15-
return self.get_available().filter(user_id=user)
16-
1744

1845
class OrderItemManager(BaseManager):
1946
"""Manager for OrderItem Model."""

apps/orders/models.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ def __str__(self):
6161
return str(f"{self.shipping_name} - {self.transaction}")
6262

6363
def save(self, *args, **kwargs):
64-
# Apply methods on save
6564
self.set_transaction()
6665
super().save(*args, **kwargs)
6766

apps/orders/serializers.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,22 @@
33
from rest_framework import serializers
44

55
from apps.utilities.mixins import ReadOnlyFieldsMixin
6+
from apps.users.serializers import UserMinimalSerializer
7+
from apps.restaurants.serializers import RestaurantMinimalSerializer
68
from .models import Order, OrderItem
79

8-
# ! TODO: Add extra serializers
9-
1010

1111
class OrderReadSerializer(ReadOnlyFieldsMixin, serializers.ModelSerializer):
1212
"""Serializer for Order model (List/retrieve)."""
1313

14+
user_id = UserMinimalSerializer()
15+
city_id = serializers.StringRelatedField()
16+
state_id = serializers.StringRelatedField()
17+
country_id = serializers.StringRelatedField()
18+
restaurant_id = RestaurantMinimalSerializer()
19+
status = serializers.CharField(source="get_status_display")
20+
payment_method = serializers.CharField(source="get_payment_method_display")
21+
1422
class Meta:
1523
model = Order
1624
fields = [
@@ -56,7 +64,7 @@ class Meta:
5664
"zip_code",
5765
"restaurant_id",
5866
# "amount",
59-
"status",
67+
# "status",
6068
"payment_method",
6169
]
6270

@@ -65,6 +73,7 @@ class OrderMinimalSerializer(ReadOnlyFieldsMixin, serializers.ModelSerializer):
6573
"""Serializer for Order model (Minimal)."""
6674

6775
restaurant_id = serializers.StringRelatedField()
76+
status = serializers.CharField(source="get_status_display")
6877

6978
class Meta:
7079
model = Order

apps/orders/viewsets.py

Lines changed: 4 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
from rest_framework.viewsets import ModelViewSet
44

5-
from apps.users.permissions import IsOperations, IsClient
6-
from apps.users.choices import RoleChoices
5+
from apps.users.permissions import IsOwner, IsClient
76
from apps.utilities.mixins import ListCacheMixin, LogicalDeleteMixin
87
from .models import Order
98
from .serializers import (
@@ -26,81 +25,16 @@ class OrderViewSet(ListCacheMixin, LogicalDeleteMixin, ModelViewSet):
2625
- DELETE /api/v1/orders/{id}/
2726
"""
2827

29-
permission_classes = [IsOperations]
28+
permission_classes = [IsClient, IsOwner]
3029
serializer_class = OrderWriteSerializer
3130
search_fields = ["transaction", "shipping_name"]
3231
# filterset_class = OrderFilter
3332

3433
def get_queryset(self):
3534
user = self.request.user
36-
3735
if self.action == "list":
38-
if user.role in [RoleChoices.OPERATIONS, RoleChoices.ADMINISTRATOR]:
39-
return (
40-
Order.objects.get_available()
41-
.select_related(
42-
"user_id",
43-
"city_id",
44-
"state_id",
45-
"country_id",
46-
"restaurant_id",
47-
)
48-
.only(
49-
"id",
50-
"shipping_name",
51-
"transaction",
52-
"restaurant_id",
53-
"amount",
54-
"status",
55-
"updated_at",
56-
"created_at",
57-
)
58-
)
59-
elif user.role == RoleChoices.CLIENT:
60-
return (
61-
Order.objects.get_available()
62-
.filter(user_id=user)
63-
.select_related(
64-
"user_id",
65-
"city_id",
66-
"state_id",
67-
"country_id",
68-
"restaurant_id",
69-
)
70-
.only(
71-
"id",
72-
"shipping_name",
73-
"transaction",
74-
"restaurant_id",
75-
"amount",
76-
"status",
77-
"updated_at",
78-
"created_at",
79-
)
80-
)
81-
else:
82-
if user.role in [RoleChoices.OPERATIONS, RoleChoices.ADMINISTRATOR]:
83-
return Order.objects.get_available().select_related(
84-
"user_id",
85-
"city_id",
86-
"state_id",
87-
"country_id",
88-
"restaurant_id",
89-
)
90-
elif user.role == RoleChoices.CLIENT:
91-
return (
92-
Order.objects.get_available()
93-
.filter(user_id=user)
94-
.select_related(
95-
"user_id",
96-
"city_id",
97-
"state_id",
98-
"country_id",
99-
"restaurant_id",
100-
)
101-
)
102-
103-
# ! TODO: Add managers
36+
return Order.objects.get_list_by_user(user)
37+
return Order.objects.get_detail_by_user(user)
10438

10539
def get_serializer_class(self):
10640
if self.action == "list":
@@ -109,10 +43,5 @@ def get_serializer_class(self):
10943
return OrderReadSerializer
11044
return super().get_serializer_class()
11145

112-
def get_permissions(self):
113-
if self.action in ["create", "update", "partial_update", "destroy"]:
114-
return [IsClient()] # ! TODO: Add IsOwner and refactor
115-
return super().get_permissions()
116-
11746
def perform_create(self, serializer):
11847
serializer.save(user_id=self.request.user)

apps/users/permissions.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@
55
from .choices import RoleChoices
66

77

8+
class IsOwner(BasePermission):
9+
"""Allows access only allow owners of an object to access it."""
10+
11+
def has_object_permission(self, request, view, obj):
12+
return bool(obj.user_id == request.user)
13+
14+
815
class BaseRolePermission(BasePermission):
916
"""
1017
Base permission class that checks if a user has a specific role.

apps/users/serializers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
class UserReadSerializer:
1313
"""Serializer for User model."""
1414

15+
role = serializers.CharField(source="get_role_display")
16+
1517
class Meta(UserCreateSerializer.Meta):
1618
model = User
1719
fields = [
@@ -46,6 +48,8 @@ class Meta(UserCreateSerializer.Meta):
4648
class UserMinimalSerializer(ReadOnlyFieldsMixin, UserCreateSerializer):
4749
"""Serializer for User model (Minimal)."""
4850

51+
role = serializers.CharField(source="get_role_display")
52+
4953
class Meta(UserCreateSerializer.Meta):
5054
model = User
5155
fields = [

0 commit comments

Comments
 (0)