3030# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3131# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3232
33- import datetime , re
33+ import re
34+ import datetime
3435
3536from django import forms
3637from django .conf import settings
3738from django .core .cache import cache
3839from django .core .exceptions import ObjectDoesNotExist
3940from django .core .urlresolvers import reverse as urlreverse
4041from django .db .models import Q
41- from django .http import Http404 , HttpResponseBadRequest , HttpResponse , HttpResponseRedirect
42+ from django .http import Http404 , HttpResponseBadRequest , HttpResponse , HttpResponseRedirect , QueryDict
4243from django .shortcuts import render
4344from django .utils .cache import _generate_cache_key
4445
4950 DocEvent , LastCallDocEvent , TelechatDocEvent , IESG_SUBSTATE_TAGS )
5051from ietf .doc .expire import expirable_draft
5152from ietf .doc .fields import select2_id_doc_name_json
53+ from ietf .doc .utils import get_search_cache_key
5254from ietf .group .models import Group
5355from ietf .idindex .index import active_drafts_index_by_group
5456from ietf .name .models import DocTagName , DocTypeName , StreamName
@@ -123,9 +125,6 @@ def clean(self):
123125 q ['state' ] = q ['substate' ] = None
124126 return q
125127
126- def wrap_value (v ):
127- return lambda : v
128-
129128def fill_in_search_attributes (docs ):
130129 # fill in some attributes for the search results to save some
131130 # hairy template code and avoid repeated SQL queries
@@ -153,13 +152,13 @@ def fill_in_search_attributes(docs):
153152 for e in TelechatDocEvent .objects .filter (doc__in = doc_ids , type = "scheduled_for_telechat" ).order_by ('-time' ):
154153 if e .doc_id not in seen :
155154 d = docs_dict [e .doc_id ]
156- d .telechat_date = wrap_value ( d .telechat_date (e ) )
155+ d ._telechat_date = d .telechat_date (e )
157156 seen .add (e .doc_id )
158157
159158 # misc
160159 for d in docs :
161- # emulate canonical name which is used by a lot of the utils
162- d .canonical_name = wrap_value ( rfc_aliases [d .pk ] if d .pk in rfc_aliases else d .name )
160+ # set up information for canonical_name() which is used by a lot of the utils
161+ d ._canonical_name = rfc_aliases [d .pk ] if d .pk in rfc_aliases else d .name
163162
164163 if d .rfc_number () != None and d .latest_event_cache ["published_rfc" ]:
165164 d .latest_revision_date = d .latest_event_cache ["published_rfc" ].time
@@ -265,7 +264,7 @@ def retrieve_search_results(form, all_types=False):
265264 # radio choices
266265 by = query ["by" ]
267266 if by == "author" :
268- docs = docs .filter (authors__person__name__icontains = query ["author" ])
267+ docs = docs .filter (authors__person__alias__name__icontains = query ["author" ])
269268 elif by == "group" :
270269 docs = docs .filter (group__acronym = query ["group" ])
271270 elif by == "area" :
@@ -362,7 +361,7 @@ def sort_key(d):
362361 d ["sort" ] = h ["key" ]
363362 h ["sort_url" ] = "?" + d .urlencode ()
364363
365- return (results , meta )
364+ return (results , meta , docs )
366365
367366
368367def get_doc_is_tracked (request , results ):
@@ -392,20 +391,27 @@ def search(request):
392391 get_params ['substate' ] = request .GET ['subState' ]
393392
394393 form = SearchForm (get_params )
395- if not form .is_valid ():
396- return HttpResponseBadRequest ("form not valid: %s" % form .errors )
394+ key = get_search_cache_key (get_params )
395+ info = cache .get (key )
396+ if not info :
397+ if not form .is_valid ():
398+ return HttpResponseBadRequest ("form not valid: %s" % form .errors )
399+
400+ info = retrieve_search_results (form )
401+ cache .set (key , info )
397402
398- results , meta = retrieve_search_results ( form )
403+ results , meta , qs = info
399404 meta ['searching' ] = True
400405 else :
401406 form = SearchForm ()
402407 results = []
403408 meta = { 'by' : None , 'advanced' : False , 'searching' : False }
409+ get_params = QueryDict ('' )
404410
405411 doc_is_tracked = get_doc_is_tracked (request , results )
406412
407413 return render (request , 'doc/search/search.html' , {
408- 'form' :form , 'docs' :results , 'doc_is_tracked' :doc_is_tracked , 'meta' :meta , },
414+ 'form' :form , 'docs' :results , 'doc_is_tracked' :doc_is_tracked , 'meta' :meta , 'queryargs' : get_params . urlencode () },
409415 )
410416
411417def frontpage (request ):
@@ -580,7 +586,7 @@ def docs_for_ad(request, name):
580586 form = SearchForm ({'by' :'ad' ,'ad' : ad .id ,
581587 'rfcs' :'on' , 'activedrafts' :'on' , 'olddrafts' :'on' ,
582588 'sort' : 'status' })
583- results , meta = retrieve_search_results (form , all_types = True )
589+ results , meta , _ = retrieve_search_results (form , all_types = True )
584590 results .sort (key = ad_dashboard_sort_key )
585591 del meta ["headers" ][- 1 ]
586592 #
@@ -594,7 +600,7 @@ def docs_for_ad(request, name):
594600def drafts_in_last_call (request ):
595601 lc_state = State .objects .get (type = "draft-iesg" , slug = "lc" ).pk
596602 form = SearchForm ({'by' :'state' ,'state' : lc_state , 'rfcs' :'on' , 'activedrafts' :'on' })
597- results , meta = retrieve_search_results (form )
603+ results , meta , _ = retrieve_search_results (form )
598604
599605 return render (request , 'doc/drafts_in_last_call.html' , {
600606 'form' :form , 'docs' :results , 'meta' :meta
0 commit comments