From a36ce6a26f9dfbaf3b8356583c9cca94d91bccbd Mon Sep 17 00:00:00 2001 From: afilsaime Date: Tue, 28 Apr 2015 16:15:52 +0200 Subject: [PATCH] adding faceting filters on Item Status, Player Status and Access Right fixed haystack search.html issues with collection display optimize urls and views --- telemeta/forms/haystack_form.py | 23 +++---- telemeta/haystack_urls.py | 3 +- telemeta/search_indexes.py | 16 ++++- .../search/mediacollection_listhaystack.html | 44 +++++++++++++ .../search/mediaitem_listhaystack.html | 10 +-- telemeta/templates/search/search.html | 62 ++++++++++++++++++- telemeta/views/haystack_search.py | 31 +++++++--- 7 files changed, 156 insertions(+), 33 deletions(-) create mode 100644 telemeta/templates/search/mediacollection_listhaystack.html diff --git a/telemeta/forms/haystack_form.py b/telemeta/forms/haystack_form.py index 9023c8ed..dfad2010 100644 --- a/telemeta/forms/haystack_form.py +++ b/telemeta/forms/haystack_form.py @@ -3,7 +3,7 @@ from telemeta.models import * from haystack.forms import * from haystack.query import SearchQuerySet -class HaySearchFormItem(SearchForm): +class HaySearchForm(FacetedSearchForm): def search(self): sqs=SearchQuerySet().load_all() @@ -12,20 +12,21 @@ class HaySearchFormItem(SearchForm): return sqs if self.cleaned_data['q']: - sqs=sqs.models(MediaItem).filter(content__contains=self.cleaned_data['q']) + sqs=sqs.filter(content__contains=self.cleaned_data['q']).facet('item_acces').facet('item_status').facet('digitized') - return sqs + for facet in self.selected_facets: + if ":" not in facet: + continue -class HaySearchFormCollection(SearchForm): + field, value = facet.split(":", 1) - def search(self): - sqs=SearchQuerySet().load_all() + if value: + if value == 'viewable': + sqs = sqs.narrow('item_acces:full OR item_acces:metadata OR item_acces:mixed') + else: + sqs = sqs.narrow(u'%s:"%s"' % (field, sqs.query.clean(value))) - if not self.is_valid(): - return sqs + return sqs - if self.cleaned_data['q']: - sqs=sqs.models(MediaCollection).filter(content__contains=self.cleaned_data['q']) - return sqs diff --git a/telemeta/haystack_urls.py b/telemeta/haystack_urls.py index 35f0a272..be88ada0 100644 --- a/telemeta/haystack_urls.py +++ b/telemeta/haystack_urls.py @@ -4,8 +4,9 @@ from telemeta.views.haystack_search import * from haystack.forms import * + urlpatterns = patterns('', - url(r'^$', HaystackSearch(form_class=HaySearchFormItem), name='haystack_search'), + url(r'^$', HaystackSearch(), name='haystack_search'), url(r'^quick/(?P[A-Za-z0-9._-]+)/$', HaystackSearch(), name='haystack_search_type'), ) diff --git a/telemeta/search_indexes.py b/telemeta/search_indexes.py index ae7e95bf..b845312b 100644 --- a/telemeta/search_indexes.py +++ b/telemeta/search_indexes.py @@ -7,6 +7,15 @@ class MediaItemIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) item_acces = indexes.CharField(model_attr= 'collection__public_access' , faceted=True) item_status = indexes.CharField(model_attr= 'collection__document_status' , faceted=True) + digitized = indexes.BooleanField(default=False , faceted=True) + + def prepare_digitized(self,obj): + if obj.file.name: + return True + elif '/' in obj.url: + return True + else: + return False def get_model(self): return MediaItem @@ -15,7 +24,12 @@ class MediaItemIndex(indexes.SearchIndex, indexes.Indexable): class MediaCollectionIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.NgramField(document=True, use_template=True) - #rec_date = indexes.DateTimeField(use_template=True, null=True) + item_acces = indexes.CharField(model_attr= 'public_access' , faceted=True) + item_status = indexes.CharField(model_attr= 'document_status' , faceted=True) + digitized = indexes.BooleanField(default=False , faceted=True) + + def prepare_digitized(self,obj): + return obj.has_mediafile def get_model(self): return MediaCollection \ No newline at end of file diff --git a/telemeta/templates/search/mediacollection_listhaystack.html b/telemeta/templates/search/mediacollection_listhaystack.html new file mode 100644 index 00000000..07a90d4b --- /dev/null +++ b/telemeta/templates/search/mediacollection_listhaystack.html @@ -0,0 +1,44 @@ +{% load telemeta_utils %} +{% load i18n %} + +{% if page.object_list %} + + + + + + + + + + +{% for result in page.object_list %} + + + + + + + + + +{% endfor %} +
{% trans "Title" %}{% trans "Digitized" %}{% field_label "MediaCollection" "creator" %}{% trans "Recordist" %}{% trans "Recording period" %}{% trans "Code" %}
+ {{ result.object.title }} + + {% if result.object.has_mediafile %} +
+ {% endif %} +
{{ result.object.creator }}{{ result.object.apparent_collector }} + {% if result.object.recorded_from_year %} + {{ result.object.recorded_from_year }} + {% if result.object.recorded_to_year and not result.object.recorded_to_year|equals:result.object.recorded_from_year %} + - {{ result.object.recorded_to_year }} + {% endif %} + {% endif %} + + {{ result.object.code|default:result.object.old_code }} +
+{% else %} +

{% trans "No collection" %}

+{% endif %} diff --git a/telemeta/templates/search/mediaitem_listhaystack.html b/telemeta/templates/search/mediaitem_listhaystack.html index 4e94150a..cce0dc7d 100644 --- a/telemeta/templates/search/mediaitem_listhaystack.html +++ b/telemeta/templates/search/mediaitem_listhaystack.html @@ -21,13 +21,7 @@ {% for result in page.object_list %} - {%ifequal type 'item'%} - {{ result.object.title }} - {%else%} - {%ifequal type 'collection'%} - {{ result.object.title }} - {%endifequal%} - {%endifequal%} + {{ result.object.title }}
{% if result.object.file %} @@ -53,5 +47,5 @@ {% endfor %} {% else %} -

{% trans "No item" %}

+

{% trans "No results found" %}

{% endif %} diff --git a/telemeta/templates/search/search.html b/telemeta/templates/search/search.html index ff2cb576..9d5b0f2a 100644 --- a/telemeta/templates/search/search.html +++ b/telemeta/templates/search/search.html @@ -21,17 +21,73 @@ {% if query %} + + + +

{% trans "Results" %}

+ {% ifequal type 'item' %} -

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

+

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

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

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

+

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

{% endifequal %} {% endifequal %} +
+
Filters
+ + + {% if facets.fields.item_status %} + + {% for item_status in facets.fields.item_status %} + + {% endfor %} + {% else %} +

No acces facets.

+ {% endif %} + + + {% if facets.fields.digitized %} + + {% for digitized in facets.fields.digitized %} + {% ifequal digitized.0 'T' %} + + {% endifequal %} + {% endfor %} + {% else %} +

No acces facets.

+ {% endif %} + + + {% if facets.fields.item_acces %} + + {% if viewable_count != 0 %} + + {% endif %} + {% comment %} + {% for item_acces in facets.fields.item_acces %} + {# Faire un booleen dans la vue, le passer en contexte puis verifier si il est a true ou a false pour l'affichage' #} + {% ifequal item_acces.0 'none' %} + + {% endifequal %} + {% endfor %} + {%endcomment%} + {% else %} +

No acces facets.

+ {% endif %} + +
Item Status{{ item_status.0 }} ({{ item_status.1 }})
Player StatusSound ({{ digitized.1 }})
Access Rightviewable ({{viewable_count}}){{ item_acces.0 }} ({{ item_acces.1 }})
+
{% with object_list as items %}
- {% include "search/mediaitem_listhaystack.html" %} + {% ifequal type 'item' %} + {% include "search/mediaitem_listhaystack.html" %} + {% else %} + {% ifequal type 'collection' %} + {% include "search/mediacollection_listhaystack.html" %} + {%endifequal%} + {%endifequal%}
{% if page.has_previous or page.has_next %} diff --git a/telemeta/views/haystack_search.py b/telemeta/views/haystack_search.py index eda86b2d..d6cd0cfa 100644 --- a/telemeta/views/haystack_search.py +++ b/telemeta/views/haystack_search.py @@ -1,18 +1,15 @@ # -*- coding: utf-8 -*- -from haystack.views import SearchView +from haystack.views import * from haystack.query import SearchQuerySet from telemeta.models import * -from telemeta.forms.haystack_form import HaySearchFormItem, HaySearchFormCollection +from telemeta.forms.haystack_form import HaySearchForm -class HaystackSearch(SearchView): +class HaystackSearch(FacetedSearchView): def __call__(self,request,type=None): self.type = type - if(self.type=='collection'): - self.form_class=HaySearchFormCollection - else: - self.form_class=HaySearchFormItem + self.form_class=HaySearchForm return super(HaystackSearch,self).__call__(request) @@ -20,10 +17,26 @@ class HaystackSearch(SearchView): def get_query(self): return super(HaystackSearch, self).get_query() + def get_results(self): + if(self.type == 'collection'): + return super(HaystackSearch, self).get_results().models(MediaCollection) + else: + return super(HaystackSearch, self).get_results().models(MediaItem) + def extra_context(self): extra = super(HaystackSearch, self).extra_context() - extra['collection_count']=SearchQuerySet().load_all().models(MediaCollection).filter(content__contains=self.get_query()).count() - extra['item_count']=SearchQuerySet().load_all().models(MediaItem).filter(content__contains=self.get_query()).count() + extra['collection_count']=super(HaystackSearch, self).get_results().models(MediaCollection).count() + extra['item_count']=super(HaystackSearch, self).get_results().models(MediaItem).count() + + if extra['facets']: + viewable_total = 0 + for viewable in extra['facets']['fields']['item_acces']: + if viewable == 'none': + pass + else: + viewable_total = viewable_total + viewable[1] + + extra['viewable_count']=self.get_results().narrow('item_acces:full OR item_acces:metadata OR item_acces:mixed').count() if self.type=='collection': extra['type']='collection' else: -- 2.39.5