1+ from django .db .models import QuerySet , Q , F
2+
13from django_filters import rest_framework as filters
24
35from vacancy .models import Vacancy
4- from django .db .models import QuerySet
6+ from vacancy .constants import (
7+ WorkExperience ,
8+ WorkSchedule ,
9+ WorkFormat ,
10+ )
511
612
713def project_id_filter (queryset , name , value ) -> QuerySet :
@@ -18,12 +24,20 @@ class VacancyFilter(filters.FilterSet):
1824 Adds filtering to DRF list retrieve views
1925
2026 Parameters to filter by:
21- project_id (int), is_active (default to True if not set otherwise) (boolean)
27+ project_id (int),
28+ is_active (boolean) (default to True if not set otherwise),
29+ required_experience (multiple choise)
30+ work_schedule (multiple choise)
31+ work_format (multiple choise)
32+ salary_min (int)
33+ salary_max (int)
2234
2335 Examples:
2436 ?project_id=1 equals to .filter(project_id=1)
2537 (no params passed) equals to .filter(is_active=True)
2638 ?is_active=false equals to .filter(is_active=False)
39+ ?work_schedule=full_time&work_schedule=part_time equals to .filter(required_experience__in=value)
40+ ?salary_min=100&salary_max=150 equals to .filter(salary__range=(100, 150))
2741 """
2842
2943 def __init__ (self , * args , ** kwargs ):
@@ -33,9 +47,76 @@ def __init__(self, *args, **kwargs):
3347 self .data = dict (self .data )
3448 self .data ["is_active" ] = True
3549
36- is_active = filters .BooleanFilter (field_name = "is_active" )
50+ def filter_by_experience (self , queryset : QuerySet [Vacancy ], name , value : list [str ]) -> QuerySet [Vacancy ]:
51+ return (
52+ queryset
53+ .filter (Q (required_experience__in = value ) | Q (required_experience = None ))
54+ .order_by (F ("required_experience" ).asc (nulls_last = True ))
55+ )
56+
57+ def filter_by_schedule (self , queryset : QuerySet [Vacancy ], name , value : list [str ]) -> QuerySet [Vacancy ]:
58+ return (
59+ queryset
60+ .filter (Q (work_schedule__in = value ) | Q (work_schedule = None ))
61+ .order_by (F ("work_schedule" ).asc (nulls_last = True ))
62+ )
63+
64+ def filter_by_format (self , queryset : QuerySet [Vacancy ], name , value : list [str ]) -> QuerySet [Vacancy ]:
65+ return (
66+ queryset
67+ .filter (Q (work_format__in = value ) | Q (work_format = None ))
68+ .order_by (F ("work_format" ).asc (nulls_last = True ))
69+ )
70+
71+ def filter_by_salary_min (self , queryset : QuerySet [Vacancy ], name , value : list [str ]) -> QuerySet [Vacancy ]:
72+ try :
73+ min_salary = int (value [0 ])
74+ return (
75+ queryset
76+ .filter (Q (salary__gte = min_salary ) | Q (salary = None ))
77+ .order_by (F ("salary" ).asc (nulls_last = True ))
78+ )
79+ except ValueError :
80+ return queryset
81+
82+ def filter_by_salary_max (self , queryset : QuerySet [Vacancy ], name , value : list [str ]) -> QuerySet [Vacancy ]:
83+ try :
84+ max_salary = int (value [0 ])
85+ return (
86+ queryset
87+ .filter (Q (salary__lte = max_salary ) | Q (salary = None ))
88+ .order_by (F ("salary" ).asc (nulls_last = True ))
89+ )
90+ except ValueError :
91+ return queryset
92+
3793 project_id = filters .Filter (method = project_id_filter )
94+ is_active = filters .BooleanFilter (field_name = "is_active" )
95+
96+ required_experience = filters .MultipleChoiceFilter (
97+ method = "filter_by_experience" ,
98+ choices = WorkExperience .choices (),
99+ )
100+ work_schedule = filters .MultipleChoiceFilter (
101+ method = "filter_by_schedule" ,
102+ choices = WorkSchedule .choices (),
103+ )
104+ work_format = filters .MultipleChoiceFilter (
105+ method = "filter_by_format" ,
106+ choices = WorkFormat .choices (),
107+ )
108+
109+ salary_min = filters .Filter (method = "filter_by_salary_min" )
110+ salary_max = filters .Filter (method = "filter_by_salary_max" )
38111
39112 class Meta :
40113 model = Vacancy
41- fields = ("project_id" , "is_active" )
114+ fields = (
115+ "project_id" ,
116+ "is_active" ,
117+ "required_experience" ,
118+ "work_schedule" ,
119+ "work_format" ,
120+ "salary_min" ,
121+ "salary_max" ,
122+ )
0 commit comments