diff --git a/apps/dynamic_search/__init__.py b/apps/dynamic_search/__init__.py index 0e76595f36..eea43074dc 100644 --- a/apps/dynamic_search/__init__.py +++ b/apps/dynamic_search/__init__.py @@ -4,7 +4,9 @@ from navigation.api import register_sidebar_template, register_links search = {'text': _(u'search'), 'view': 'search', 'famfam': 'zoom'} search_advanced = {'text': _(u'advanced search'), 'view': 'search_advanced', 'famfam': 'zoom_in'} +search_again = {'text': _(u'search again'), 'view': 'search_again', 'famfam': 'arrow_undo'} register_sidebar_template(['search', 'search_advanced'], 'search_help.html') register_links(['search', 'search_advanced'], [search, search_advanced], menu_name='form_header') +register_links(['results'], [search_again], menu_name='sidebar') diff --git a/apps/dynamic_search/api.py b/apps/dynamic_search/api.py index 014eee62d9..fdf098ba8c 100644 --- a/apps/dynamic_search/api.py +++ b/apps/dynamic_search/api.py @@ -55,7 +55,7 @@ def get_query(terms, search_fields): queries.append(or_query) return queries - + def perform_search(query_string, field_list=None): model_list = {} @@ -101,7 +101,7 @@ def perform_search(query_string, field_list=None): for model, data in search_dict.items(): title = data['title'] queries = [] - + for query_entry in data['query_entries']: queries.extend(get_query(query_entry['terms'], query_entry['field_name'])) @@ -117,7 +117,7 @@ def perform_search(query_string, field_list=None): if model_result_ids == None: model_result_ids = [] - + result_count += len(model_result_ids) results = model.objects.in_bulk(list(model_result_ids)[: LIMIT]).values() shown_result_count += len(results) @@ -126,7 +126,7 @@ def perform_search(query_string, field_list=None): for result in results: if result not in flat_list: flat_list.append(result) - + elapsed_time = unicode(datetime.datetime.now() - start_time).split(':')[2] return { diff --git a/apps/dynamic_search/forms.py b/apps/dynamic_search/forms.py index ad10b084a8..d457862057 100644 --- a/apps/dynamic_search/forms.py +++ b/apps/dynamic_search/forms.py @@ -1,6 +1,8 @@ from django import forms from django.utils.translation import ugettext_lazy as _ +from dynamic_search.api import registered_search_dict + class SearchForm(forms.Form): q = forms.CharField(max_length=128, label=_(u'Search terms')) @@ -8,12 +10,11 @@ class SearchForm(forms.Form): class AdvancedSearchForm(forms.Form): def __init__(self, *args, **kwargs): - search_fields = kwargs.pop('search_fields') super(AdvancedSearchForm, self).__init__(*args, **kwargs) - #Set form fields initial values - for search_field in search_fields: - self.fields[search_field['name']] = forms.CharField( - label=search_field['title'], - required=False - ) + for model_name, values in registered_search_dict.items(): + for field in values['fields']: + self.fields['%s__%s' % (model_name, field['name'])] = forms.CharField( + label=field['title'], + required=False + ) diff --git a/apps/dynamic_search/templatetags/search_tags.py b/apps/dynamic_search/templatetags/search_tags.py index 6a4745960e..16a77726a2 100644 --- a/apps/dynamic_search/templatetags/search_tags.py +++ b/apps/dynamic_search/templatetags/search_tags.py @@ -16,6 +16,6 @@ def search_form(context): 'form_action': reverse('results'), 'form_title': _(u'Search'), 'submit_label': _(u'Search'), - 'submit_icon_famfam': 'zoom', + 'submit_icon_famfam': 'zoom', }) return context diff --git a/apps/dynamic_search/urls.py b/apps/dynamic_search/urls.py index 5a4ef1a80e..8069a50342 100644 --- a/apps/dynamic_search/urls.py +++ b/apps/dynamic_search/urls.py @@ -1,7 +1,8 @@ from django.conf.urls.defaults import patterns, url urlpatterns = patterns('dynamic_search.views', - url(r'^search/$', 'search', (), 'search'), - url(r'^search/advanced/$', 'search', { 'advanced': True }, 'search_advanced'), + url(r'^$', 'search', (), 'search'), + url(r'^advanced/$', 'search', {'advanced': True}, 'search_advanced'), + url(r'^again/$', 'search_again', (), 'search_again'), url(r'^results/$', 'results', (), 'results'), ) diff --git a/apps/dynamic_search/views.py b/apps/dynamic_search/views.py index c626218a30..7d12d30fc8 100644 --- a/apps/dynamic_search/views.py +++ b/apps/dynamic_search/views.py @@ -1,31 +1,30 @@ +import urlparse + from django.shortcuts import render_to_response from django.template import RequestContext from django.utils.translation import ugettext_lazy as _ from django.contrib import messages from django.conf import settings +from django.http import HttpResponseRedirect +from django.core.urlresolvers import reverse -from dynamic_search.api import perform_search, registered_search_dict +from dynamic_search.api import perform_search from dynamic_search.forms import SearchForm, AdvancedSearchForm from dynamic_search.conf.settings import SHOW_OBJECT_TYPE from dynamic_search.conf.settings import LIMIT def results(request, extra_context=None): - query_string = '' context = {} context.update({ 'query_string': request.GET, - 'form_title': _(u'Search'), #'hide_header': True, - 'form_hide_required_text': True, 'hide_links': True, 'multi_select_as_buttons': True, - 'submit_label': _(u'Search'), - 'submit_icon_famfam': 'zoom', 'search_results_limit': LIMIT, }) - + if extra_context: context.update(extra_context) @@ -60,36 +59,38 @@ def results(request, extra_context=None): def search(request, advanced=False): if advanced: - search_fields = [] - for model_name, values in registered_search_dict.items(): - for field in values['fields']: - search_fields.append( - { - 'title': field['title'], - 'name': '%s__%s' % (model_name, field['name']) - } - ) - form = AdvancedSearchForm( - search_fields=search_fields, - data=request.GET - ) - - return results(request, extra_context={ + form = AdvancedSearchForm(data=request.GET) + return render_to_response('generic_form.html', + { 'form': form, - 'form_title': _(u'advanced search') - } + 'title': _(u'advanced search'), + 'form_action': reverse('results'), + 'submit_method': 'GET', + 'search_results_limit': LIMIT, + 'submit_label': _(u'Search'), + 'submit_icon_famfam': 'zoom', + }, + context_instance=RequestContext(request) ) else: + extra_context = { + 'submit_label': _(u'Search'), + 'submit_icon_famfam': 'zoom', + 'form_title': _(u'Search'), + 'form_hide_required_text': True, + } + if ('q' in request.GET) and request.GET['q'].strip(): query_string = request.GET['q'] form = SearchForm(initial={'q': query_string}) - return results(request, extra_context={ - 'form': form - } - ) + extra_context.update({'form': form}) + return results(request, extra_context=extra_context) else: form = SearchForm() - return results(request, extra_context={ - 'form': form - } - ) + extra_context.update({'form': form}) + return results(request, extra_context=extra_context) + + +def search_again(request): + query = urlparse.urlparse(request.META.get('HTTP_REFERER', u'/')).query + return HttpResponseRedirect('%s?%s' % (reverse('search_advanced'), query))