1
- from haystack .forms import SearchForm
1
+ import datetime
2
+ from datetime import date
3
+ from dateutil .relativedelta import relativedelta
4
+
2
5
from 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
+
5
9
from peeldb .models import City
6
10
7
- valid_time_formats = ["%Y-%m-%d 00:00:00" ]
11
+ VALID_TIME_FORMATS = ["%Y-%m-%d 00:00:00" ]
8
12
9
13
10
- class job_searchForm (SearchForm ):
14
+ class JobSearchForm (SearchForm ):
15
+ """Search form for filtering and query building on job listings."""
16
+
11
17
q = forms .CharField (max_length = 200 , required = False )
12
18
location = forms .CharField (required = False )
13
19
experience = forms .IntegerField (required = False )
@@ -21,150 +27,121 @@ class job_searchForm(SearchForm):
21
27
refine_location = forms .CharField (required = False )
22
28
23
29
def search (self ):
30
+ """
31
+ Build and return the search query based on form input.
24
32
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" )
28
37
if not self .is_valid ():
29
38
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 () ]
37
46
sqs = sqs .filter_and (
38
47
SQ (title__in = terms ) | SQ (designation__in = terms ) | SQ (skills__in = terms )
39
48
)
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 ()]
47
52
other_cities = City .objects .filter (name__in = locations ).values_list (
48
53
"parent_city__name" , flat = True
49
54
)
50
55
sqs = sqs .filter_and (
51
56
SQ (location__in = locations )
52
- | SQ (location__startswith = self . cleaned_data [ "location" ] )
57
+ | SQ (location__startswith = location_field )
53
58
| SQ (location__in = other_cities )
54
59
)
55
60
56
- if self .cleaned_data [ "job_type" ] :
61
+ if self .cleaned_data . get ( "job_type" ) :
57
62
sqs = sqs .filter_and (job_type = self .cleaned_data ["job_type" ])
58
63
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 )
64
68
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 )
70
75
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" ]
72
78
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 )
75
81
)
76
82
77
- if self .cleaned_data ["salary" ]:
83
+ if self .cleaned_data .get ("salary" ) is not None :
84
+ salary_val = self .cleaned_data ["salary" ]
78
85
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 )
81
88
)
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 )
92
95
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" )
99
98
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 ])
109
101
)
102
+ elif walkin_type == "next_week" :
103
+ today = date .today ()
104
+ start_week = today - datetime .timedelta (today .isoweekday ()) + datetime .timedelta (7 )
110
105
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" )
117
108
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 ])
120
111
)
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" )
136
118
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 ])
139
121
)
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
+ )
147
127
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"
150
134
)
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" )
155
135
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 )
158
138
)
159
139
return sqs
160
- else :
161
- return []
140
+ return []
162
141
163
142
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