4444
4545class SearchForm (forms .Form ):
4646 name = forms .CharField (required = False )
47- author = forms .CharField (required = False )
4847 rfcs = forms .BooleanField (required = False ,initial = True )
4948 activeDrafts = forms .BooleanField (required = False ,initial = True )
5049 oldDrafts = forms .BooleanField (required = False ,initial = False )
5150
51+ by = forms .ChoiceField (choices = [(x ,x ) for x in ('author' ,'group' ,'area' ,'ad' ,'state' )], required = False , initial = 'wg' , label = 'Foobar' )
52+ author = forms .CharField (required = False )
5253 group = forms .CharField (required = False )
5354 area = forms .ModelChoiceField (Area .active_areas (), empty_label = "any area" , required = False )
54-
5555 ad = forms .ChoiceField (choices = (), required = False )
5656 state = forms .ModelChoiceField (IDState .objects .all (), empty_label = "any state" , required = False )
5757 subState = forms .ChoiceField (choices = (), required = False )
5858
59- def clean_name (self ):
60- value = self .cleaned_data .get ('name' ,'' )
61- return normalize_draftname (value )
6259 def __init__ (self , * args , ** kwargs ):
6360 super (SearchForm , self ).__init__ (* args , ** kwargs )
6461 self .fields ['ad' ].choices = [('' , 'any AD' )] + [(ad .id , "%s %s" % (ad .first_name , ad .last_name )) for ad in IESGLogin .objects .filter (user_level = 1 ).order_by ('last_name' )] + [('-99' , '------------------' )] + [(ad .id , "%s %s" % (ad .first_name , ad .last_name )) for ad in IESGLogin .objects .filter (user_level = 2 ).order_by ('last_name' )]
6562 self .fields ['subState' ].choices = [('' , 'any substate' ), ('0' , 'no substate' )] + [(state .sub_state_id , state .sub_state ) for state in IDSubState .objects .all ()]
63+ def clean_name (self ):
64+ value = self .cleaned_data .get ('name' ,'' )
65+ return normalize_draftname (value )
66+ def clean (self ):
67+ q = self .cleaned_data
68+ # Reset query['by'] if needed
69+ for k in ('author' ,'group' ,'area' ,'ad' ):
70+ if (q ['by' ] == k ) and not q [k ]:
71+ q ['by' ] = None
72+ if (q ['by' ] == 'state' ) and not (q ['state' ] or q ['subState' ]):
73+ q ['by' ] = None
74+ # Reset other fields
75+ for k in ('author' ,'group' ,'area' ,'ad' ):
76+ if q ['by' ] != k :
77+ self .data [k ] = ""
78+ q [k ] = ""
79+ if q ['by' ] != 'state' :
80+ self .data ['state' ] = ""
81+ self .data ['subState' ] = ""
82+ q ['state' ] = ""
83+ q ['subState' ] = ""
84+ return q
6685
6786def search_query (query_original ):
6887 query = dict (query_original .items ())
@@ -86,23 +105,24 @@ def search_query(query_original):
86105
87106 prefix = ""
88107 q_objs = []
89- if query ['ad ' ] or query [ 'state' ] or query [ 'subState' ] :
108+ if query ['by ' ] in ( 'ad' , 'state' ) :
90109 prefix = "draft__"
91- if query ['ad' ]:
92- q_objs .append (Q (job_owner = query ['ad' ]))
93- if query ['state' ]:
94- q_objs .append (Q (cur_state = query ['state' ]))
95- if query ['subState' ]:
96- q_objs .append (Q (cur_sub_state = query ['subState' ]))
97-
98110 if query ['name' ]:
99111 q_objs .append (Q (** {prefix + "filename__icontains" :query ['name' ]})| Q (** {prefix + "title__icontains" :query ['name' ]}))
100- if query ['author' ]:
112+
113+ if query ['by' ] == 'author' :
101114 q_objs .append (Q (** {prefix + "authors__person__last_name__icontains" :query ['author' ]}))
102- if query ['group' ] :
115+ elif query ['by' ] == 'group' :
103116 q_objs .append (Q (** {prefix + "group__acronym" :query ['group' ]}))
104- if query ['area' ] :
117+ elif query ['by' ] == 'area' :
105118 q_objs .append (Q (** {prefix + "group__ietfwg__areagroup__area" :query ['area' ]}))
119+ elif query ['by' ] == 'ad' :
120+ q_objs .append (Q (job_owner = query ['ad' ]))
121+ elif query ['by' ] == 'state' :
122+ if query ['state' ]:
123+ q_objs .append (Q (cur_state = query ['state' ]))
124+ if query ['subState' ]:
125+ q_objs .append (Q (cur_sub_state = query ['subState' ]))
106126 if (not query ['rfcs' ]) and query ['activeDrafts' ] and (not query ['oldDrafts' ]):
107127 q_objs .append (Q (** {prefix + "status" :1 }))
108128 elif query ['rfcs' ] and query ['activeDrafts' ] and (not query ['oldDrafts' ]):
@@ -131,7 +151,7 @@ def search_query(query_original):
131151 idresults .append ([id ])
132152
133153 # Next, search RFCs
134- if query ['rfcs' ] and not ( query [ 'ad' ] or query [ 'state' ] or query [ 'subState' ] or query [ 'area' ]) :
154+ if query ['rfcs' ]:
135155 q_objs = []
136156 searchRfcIndex = True
137157 if query ['name' ]:
@@ -141,17 +161,28 @@ def search_query(query_original):
141161 q_objs .append (Q (rfc_number__contains = m .group (1 ))| Q (title__icontains = query ['name' ]))
142162 else :
143163 q_objs .append (Q (title__icontains = query ['name' ]))
144- # We prefer searching RfcIndex, but it doesn't have group info
145- if query ['group' ]:
164+ if query ['by' ] == 'author' :
165+ q_objs .append (Q (authors__icontains = query ['author' ]))
166+ elif query ['by' ] == 'group' :
167+ # We prefer searching RfcIndex, but it doesn't have group info
146168 searchRfcIndex = False
147169 q_objs .append (Q (group_acronym = query ['group' ]))
148- if query ['area' ]:
149- # TODO: not implemented yet
150- pass
151- if query ['author' ] and searchRfcIndex :
152- q_objs .append (Q (authors__icontains = query ['author' ]))
153- elif query ['author' ]:
154- q_objs .append (Q (authors__person__last_name__icontains = query ['author' ]))
170+ elif query ['by' ] == 'area' :
171+ # Ditto for area
172+ searchRfcIndex = False
173+ q_objs .append (Q (area_acronym = query ['area' ]))
174+ elif query ['by' ] == 'ad' :
175+ numbers = IDInternal .objects .filter (rfc_flag = 1 ,job_owner = query ['ad' ]).values_list ('draft_id' ,flat = True )
176+ q_objs .append (Q (rfc_number__in = numbers ))
177+ elif query ['by' ] == 'state' :
178+ numbers_q = [Q (rfc_flag = 1 )]
179+ if query ['state' ]:
180+ numbers_q .append (Q (cur_state = query ['state' ]))
181+ if query ['subState' ]:
182+ numbers_q .append (Q (cur_state = query ['subState' ]))
183+ numbers = IDInternal .objects .filter (* numbers_q ).values_list ('draft_id' ,flat = True )
184+ q_objs .append (Q (rfc_number__in = numbers ))
185+
155186 if searchRfcIndex :
156187 matches = RfcIndex .objects .filter (* q_objs )[:MAX ]
157188 else :
@@ -195,7 +226,7 @@ def search_query(query_original):
195226 if len (rfcs ) >= 1 :
196227 r [3 ] = rfcs [0 ]
197228
198- # TODO: require that RfcINdex is present
229+ # TODO: require that RfcIndex is present?
199230
200231 results = []
201232 for res in idresults + rfcresults :
@@ -216,19 +247,19 @@ def search_query(query_original):
216247 meta = {}
217248 if maxReached :
218249 meta ['max' ] = MAX
219- if query ['author' ] or query [ 'group' ] or query [ 'area' ] or query [ 'ad' ] or query [ 'state' ] or query [ 'subState ' ]:
250+ if query ['by ' ]:
220251 meta ['advanced' ] = True
221252 return (results ,meta )
222253
223254def search_results (request ):
224255 if len (request .REQUEST .items ()) == 0 :
225256 return search_main (request )
226- form = SearchForm (request .REQUEST )
257+ form = SearchForm (dict ( request .REQUEST . items ()) )
227258 if not form .is_valid ():
228259 return HttpResponse ("form not valid?" , mimetype = "text/plain" )
229- x = form .cleaned_data
230260 (results ,meta ) = search_query (form .cleaned_data )
231261 meta ['searching' ] = True
262+ meta ['by' ] = form .cleaned_data ['by' ]
232263 if 'ajax' in request .REQUEST and request .REQUEST ['ajax' ]:
233264 return render_to_response ('idrfc/search_results.html' , {'docs' :results , 'meta' :meta }, context_instance = RequestContext (request ))
234265 else :
@@ -250,15 +281,11 @@ def by_ad(request, name):
250281 break
251282 if not ad_id :
252283 raise Http404
253- form = SearchForm (request .REQUEST )
254- if form .is_valid ():
255- pass
256- form .cleaned_data ['ad' ] = ad_id
257- form .cleaned_data ['activeDrafts' ] = True
258- form .cleaned_data ['rfcs' ] = True
259- form .cleaned_data ['oldDrafts' ] = True
284+ form = SearchForm ({'by' :'ad' ,'ad' :ad_id ,
285+ 'rfcs' :'on' , 'activeDrafts' :'on' , 'oldDrafts' :'on' })
286+ if not form .is_valid ():
287+ raise ValueError ("form did not validate" )
260288 (results ,meta ) = search_query (form .cleaned_data )
261-
262289 results .sort (key = lambda obj : obj .view_sort_key_byad ())
263290 return render_to_response ('idrfc/by_ad.html' , {'form' :form , 'docs' :results ,'meta' :meta , 'ad_name' :ad_name }, context_instance = RequestContext (request ))
264291
0 commit comments