From 95a4523b89d0fb36619e884036da06f393d11a76 Mon Sep 17 00:00:00 2001 From: Kaltar5679 Date: Fri, 24 Apr 2015 16:13:21 +0200 Subject: [PATCH] Base of advanced search with haystack --- telemeta/forms/haystack_form.py | 54 ++++++++++++++++++-- telemeta/haystack_urls.py | 10 ++-- telemeta/templates/search/advanceSearch.html | 48 +++++++++++++++++ telemeta/views/haystack_search.py | 38 ++++++++++++-- 4 files changed, 138 insertions(+), 12 deletions(-) create mode 100644 telemeta/templates/search/advanceSearch.html diff --git a/telemeta/forms/haystack_form.py b/telemeta/forms/haystack_form.py index 7ffe0c8a..b8700a6b 100644 --- a/telemeta/forms/haystack_form.py +++ b/telemeta/forms/haystack_form.py @@ -30,17 +30,63 @@ class HaySearchFormCollection(SearchForm): return sqs -class HayAdvanceSearchForm(ModelSearchForm): +class HayAdvanceFormItem(SearchForm): - title = forms.CharField(required=False) + cote = forms.CharField(required=False, label=('Cote'), widget=forms.TextInput(attrs={'type': 'search'})) def search(self): - sqs=SearchQuerySet().load_all() + sqs = super(HayAdvanceFormItem, self).search().models(MediaItem) if not self.is_valid(): return sqs if self.cleaned_data['q']: - sqs=sqs.filter(content__contains=self.cleaned_data['q']) + sqs = sqs.filter(content__contains=self.cleaned_data['q']) + + if self.cleaned_data['cote']: + sqs = sqs.filter(content__cote__contains=self.cleaned_data['cote']) return sqs + + +class HayAdvanceFormCollection(SearchForm): + + cote = forms.CharField(required=False, label=('Cote'), widget=forms.TextInput(attrs={'type': 'search'})) + + def search(self): + sqs = super(HayAdvanceFormCollection, self).search().models(MediaCollection) + + if not self.is_valid(): + return sqs + + if self.cleaned_data['q']: + sqs = sqs.filter(content__contains=self.cleaned_data['q']) + + if self.cleaned_data['cote']: + sqs = sqs.filter(content__cote__contains=self.cleaned_data['cote']) + + return sqs + + +class HayAdvanceForm(SearchForm): + #to replace de basic search form field + q = forms.CharField(required=False, label=('Title'), widget=forms.TextInput(attrs={'type': 'search'})) + cote = forms.CharField(required=False, label=('Cote'), widget=forms.TextInput(attrs={'type': 'search'})) + location = forms.CharField(required=False, label=('Location'), widget=forms.TextInput(attrs={'type': 'search'})) + + def search(self): + sqs = SearchQuerySet().load_all() + + if not self.is_valid(): + return sqs + + if self.cleaned_data['q']: + sqs = sqs.filter(content__title__contains=self.cleaned_data['q']) + + if self.cleaned_data['cote']: + sqs = sqs.filter(content__cote__contains=self.cleaned_data['cote']) + + if self.cleaned_data['location']: + sqs = sqs.filter(content__title__contains=self.cleaned_data['location']) + + return sqs \ No newline at end of file diff --git a/telemeta/haystack_urls.py b/telemeta/haystack_urls.py index bcd83e44..503b6a02 100644 --- a/telemeta/haystack_urls.py +++ b/telemeta/haystack_urls.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- -from django.conf.urls import patterns, url, include +from django.conf.urls import patterns, url from telemeta.views.haystack_search import * from haystack.forms import * -from telemeta.forms.haystack_form import HaySearchFormItem, HaySearchFormCollection, HayAdvanceSearchForm - urlpatterns = patterns('', - url(r'^$', HaystackSearch(form_class=HaySearchFormItem), name='haystack_search'), - url(r'^advance/$', HaystackAdvanceSearch(form_class=HayAdvanceSearchForm), name='haystack_search_advance'), + url(r'^$', HaystackSearch(), name='haystack_search'), url(r'^quick/(?P[A-Za-z0-9._-]+)/$', HaystackSearch(), name='haystack_search_type'), + url(r'^advance/$', HaystackAdvanceSearch(template='search/advanceSearch.html'), name='haystack_advance_search'), + url(r'^advance/(?P[A-Za-z0-9._-]+)/$', HaystackAdvanceSearch(template='search/advanceSearch.html'), name='haystack_advance_search_type'), + ) diff --git a/telemeta/templates/search/advanceSearch.html b/telemeta/templates/search/advanceSearch.html new file mode 100644 index 00000000..5d1abd60 --- /dev/null +++ b/telemeta/templates/search/advanceSearch.html @@ -0,0 +1,48 @@ +{% extends 'telemeta/base.html' %} +{% load telemeta_utils %} +{% load i18n %} + + +{% block title %} +{% trans "Search" %} +{% endblock %} + +{% block content %} +
+ + {{ form.as_table }} + + + + +
  + +
+ + {% if query %} +

{% trans "Results" %}

+ {% ifequal type 'item' %} +

Items ({{item_count}}) | Collections ({{collection_count}})

+ {% else %} + {% ifequal type 'collection'%} +

Items ({{item_count}}) | Collections ({{collection_count}})

+ {% endifequal %} + {% endifequal %} + {% with object_list as items %} +
+ {% include "search/mediaitem_listhaystack.html" %} +
+ + {% if page.has_previous or page.has_next %} +
+ {% if page.has_previous %}{% endif %}« Previous{% if page.has_previous %}{% endif %} + | + {% if page.has_next %}{% endif %}Next »{% if page.has_next %}{% endif %} +
+ {% endif %} + {% endwith %} + {% else %} + {# Show some example queries to run, maybe query syntax, something else? #} + {% endif %} +
+{% endblock %} diff --git a/telemeta/views/haystack_search.py b/telemeta/views/haystack_search.py index 75892281..28022c47 100644 --- a/telemeta/views/haystack_search.py +++ b/telemeta/views/haystack_search.py @@ -3,7 +3,7 @@ from haystack.views import SearchView from haystack.query import SearchQuerySet from telemeta.models import * -from telemeta.forms.haystack_form import HaySearchFormItem, HaySearchFormCollection +from telemeta.forms.haystack_form import * class HaystackSearch(SearchView): @@ -33,5 +33,37 @@ class HaystackSearch(SearchView): class HaystackAdvanceSearch(SearchView): - def get_query(self): - return super(HaystackAdvanceSearch, self).get_query() + def __call__(self, request, type=None): + self.type = type + """if(self.type == 'collection'): + self.form_class = HayAdvanceFormCollection + else: + self.form_class = HayAdvanceFormItem""" + self.form_class = HayAdvanceForm + return super(HaystackAdvanceSearch, self).__call__(request) + + def get_results(self): + if(self.type == 'collection'): + return self.form.search().models(MediaCollection) + else: + return self.form.search().models(MediaItem) + + def extra_context(self): + extra = super(HaystackAdvanceSearch, self).extra_context() + + if self.request.GET.get('q'): + extra['title'] = self.request.GET['q'] + + if self.request.GET.get('cote'): + extra['cote'] = self.request.GET['cote'] + + if self.request.GET.get('location'): + extra['location'] = self.request.GET['location'] + + extra['collection_count'] = self.form.search().models(MediaCollection).count() + extra['item_count'] = self.form.search().models(MediaItem).count() + if self.type == 'collection': + extra['type'] = 'collection' + else: + extra['type'] = 'item' + return extra -- 2.39.5