@@ -62,73 +62,75 @@ class CompanyTokenRefreshView(rest_framework_simplejwt.views.TokenRefreshView):
6262 serializer_class = business .serializers .CompanyTokenRefreshSerializer
6363
6464
65- class PromoCreateView (rest_framework .generics .CreateAPIView ):
65+ class CompanyPromoListCreateView (rest_framework .generics .ListCreateAPIView ):
6666 """
67- View for creating a new promo (POST).
67+ View for listing (GET) and creating (POST) company promos .
6868 """
6969
7070 permission_classes = [
7171 rest_framework .permissions .IsAuthenticated ,
7272 business .permissions .IsCompanyUser ,
7373 ]
74- serializer_class = business .serializers .PromoCreateSerializer
75-
76- def perform_create (self , serializer ):
77- return serializer .save ()
78-
79- def create (self , request , * args , ** kwargs ):
80- serializer = self .get_serializer (data = request .data )
81-
82- serializer .is_valid (raise_exception = True )
83-
84- instance = self .perform_create (serializer )
85-
86- headers = self .get_success_headers (serializer .data )
87-
88- response_data = {'id' : str (instance .id )}
89-
90- return rest_framework .response .Response (
91- response_data ,
92- status = rest_framework .status .HTTP_201_CREATED ,
93- headers = headers ,
94- )
74+ # Pagination is only needed for GET (listing)
75+ pagination_class = business .pagination .CustomLimitOffsetPagination
9576
77+ _validated_query_params = {}
9678
97- class CompanyPromoListView (rest_framework .generics .ListAPIView ):
98- permission_classes = [
99- rest_framework .permissions .IsAuthenticated ,
100- business .permissions .IsCompanyUser ,
101- ]
102- serializer_class = business .serializers .PromoReadOnlySerializer
103- pagination_class = business .pagination .CustomLimitOffsetPagination
79+ def get_serializer_class (self ):
80+ if self .request .method == 'POST' :
81+ return business .serializers .PromoCreateSerializer
10482
105- def initial (self , request , * args , ** kwargs ):
106- super ().initial (request , * args , ** kwargs )
83+ return business .serializers .PromoReadOnlySerializer
10784
108- serializer = business .serializers .PromoListQuerySerializer (
85+ def list (self , request , * args , ** kwargs ):
86+ query_serializer = business .serializers .PromoListQuerySerializer (
10987 data = request .query_params ,
11088 )
111- serializer .is_valid (raise_exception = True )
112- request .validated_query_params = serializer .validated_data
89+ query_serializer .is_valid (raise_exception = True )
90+ self ._validated_query_params = query_serializer .validated_data
91+
92+ return super ().list (request , * args , ** kwargs )
11393
11494 def get_queryset (self ):
115- params = self .request . validated_query_params
95+ params = self ._validated_query_params
11696 countries = [c .upper () for c in params .get ('countries' , [])]
11797 sort_by = params .get ('sort_by' )
11898
11999 queryset = business .models .Promo .objects .for_company (self .request .user )
120100
121101 if countries :
102+ # Using a regular expression for case-insensitive searching
122103 regex_pattern = r'(' + '|' .join (map (re .escape , countries )) + ')'
104+ country_filter = django .db .models .Q (
105+ target__country__iregex = regex_pattern ,
106+ )
107+
108+ # Include promos where the country is not specified
123109 queryset = queryset .filter (
124- django . db . models . Q ( target__country__iregex = regex_pattern )
110+ country_filter
125111 | django .db .models .Q (target__country__isnull = True ),
126112 )
127113
128114 ordering = f'-{ sort_by } ' if sort_by else '-created_at'
129115
130116 return queryset .order_by (ordering )
131117
118+ def perform_create (self , serializer ):
119+ return serializer .save ()
120+
121+ def create (self , request , * args , ** kwargs ):
122+ serializer = self .get_serializer (data = request .data )
123+ serializer .is_valid (raise_exception = True )
124+ instance = self .perform_create (serializer )
125+ headers = self .get_success_headers (serializer .data )
126+ response_data = {'id' : str (instance .id )}
127+
128+ return rest_framework .response .Response (
129+ response_data ,
130+ status = rest_framework .status .HTTP_201_CREATED ,
131+ headers = headers ,
132+ )
133+
132134
133135class CompanyPromoDetailView (rest_framework .generics .RetrieveUpdateAPIView ):
134136 """
0 commit comments