1- from haystack .forms import SearchForm
1+ import datetime
2+ from datetime import date
3+ from dateutil .relativedelta import relativedelta
4+
25from django import forms
3- from haystack .query import SearchQuerySet
4- from haystack .query import SQ
6+ from haystack .forms import SearchForm
7+ from haystack .query import SearchQuerySet , SQ
8+
59from peeldb .models import City
610
7- valid_time_formats = ["%Y-%m-%d 00:00:00" ]
11+ VALID_TIME_FORMATS = ["%Y-%m-%d 00:00:00" ]
812
913
10- class job_searchForm (SearchForm ):
14+ class JobSearchForm (SearchForm ):
15+ """Search form for filtering and query building on job listings."""
16+
1117 q = forms .CharField (max_length = 200 , required = False )
1218 location = forms .CharField (required = False )
1319 experience = forms .IntegerField (required = False )
@@ -21,150 +27,121 @@ class job_searchForm(SearchForm):
2127 refine_location = forms .CharField (required = False )
2228
2329 def search (self ):
30+ """
31+ Build and return the search query based on form input.
2432
25- # sqs = SearchQuerySet().models(JobPost).filter(status='Live')
26- sqs = SearchQuerySet ()
27- sqs = sqs .filter_and (status = "Live" )
33+ The search query filters live job posts and then applies
34+ additional filters based on the form's cleaned_data.
35+ """
36+ sqs = SearchQuerySet ().filter_and (status = "Live" )
2837 if not self .is_valid ():
2938 return sqs
30- if self . cleaned_data [ "q" ] and self . cleaned_data [ "location" ]:
31- term = self .cleaned_data [ "q" ]
32- term = term . replace ( "[" , " " )
33- term = term . replace ( "]" , "" )
34- term = term . replace ( "'" , "" )
35- # sqs = sqs.filter_and(SQ(title=term) | SQ(designation=term)| SQ(skills=term) )
36- terms = [t .strip () for t in term .split ("," )]
39+
40+ query = self .cleaned_data . get ( "q" )
41+ location_field = self . cleaned_data . get ( "location " )
42+ if query and location_field :
43+ # Process basic query filters.
44+ term = query . replace ( "[" , "" ). replace ( "]" , "" ). replace ( "'" , "" )
45+ terms = [t .strip () for t in term .split ("," ) if t . strip () ]
3746 sqs = sqs .filter_and (
3847 SQ (title__in = terms ) | SQ (designation__in = terms ) | SQ (skills__in = terms )
3948 )
40- # sqs = sqs.filter_or(SQ(designation__in=terms))
41- # sqs = sqs.filter_or(SQ(skills__in=terms))
42- location = self .cleaned_data ["location" ]
43- location = location .replace ("[" , "" )
44- location = location .replace ("]" , "" )
45- location = location .replace ("'" , "" )
46- locations = [t .strip () for t in location .split ("," )]
49+
50+ loc = location_field .replace ("[" , "" ).replace ("]" , "" ).replace ("'" , "" )
51+ locations = [t .strip () for t in loc .split ("," ) if t .strip ()]
4752 other_cities = City .objects .filter (name__in = locations ).values_list (
4853 "parent_city__name" , flat = True
4954 )
5055 sqs = sqs .filter_and (
5156 SQ (location__in = locations )
52- | SQ (location__startswith = self . cleaned_data [ "location" ] )
57+ | SQ (location__startswith = location_field )
5358 | SQ (location__in = other_cities )
5459 )
5560
56- if self .cleaned_data [ "job_type" ] :
61+ if self .cleaned_data . get ( "job_type" ) :
5762 sqs = sqs .filter_and (job_type = self .cleaned_data ["job_type" ])
5863
59- if self .cleaned_data ["industry" ]:
60- term = self .cleaned_data ["industry" ]
61- # sqs = sqs.filter_and(SQ(title=term) | SQ(designation=term)| SQ(skills=term))
62- terms = [t .strip () for t in term .split ("," )]
63- sqs = sqs .filter_or (industry__in = terms )
64+ if self .cleaned_data .get ("industry" ):
65+ industry_value = self .cleaned_data ["industry" ]
66+ industries = [t .strip () for t in industry_value .split ("," ) if t .strip ()]
67+ sqs = sqs .filter_or (industry__in = industries )
6468
65- if self .cleaned_data ["functional_area" ]:
66- term = self .cleaned_data ["functional_area" ]
67- # sqs = sqs.filter_and(SQ(title=term) | SQ(designation=term)| SQ(skills=term))
68- terms = [t .strip () for t in term .split ("," )]
69- sqs = sqs .filter_or (functional_area__in = terms )
69+ if self .cleaned_data .get ("functional_area" ):
70+ fa_value = self .cleaned_data ["functional_area" ]
71+ functional_areas = [
72+ t .strip () for t in fa_value .split ("," ) if t .strip ()
73+ ]
74+ sqs = sqs .filter_or (functional_area__in = functional_areas )
7075
71- if self .cleaned_data ["experience" ] or self .cleaned_data ["experience" ] == 0 :
76+ if self .cleaned_data .get ("experience" ) is not None :
77+ experience_val = self .cleaned_data ["experience" ]
7278 sqs = sqs .filter_or (
73- SQ (max_experience__gte = self . cleaned_data [ "experience" ] )
74- & SQ (min_experience__lte = self . cleaned_data [ "experience" ] )
79+ SQ (max_experience__gte = experience_val )
80+ & SQ (min_experience__lte = experience_val )
7581 )
7682
77- if self .cleaned_data ["salary" ]:
83+ if self .cleaned_data .get ("salary" ) is not None :
84+ salary_val = self .cleaned_data ["salary" ]
7885 sqs = sqs .filter_or (
79- SQ (max_salary__gte = self . cleaned_data [ "salary" ] )
80- & SQ (min_salary__lte = self . cleaned_data [ "salary" ] )
86+ SQ (max_salary__gte = salary_val )
87+ & SQ (min_salary__lte = salary_val )
8188 )
82- if self .cleaned_data ["walkin_type" ]:
83- import datetime
84-
85- if self .cleaned_data ["walkin_type" ] == "this_week" :
86- date = datetime .date .today ()
87- start_week = (
88- date
89- - datetime .timedelta (date .weekday ())
90- - datetime .timedelta (1 )
91- )
89+
90+ walkin_type = self .cleaned_data .get ("walkin_type" )
91+ if walkin_type :
92+ if walkin_type == "this_week" :
93+ today = date .today ()
94+ start_week = today - datetime .timedelta (today .weekday ()) - datetime .timedelta (1 )
9295 end_week = start_week + datetime .timedelta (6 )
93- start_week = datetime .datetime .strptime (
94- str (start_week ), "%Y-%m-%d"
95- ).strftime ("%Y-%m-%d" )
96- end_week = datetime .datetime .strptime (
97- str (end_week ), "%Y-%m-%d"
98- ).strftime ("%Y-%m-%d" )
96+ start_str = start_week .strftime ("%Y-%m-%d" )
97+ end_str = end_week .strftime ("%Y-%m-%d" )
9998 sqs = sqs .filter_and (
100- SQ (walkin_from_date__range = [start_week , end_week ])
101- | SQ (walkin_to_date__range = [start_week , end_week ])
102- )
103- if self .cleaned_data ["walkin_type" ] == "next_week" :
104- date = datetime .date .today ()
105- start_week = (
106- date
107- - datetime .timedelta (date .isoweekday ())
108- + datetime .timedelta (7 )
99+ SQ (walkin_from_date__range = [start_str , end_str ])
100+ | SQ (walkin_to_date__range = [start_str , end_str ])
109101 )
102+ elif walkin_type == "next_week" :
103+ today = date .today ()
104+ start_week = today - datetime .timedelta (today .isoweekday ()) + datetime .timedelta (7 )
110105 end_week = start_week + datetime .timedelta (6 )
111- start_week = datetime .datetime .strptime (
112- str (start_week ), "%Y-%m-%d"
113- ).strftime ("%Y-%m-%d" )
114- end_week = datetime .datetime .strptime (
115- str (end_week ), "%Y-%m-%d"
116- ).strftime ("%Y-%m-%d" )
106+ start_str = start_week .strftime ("%Y-%m-%d" )
107+ end_str = end_week .strftime ("%Y-%m-%d" )
117108 sqs = sqs .filter_and (
118- SQ (walkin_from_date__range = [start_week , end_week ])
119- | SQ (walkin_to_date__range = [start_week , end_week ])
109+ SQ (walkin_from_date__range = [start_str , end_str ])
110+ | SQ (walkin_to_date__range = [start_str , end_str ])
120111 )
121-
122- # sqs = sqs.filter_and(SQ(walkin_from_date__range=[start_week, end_week]) | SQ(walkin_to_date__range=[start_week, end_week]))
123- if self .cleaned_data ["walkin_type" ] == "this_month" :
124- current_date = datetime .date .today ()
125- from dateutil .relativedelta import relativedelta
126- from datetime import date
127-
128- start_week = date (current_date .year , current_date .month , 1 )
129- end_week = start_week + relativedelta (day = 31 )
130- start_week = datetime .datetime .strptime (
131- str (start_week ), "%Y-%m-%d"
132- ).strftime ("%Y-%m-%d" )
133- end_week = datetime .datetime .strptime (
134- str (end_week ), "%Y-%m-%d"
135- ).strftime ("%Y-%m-%d" )
112+ elif walkin_type == "this_month" :
113+ current_date = date .today ()
114+ start_month = date (current_date .year , current_date .month , 1 )
115+ end_month = start_month + relativedelta (day = 31 )
116+ start_str = start_month .strftime ("%Y-%m-%d" )
117+ end_str = end_month .strftime ("%Y-%m-%d" )
136118 sqs = sqs .filter_and (
137- SQ (walkin_from_date__range = [start_week , end_week ])
138- | SQ (walkin_to_date__range = [start_week , end_week ])
119+ SQ (walkin_from_date__range = [start_str , end_str ])
120+ | SQ (walkin_to_date__range = [start_str , end_str ])
139121 )
140- # if self.cleaned_data['walkin_type'] == 'next_month':
141- # pass
142- if self .cleaned_data ["walkin_type" ] == "custom_range" :
143- if self .cleaned_data ["walkin_from_date" ]:
144- walkin_from_date = datetime .datetime .strptime (
145- str (self .cleaned_data ["walkin_from_date" ]), "%Y-%m-%d"
146- ).strftime ("%Y-%m-%d" )
122+ elif walkin_type == "custom_range" :
123+ if self .cleaned_data .get ("walkin_from_date" ):
124+ walkin_from = self .cleaned_data ["walkin_from_date" ].strftime (
125+ "%Y-%m-%d"
126+ )
147127 sqs = sqs .filter_and (
148- SQ (walkin_from_date__gte = walkin_from_date )
149- | SQ (walkin_to_date__gte = walkin_from_date )
128+ SQ (walkin_from_date__gte = walkin_from )
129+ | SQ (walkin_to_date__gte = walkin_from )
130+ )
131+ if self .cleaned_data .get ("walkin_to_date" ):
132+ walkin_to = self .cleaned_data ["walkin_to_date" ].strftime (
133+ "%Y-%m-%d"
150134 )
151- if self .cleaned_data ["walkin_to_date" ]:
152- walkin_to_date = datetime .datetime .strptime (
153- str (self .cleaned_data ["walkin_to_date" ]), "%Y-%m-%d"
154- ).strftime ("%Y-%m-%d" )
155135 sqs = sqs .filter_and (
156- SQ (walkin_from_date__gte = walkin_to_date )
157- | SQ (walkin_to_date__lte = walkin_to_date )
136+ SQ (walkin_from_date__gte = walkin_to )
137+ | SQ (walkin_to_date__lte = walkin_to )
158138 )
159139 return sqs
160- else :
161- return []
140+ return []
162141
163142 def query (self ):
164- if self .cleaned_data ["q" ]:
165- return self .cleaned_data ["q" ]
166- return None
167-
168-
169- # 13-11-2014
170- # 20-11-2014 29-11-2014
143+ """
144+ Return the query string if provided; otherwise, return None.
145+ """
146+ q_value = self .cleaned_data .get ("q" )
147+ return q_value if q_value else None
0 commit comments