def adv_results(request): """Process the form from an advanced search. We expect to always get here from the advanced search page and always on a get, either from the submit button on the form or the paging navigation buttons. - On first search submission, load the request session dictionary from form values. - On subsequent paging calls, if any, form values are pulled from the session dictionary. """ start_time = time.time() page = request.GET.get('page') if page is None: # reset session data for t in ['searchingfor','composer','style','instrument','lilyversion']: request.session[t] = '' request.session['time_delta'] = 0 form = AdvSearchForm(request.GET) if form.is_valid(): if len(form.cleaned_data['searchingfor']) > 0: request.session['searchingfor'] = form.cleaned_data['searchingfor'] if len(form.cleaned_data['composer']) > 0: request.session['composer'] = form.cleaned_data['composer'] if len(form.cleaned_data['style']) > 0: request.session['style'] = form.cleaned_data['style'] if len(form.cleaned_data['instrument']): request.session['instrument'] = form.cleaned_data['instrument'] if form.cleaned_data['lilyv']: # still, the user has to fill something in here if len(form.cleaned_data['lilyversion']) > 0: request.session['lilyversion'] = form.cleaned_data['lilyversion'] if form.cleaned_data['recent']: # Store the computed time delta in days, not the value # of recent. Note that 'timelength' and 'timeunit' # values should exist per form constraints. td = form.cleaned_data['timelength'] if form.cleaned_data['timeunit'] == SearchInterval.WEEK: td = 7 * td request.session['time_delta'] = td else: pass # request session will be cleared # Now walk through the session variables to do the query and # filtering. if len(request.session['searchingfor']) > 0: q = fts_search(request.session['searchingfor']) else: q = Piece.objects.all() # Filter on composer, instrument, style, and LilyPond version if len(request.session['composer']) > 0: q = q.filter(composer=request.session['composer']) if len(request.session['style']) > 0: q = q.filter(style=request.session['style']) if len(request.session['instrument']) > 0: q = q.filter(instruments__pk=request.session['instrument']) if len(request.session['lilyversion']) > 0: q = q.filter(version__version__startswith=request.session['lilyversion']) # Finally, filter on delta time in days if request.session['time_delta'] > 0: td = datetime.timedelta(days=request.session['time_delta']) target = datetime.date.today() - td q = q.filter(date_published__gte=target) paginator = Paginator(q, 25) try: pager = paginator.page(page) except PageNotAnInteger: pager = paginator.page(1) except EmptyPage: pager = paginator.page(paginator.num_pages) end_time = time.time() context = { 'active' : 'None', 'pager' : pager, 'pieces': pager, 'search_time': '%2.4g' % (end_time - start_time), } return render(request, 'results.html', context)
def test_default_form(self): form = AdvSearchForm({}) self.assertTrue(form.is_valid()) response = self.client.get(reverse("search")) self.assertTemplateUsed(response, "advsearch.html")
def adv_results(request): """Process the form from an advanced search. We expect to always get here from the advanced search page and always on a get, either from the submit button on the form or the paging navigation buttons. - On first search submission, load the request session dictionary from form values. - On subsequent paging calls, if any, form values are pulled from the session dictionary. """ start_time = time.time() page = request.GET.get('page') if page is None: # reset session data for t in [ 'searchingfor', 'composer', 'style', 'instrument', 'lilyversion' ]: request.session[t] = '' request.session['time_delta'] = 0 form = AdvSearchForm(request.GET) if form.is_valid(): if len(form.cleaned_data['searchingfor']) > 0: request.session['searchingfor'] = form.cleaned_data[ 'searchingfor'] if len(form.cleaned_data['composer']) > 0: request.session['composer'] = form.cleaned_data['composer'] if len(form.cleaned_data['style']) > 0: request.session['style'] = form.cleaned_data['style'] if len(form.cleaned_data['instrument']): request.session['instrument'] = form.cleaned_data['instrument'] if form.cleaned_data['lilyv']: # still, the user has to fill something in here if len(form.cleaned_data['lilyversion']) > 0: request.session['lilyversion'] = form.cleaned_data[ 'lilyversion'] if form.cleaned_data['recent']: # Store the computed time delta in days, not the value # of recent. Note that 'timelength' and 'timeunit' # values should exist per form constraints. td = form.cleaned_data['timelength'] if form.cleaned_data['timeunit'] == SearchInterval.WEEK: td = 7 * td request.session['time_delta'] = td else: pass # request session will be cleared # Now walk through the session variables to do the query and # filtering. if len(request.session['searchingfor']) > 0: q = fts_search(request.session['searchingfor']) else: q = Piece.objects.all() # Filter on composer, instrument, style, and LilyPond version if len(request.session['composer']) > 0: q = q.filter(composer=request.session['composer']) if len(request.session['style']) > 0: q = q.filter(style=request.session['style']) if len(request.session['instrument']) > 0: q = q.filter(instruments__pk=request.session['instrument']) if len(request.session['lilyversion']) > 0: q = q.filter( version__version__startswith=request.session['lilyversion']) # Finally, filter on delta time in days if request.session['time_delta'] > 0: td = datetime.timedelta(days=request.session['time_delta']) target = datetime.date.today() - td q = q.filter(date_published__gte=target) paginator = Paginator(q, 25) try: pager = paginator.page(page) except PageNotAnInteger: pager = paginator.page(1) except EmptyPage: pager = paginator.page(paginator.num_pages) end_time = time.time() context = { 'active': 'None', 'pager': pager, 'pieces': pager, 'search_time': '%2.4g' % (end_time - start_time), } return render(request, 'results.html', context)
def test_default_form(self): form = AdvSearchForm({}) self.assertTrue(form.is_valid()) response = self.client.get(reverse('search')) self.assertTemplateUsed(response, 'advsearch.html')