Skip to content

Commit b0d4355

Browse files
committed
feat(apps): add missing filters
1 parent f567b52 commit b0d4355

File tree

10 files changed

+209
-17
lines changed

10 files changed

+209
-17
lines changed

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ pip install -r requirements/local.txt
6060
Create an environment variable file .env or use `.env.template` file.
6161

6262
```bash
63-
SECRET_KEY=""
64-
EMAIL_BACKEND=""
65-
EMAIL_HOST=""
66-
EMAIL_HOST_USER=""
67-
EMAIL_HOST_PASSWORD=""
68-
EMAIL_PORT=""
69-
EMAIL_USE_TLS=""
63+
SECRET_KEY=
64+
EMAIL_BACKEND=
65+
EMAIL_HOST=
66+
EMAIL_HOST_USER=
67+
EMAIL_HOST_PASSWORD=
68+
EMAIL_PORT=
69+
EMAIL_USE_TLS=
7070
```
7171

7272
Docker run.

apps/drivers/filters.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"""Filters for Drivers App."""
2+
3+
from django_filters import rest_framework as filters
4+
5+
from .models import Driver
6+
from .choices import VehicleChoices, StatusChoices
7+
8+
9+
class DriverFilter(filters.FilterSet):
10+
"""Filter for Driver model."""
11+
12+
vehicle_type = filters.ChoiceFilter(
13+
field_name="vehicle_type",
14+
choices=VehicleChoices.choices,
15+
label="Filter by vehicle type, ex `/?vehicle_type=automobile`",
16+
)
17+
status = filters.ChoiceFilter(
18+
field_name="status",
19+
choices=StatusChoices.choices,
20+
label="Filter by driver status, ex `/?status=silver`",
21+
)
22+
is_verified = filters.BooleanFilter(
23+
field_name="is_verified",
24+
label="Filter by verified availability, ex `/?is_verified=true`",
25+
)
26+
is_active = filters.BooleanFilter(
27+
field_name="is_active",
28+
label="Filter by active availability, ex `/?is_active=true`",
29+
)
30+
31+
class Meta:
32+
model = Driver
33+
fields = [
34+
"vehicle_type",
35+
"status",
36+
"is_verified",
37+
"is_active",
38+
]

apps/drivers/viewsets.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
ResourceReadSerializer,
2424
ResourceWriteSerializer,
2525
)
26+
from .filters import DriverFilter
2627
from .schemas import driver_schemas
2728

2829

@@ -43,7 +44,7 @@ class DriverViewSet(ListCacheMixin, LogicalDeleteMixin, ModelViewSet):
4344
permission_classes = [IsSupport, IsOwner]
4445
serializer_class = DriverWriteSerializer
4546
search_fields = ["user_id"]
46-
# filterset_class = DriverFilter
47+
filterset_class = DriverFilter
4748

4849
def get_queryset(self):
4950
if self.action == "list":

apps/orders/filters.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
"""Filters for Orders App."""
2+
3+
from django_filters import rest_framework as filters
4+
5+
from .models import Order
6+
from .choices import OrderStatusChoices, PaymentMethodChoices
7+
8+
9+
class OrderFilter(filters.FilterSet):
10+
"""Filter for Order model."""
11+
12+
status = filters.ChoiceFilter(
13+
field_name="status",
14+
choices=OrderStatusChoices.choices,
15+
label="Filter by order status, ex `/?status=not_processed`",
16+
)
17+
payment_method = filters.ChoiceFilter(
18+
field_name="payment_method",
19+
choices=PaymentMethodChoices.choices,
20+
label="Filter by payment method, ex `/?payment_method=credit_card`",
21+
)
22+
is_payment = filters.BooleanFilter(
23+
field_name="is_payment",
24+
label="Filter by payment status, ex `/?is_payment=true`",
25+
)
26+
is_valid = filters.BooleanFilter(
27+
field_name="is_valid",
28+
label="Filter by validation status, ex `/?is_valid=true`",
29+
)
30+
ordering = filters.OrderingFilter(
31+
fields=(
32+
("created_at", "newest"),
33+
("created_at", "oldest"),
34+
("amount", "highest_amount"),
35+
("amount", "lowest_amount"),
36+
),
37+
field_labels={
38+
"created_at": "Newest",
39+
"-created_at": "Oldest",
40+
"amount": "Highest Amount",
41+
"-amount": "Lowest Amount",
42+
},
43+
label="Order by Newest Oldest, Highest Amount, Lowest Amount, ex `/?ordering=newest`",
44+
)
45+
46+
class Meta:
47+
model = Order
48+
fields = [
49+
"status",
50+
"payment_method",
51+
"is_payment",
52+
"is_valid",
53+
"ordering",
54+
]
55+
56+
57+
class UserOrderFilter(filters.FilterSet):
58+
"""Filter for Order model (For Users)."""
59+
60+
is_payment = filters.BooleanFilter(
61+
field_name="is_payment",
62+
label="Filter by payment status, ex `/?is_payment=true`",
63+
)
64+
ordering = filters.OrderingFilter(
65+
fields=(
66+
("created_at", "newest"),
67+
("created_at", "oldest"),
68+
),
69+
field_labels={
70+
"created_at": "Newest",
71+
"-created_at": "Oldest",
72+
},
73+
label="Order by Newest or Oldest, ex `/?ordering=newest`",
74+
)
75+
76+
class Meta:
77+
model = Order
78+
fields = [
79+
"is_payment",
80+
"ordering",
81+
]

apps/orders/viewsets.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
OrderReportWriteSerializer,
2828
OrderRatingWriteSerializer,
2929
)
30+
from .filters import OrderFilter
3031
from .schemas import order_schemas, order_item_schemas
3132

3233

@@ -47,7 +48,7 @@ class OrderViewSet(ListCacheMixin, LogicalDeleteMixin, ModelViewSet):
4748
permission_classes = [IsClient, IsOwner]
4849
serializer_class = OrderWriteSerializer
4950
search_fields = ["transaction", "shipping_name"]
50-
# filterset_class = OrderFilter
51+
filterset_class = OrderFilter
5152

5253
def get_queryset(self):
5354
if getattr(self, "swagger_fake_view", False):
@@ -274,7 +275,6 @@ class OrderItemViewSet(ModelViewSet):
274275
serializer_class = OrderItemWriteSerializer
275276
search_fields = ["food_id"]
276277
pagination_class = None
277-
# filterset_class = OrderItemFilter
278278

279279
def get_queryset(self):
280280
if getattr(self, "swagger_fake_view", False):

apps/restaurants/filters.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from django_filters import rest_framework as filters
44

55
from apps.utilities.filters import BaseFilter
6-
from .models import Restaurant
6+
from .models import Restaurant, Category, Food
77
from .choices import SpecialtyChoices
88

99

@@ -46,3 +46,36 @@ class Meta:
4646
"is_verified",
4747
"is_open",
4848
]
49+
50+
51+
class FoodFilter(filters.FilterSet):
52+
"""Filter for Food model."""
53+
54+
min_price = filters.NumberFilter(
55+
field_name="price",
56+
lookup_expr="gte",
57+
label="Filter by minimum price, ex `/?min_price=10.00`",
58+
)
59+
max_price = filters.NumberFilter(
60+
field_name="price",
61+
lookup_expr="lte",
62+
label="Filter by maximum price, ex `/?max_price=50.00`",
63+
)
64+
is_featured = filters.BooleanFilter(
65+
field_name="is_featured",
66+
label="Filter by featured status, ex `/?is_featured=True`",
67+
)
68+
category = filters.ModelChoiceFilter(
69+
queryset=Category.objects.get_available(),
70+
field_name="category_id",
71+
label="Filter by category, ex `/?category=1`",
72+
)
73+
74+
class Meta:
75+
model = Food
76+
fields = [
77+
"min_price",
78+
"max_price",
79+
"is_featured",
80+
"category",
81+
]

apps/restaurants/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def __str__(self):
8787

8888

8989
class Food(BaseModel):
90-
"""Model definition for Food (Entity)."""
90+
"""Model definition for Food."""
9191

9292
name = models.CharField(max_length=255)
9393
description = models.TextField(blank=True)

apps/restaurants/viewsets.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from apps.orders.serializers import OrderReadSerializer
1919
from apps.reviews.models import Review
2020
from apps.reviews.serializers import ReviewReadSerializer, ReviewWriteSerializer
21+
from apps.reviews.filters import ReviewFilter
2122
from .models import Restaurant, Category, Food
2223
from .serializers import (
2324
RestaurantReadSerializer,
@@ -30,7 +31,7 @@
3031
FoodWriteSerializer,
3132
FoodMinimalSerializer,
3233
)
33-
from .filters import RestaurantFilter
34+
from .filters import RestaurantFilter, FoodFilter
3435
from .schemas import (
3536
restaurant_schemas,
3637
category_schemas,
@@ -227,7 +228,7 @@ class FoodViewSet(ModelViewSet):
227228
permission_classes = [IsPartner]
228229
serializer_class = FoodWriteSerializer
229230
search_fields = ["name"]
230-
# Filterset_class = FoodFilter
231+
filterset_class = FoodFilter
231232

232233
def get_queryset(self):
233234
if getattr(self, "swagger_fake_view", False):
@@ -321,7 +322,7 @@ class RestaurantReviewViewSet(ModelViewSet):
321322
permission_classes = [IsClient]
322323
serializer_class = ReviewWriteSerializer
323324
search_fields = ["user_id"]
324-
# Filterset_class = ReviewFilter
325+
filterset_class = ReviewFilter
325326

326327
def get_queryset(self):
327328
if getattr(self, "swagger_fake_view", False):

apps/reviews/filters.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
"""Filters for Reviews App."""
2+
3+
from django_filters import rest_framework as filters
4+
5+
from .models import Review
6+
7+
8+
class ReviewFilter(filters.FilterSet):
9+
"""Filter for Review model."""
10+
11+
# ! TODO: Review and perform exhaustive testing
12+
13+
rating = filters.NumberFilter(
14+
field_name="rating",
15+
label="Filter by exact rating, ex `/?rating=4`",
16+
)
17+
ordering = filters.OrderingFilter(
18+
fields=(
19+
("rating", "best"),
20+
("created_at", "newest"),
21+
("created_at", "oldest"),
22+
),
23+
field_labels={
24+
"rating": "Best",
25+
"created_at": "Newest",
26+
"-created_at": "Oldest",
27+
},
28+
label="Order by Best, Newest, Oldest, ex `/?ordering=best`",
29+
)
30+
31+
class Meta:
32+
model = Review
33+
fields = [
34+
"rating",
35+
"ordering",
36+
]

apps/users/views.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
from apps.users.serializers import UserHistorySerializer
1818
from apps.reviews.models import Review
1919
from apps.reviews.serializers import ReviewReadSerializer
20+
from apps.reviews.filters import ReviewFilter
2021
from apps.orders.models import Order, OrderReport
2122
from apps.orders.serializers import OrderReadSerializer, OrderReportReadSerializer
23+
from apps.orders.filters import UserOrderFilter
2224
from .schemas import (
2325
token_obtain_pair_schemas,
2426
token_refresh_schemas,
@@ -90,7 +92,7 @@ class UserReviewsView(ListAPIView):
9092

9193
permission_class = [IsClient]
9294
serializer_class = ReviewReadSerializer
93-
# filterset_class = ReviewFilter
95+
filterset_class = ReviewFilter
9496

9597
def get_queryset(self):
9698
if getattr(self, "swagger_fake_view", False):
@@ -109,7 +111,7 @@ class UserOrdersView(ListAPIView):
109111

110112
permission_class = [IsClient]
111113
serializer_class = OrderReadSerializer
112-
# filterset_class = OrderFilter
114+
filterset_class = UserOrderFilter
113115

114116
def get_queryset(self):
115117
if getattr(self, "swagger_fake_view", False):

0 commit comments

Comments
 (0)