Skip to content

Commit 6950a48

Browse files
committed
feat(promotions): add fixed and percentage coupon viewsets, update managers and serializers
1 parent cd24a80 commit 6950a48

File tree

4 files changed

+105
-28
lines changed

4 files changed

+105
-28
lines changed

apps/promotions/managers.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
class PromotionManager(BaseManager):
99
"""Manager for Promotion model."""
1010

11+
def get_active(self):
12+
return self.get_available().filter(is_active=True)
13+
1114
def get_search(self, search_term):
1215
return self.get_available().filter(
1316
Q(name__icontains=search_term) | Q(conditions__icontains=search_term)
@@ -17,10 +20,8 @@ def get_search(self, search_term):
1720
class FixedCouponManager(BaseManager):
1821
"""Manager for FixedCoupon model."""
1922

20-
# TODO: fix manager, add new manager
21-
22-
def get_available(self):
23-
return self.filter(available=True, is_active=True)
23+
def get_active(self):
24+
return self.get_available().filter(is_active=True)
2425

2526
def get_by_code(self, code):
2627
return self.get_available().filter(code=code).first()
@@ -29,10 +30,8 @@ def get_by_code(self, code):
2930
class PercentageCouponManager(BaseManager):
3031
"""Manager for PercentageCoupon model."""
3132

32-
# TODO: fix manager, add new manager
33-
34-
def get_available(self):
35-
return self.filter(available=True, is_active=True)
33+
def get_active(self):
34+
return self.get_available().filter(is_active=True)
3635

3736
def get_by_code(self, code):
3837
return self.get_available().filter(code=code).first()

apps/promotions/serializers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class PromotionReadSerializer(ModelSerializer):
1515
class Meta:
1616
model = Promotion
1717
fields = "__all__"
18+
read_only_fields = fields
1819

1920
def to_representation(self, instance):
2021
data = super().to_representation(instance)
@@ -64,6 +65,7 @@ class FixedCouponReadSerializer(ModelSerializer):
6465
class Meta:
6566
model = FixedCoupon
6667
fields = "__all__"
68+
read_only_fields = fields
6769

6870

6971
class FixedCouponWriteSerializer(ModelSerializer):
@@ -91,6 +93,7 @@ class PercentageCouponReadSerializer(ModelSerializer):
9193
class Meta:
9294
model = PercentageCoupon
9395
fields = "__all__"
96+
read_only_fields = fields
9497

9598

9699
class PercentageCouponWriteSerializer(ModelSerializer):

apps/promotions/viewsets.py

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,15 @@
44

55
from apps.users.permissions import IsMarketing
66
from apps.utilities.mixins import ListCacheMixin, LogicalDeleteMixin
7-
from .models import Promotion
8-
from .serializers import PromotionReadSerializer, PromotionWriteSerializer
7+
from .models import Promotion, FixedCoupon, PercentageCoupon
8+
from .serializers import (
9+
PromotionReadSerializer,
10+
PromotionWriteSerializer,
11+
FixedCouponReadSerializer,
12+
FixedCouponWriteSerializer,
13+
PercentageCouponReadSerializer,
14+
PercentageCouponWriteSerializer,
15+
)
916

1017

1118
class PromotionViewSet(ListCacheMixin, LogicalDeleteMixin, ModelViewSet):
@@ -27,9 +34,72 @@ class PromotionViewSet(ListCacheMixin, LogicalDeleteMixin, ModelViewSet):
2734
# filterset_class = PromotionFilter
2835

2936
def get_queryset(self):
30-
return Promotion.objects.get_available()
37+
return Promotion.objects.get_active()
3138

3239
def get_serializer_class(self):
3340
if self.action in ["list", "retrieve"]:
3441
return PromotionReadSerializer
3542
return super().get_serializer_class()
43+
44+
def perform_create(self, serializer):
45+
serializer.save(creator=self.request.user)
46+
47+
48+
class FixedCoponViewSet(ListCacheMixin, LogicalDeleteMixin, ModelViewSet):
49+
"""
50+
ViewSet for managing FixedCoupon instances.
51+
52+
Endpoints:
53+
- GET /api/v1/fixed-coupon/
54+
- POST /api/v1/fixed-coupon/
55+
- GET /api/v1/fixed-coupon/{id}/
56+
- PUT /api/v1/fixed-coupon/{id}/
57+
- PATCH /api/v1/fixed-coupon/{id}/
58+
- DELETE /api/v1/fixed-coupon/{id}/
59+
"""
60+
61+
permission_classes = [IsMarketing]
62+
serializer_class = FixedCouponWriteSerializer
63+
search_fields = ["name"]
64+
# filterset_class = FixedCouponFilter
65+
66+
def get_queryset(self):
67+
return FixedCoupon.objects.get_active()
68+
69+
def get_serializer_class(self):
70+
if self.action in ["list", "retrieve"]:
71+
return FixedCouponReadSerializer
72+
return super().get_serializer_class()
73+
74+
def perform_create(self, serializer):
75+
serializer.save(creator=self.request.user)
76+
77+
78+
class PercentageCoponViewSet(ListCacheMixin, LogicalDeleteMixin, ModelViewSet):
79+
"""
80+
ViewSet for managing FixedCoupon instances.
81+
82+
Endpoints:
83+
- GET /api/v1/percentage-coupons/
84+
- POST /api/v1/percentage-coupons/
85+
- GET /api/v1/percentage-coupons/{id}/
86+
- PUT /api/v1/percentage-coupons/{id}/
87+
- PATCH /api/v1/percentage-coupons/{id}/
88+
- DELETE /api/v1/percentage-coupons/{id}/
89+
"""
90+
91+
permission_classes = [IsMarketing]
92+
serializer_class = PercentageCouponWriteSerializer
93+
search_fields = ["name"]
94+
# filterset_class = FixedCouponFilter
95+
96+
def get_queryset(self):
97+
return PercentageCoupon.objects.get_active()
98+
99+
def get_serializer_class(self):
100+
if self.action in ["list", "retrieve"]:
101+
return PercentageCouponReadSerializer
102+
return super().get_serializer_class()
103+
104+
def perform_create(self, serializer):
105+
serializer.save(creator=self.request.user)

roadmap.md

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,30 @@ Pending implementation
3838

3939
## Promotions [OK]
4040

41-
- [ ] `GET /promotions/` Obtener una lista de todas las promociones disponibles (IsMarketing).
42-
- [ ] `POST /promotions/` Crear una nueva promoción (IsMarketing).
43-
- [ ] `GET /promotions/{id}/` Obtener los detalles de una promoción específica (IsMarketing).
44-
- [ ] `PUT /promotions/{id}/` Actualizar todos los detalles de una promoción específica (IsMarketing).
45-
- [ ] `PATCH /promotions/{id}/` Actualizar parcialmente una promoción específica (IsMarketing).
46-
- [ ] `DELETE /promotions/{id}/` Eliminar una promoción específica (IsMarketing).
41+
- [x] `GET /promotions/` Obtener una lista de todas las promociones disponibles (IsMarketing).
42+
- [x] `POST /promotions/` Crear una nueva promoción (IsMarketing).
43+
- [x] `GET /promotions/{id}/` Obtener los detalles de una promoción específica (IsMarketing).
44+
- [x] `PUT /promotions/{id}/` Actualizar todos los detalles de una promoción específica (IsMarketing).
45+
- [x] `PATCH /promotions/{id}/` Actualizar parcialmente una promoción específica (IsMarketing).
46+
- [x] `DELETE /promotions/{id}/` Eliminar una promoción específica (IsMarketing).
47+
48+
- [x] `GET /fixed-coupons/`
49+
- [x] `POST /fixed-coupons/`
50+
- [x] `GET /fixed-coupons/{id}/`
51+
- [x] `PUT /fixed-coupons/{id}/`
52+
- [x] `PATCH /fixed-coupons/{id}/`
53+
- [x] `DELETE /fixed-coupons/{id}/`
54+
55+
- [x] `GET /percentage-coupons/`
56+
- [x] `POST /percentage-coupons/`
57+
- [x] `GET /percentage-coupons/{id}/`
58+
- [x] `PUT /percentage-coupons/{id}/`
59+
- [x] `PATCH /percentage-coupons/{id}/`
60+
- [x] `DELETE /percentage-coupons/{id}/`
4761

4862
## Deliveries
4963

50-
- [ ] `GET /deliveries/`
64+
<!-- - [ ] `GET /deliveries/`
5165
- [ ] `POST /deliveries/`
5266
- [ ] `GET /deliveries/{id}/`
5367
- [ ] `PUT /deliveries/{id}/`
@@ -56,16 +70,7 @@ Pending implementation
5670
- [ ] `POST /orders/{order_id}/deliveries/`
5771
- [ ] `GET /orders/{order_id}/deliveries/{delivery_id}/`
5872
- [ ] `PUT /orders/{order_id}/deliveries/{delivery_id}/`
59-
- [ ] `DELETE /orders/{order_id}/deliveries/{delivery_id}/`
60-
61-
## Coupons
62-
63-
- [ ] `GET /coupons/`
64-
- [ ] `POST /coupons/`
65-
- [ ] `GET /coupons/{id}/`
66-
- [ ] `PUT /coupons/{id}/`
67-
- [ ] `DELETE /coupons/{id}/`
68-
- [ ] `GET /coupons/{coupon_id}/orders/`
73+
- [ ] `DELETE /orders/{order_id}/deliveries/{delivery_id}/` -->
6974

7075
## Restaurants [OK]
7176

0 commit comments

Comments
 (0)