]> git.parisson.com Git - telemeta.git/commitdiff
adding faceting filters on Item Status, Player Status and Access Right
authorafilsaime <shadow_kungfu@hotmail.fr>
Tue, 28 Apr 2015 14:15:52 +0000 (16:15 +0200)
committerafilsaime <shadow_kungfu@hotmail.fr>
Tue, 28 Apr 2015 14:15:52 +0000 (16:15 +0200)
fixed haystack search.html issues with collection display
optimize urls and views

telemeta/forms/haystack_form.py
telemeta/haystack_urls.py
telemeta/search_indexes.py
telemeta/templates/search/mediacollection_listhaystack.html [new file with mode: 0644]
telemeta/templates/search/mediaitem_listhaystack.html
telemeta/templates/search/search.html
telemeta/views/haystack_search.py

index 9023c8edea3986e2607dbebe4b2b51bf161810b7..dfad2010e9a3a0e3e4dc2bedaf29d476498aa384 100644 (file)
@@ -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
 
index 35f0a27257e6deb203f7594263222361aaee3076..be88ada0658a454f9ef2dee1a73bd09d6bf12146 100644 (file)
@@ -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<type>[A-Za-z0-9._-]+)/$', HaystackSearch(), name='haystack_search_type'),
 
 )
index ae7e95bf5a57a187c005988607b5d78c58213e23..b845312b59ea6f281f998bf0b6956815263ae91e 100644 (file)
@@ -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 (file)
index 0000000..07a90d4
--- /dev/null
@@ -0,0 +1,44 @@
+{% load telemeta_utils %}
+{% load i18n %}
+
+{% if page.object_list %}
+
+<table class="listing">
+<tr>
+    <th class="highlight">{% trans "Title" %}</th>
+    <th>{% trans "Digitized" %}</th>
+    <th>{% field_label "MediaCollection" "creator" %}</th>
+    <th>{% trans "Recordist" %}</th>
+    <th>{% trans "Recording period" %}</th>
+    <th>{% trans "Code" %}</th>
+</tr>
+{% for result in page.object_list %}
+<tr {% if not forloop.counter0|divisibleby:"2" %}class="odd"{% endif %}>
+    <td class="highlight">
+        <a href="{% url "telemeta-collection-detail" result.object.public_id %}">{{ result.object.title }}</a>
+    </td>
+    <td>
+      {% if result.object.has_mediafile %}
+       <center><span class="glyphicon glyphicon-volume-up" style="font-size: 1.3em;"></span></center>
+      {% endif %}
+    </td>
+
+    <td>{{ result.object.creator }}</td>
+    <td>{{ result.object.apparent_collector }}</td>
+    <td>
+    {% 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 %}
+    </td>
+    <td>
+        {{ result.object.code|default:result.object.old_code }}
+    </td>
+</tr>
+{% endfor %}
+</table>
+{% else %}
+    <p>{% trans "No collection" %}</p>
+{% endif %}
index 4e94150a4a7926aeac88d65e22b5ec209c452cab..cce0dc7d100ee1b475e2d70d3cd69819e30b6060 100644 (file)
 {% for result in page.object_list %}
 <tr {% if not forloop.counter0|divisibleby:"2" %}class="odd"{% endif %}>
     <td class="highlight">
-        {%ifequal type 'item'%}
-            <a href="{% url "telemeta-item-detail" result.object.public_id %}">{{ result.object.title }}</a>
-        {%else%}
-            {%ifequal type 'collection'%}
-                <a href="{% url "telemeta-collection-detail" result.object.public_id %}">{{ result.object.title }}</a>
-            {%endifequal%}
-        {%endifequal%}
+        <a href="{% url "telemeta-item-detail" result.object.public_id %}">{{ result.object.title }}</a></br>
     </td>
     <td align="center">
         {% if result.object.file %}
@@ -53,5 +47,5 @@
 {% endfor %}
 </table>
 {% else %}
-    <p>{% trans "No item" %}</p>
+    <p>{% trans "No results found" %}</p>
 {% endif %}
index ff2cb576ad144a2879cf198571cc131ae19ce07f..9d5b0f2a7ae4f2d09701fae6d72f1221c36ae14f 100644 (file)
         </table>
 
         {% if query %}
+
+
+
+
             <h1>{% trans "Results" %}</h1>
+
             {% ifequal type 'item' %}
-                 <p><b>Items ({{item_count}}) | <a href="{% url "haystack_search_type" "collection" %}?q={{ query }}&amp;page=1">Collections ({{collection_count}})</a></b></p>
+                 <p><b>Items ({{item_count}}) | <a href="{% url "haystack_search_type" "collection" %}?{{request.GET.urlencode}}">Collections ({{collection_count}})</a></b></p>
              {% else %}
                 {% ifequal type 'collection'%}
-                    <p><b><a href="{% url "haystack_search_type" "item" %}?q={{ query }}&amp;page=1">Items ({{item_count}}) </a>| Collections ({{collection_count}})</b></p>
+                    <p><b><a href="{% url "haystack_search_type" "item" %}?{{request.GET.urlencode}}">Items ({{item_count}}) </a>| Collections ({{collection_count}})</b></p>
                 {% endifequal %}
              {% endifequal %}
+            <div class="panel panel-default" style="font-weight:bold">
+                <div class="panel-heading" style="background-color:#6a0307;color:white;">Filters</div>
+                <table class="table" style="font-size:0.9em">
+                    <tr>
+                        {% if facets.fields.item_status %}
+                            <td>Item Status</td>
+                            {% for item_status in facets.fields.item_status %}
+                                <td><a href="{{ request.get_full_path }}&amp;selected_facets=item_status_exact:{{ item_status.0|urlencode }}">{{ item_status.0 }}</a> ({{ item_status.1 }})</td>
+                            {% endfor %}
+                        {% else %}
+                            <p>No acces facets.</p>
+                        {% endif %}
+                    </tr>
+                    <tr>
+                        {% if facets.fields.digitized %}
+                            <td>Player Status</td>
+                            {% for digitized in facets.fields.digitized %}
+                                {% ifequal digitized.0 'T' %}
+                                    <td><a href="{{ request.get_full_path }}&amp;selected_facets=digitized_exact:{{ digitized.0|urlencode }}">Sound</a> ({{ digitized.1 }})</td><td></td>
+                                {% endifequal %}
+                            {% endfor %}
+                        {% else %}
+                            <p>No acces facets.</p>
+                        {% endif %}
+                    </tr>
+                    <tr>
+                        {% if facets.fields.item_acces %}
+                            <td>Access Right</td>
+                            {% if viewable_count != 0 %}
+                                <td><a href="{{ request.get_full_path }}&amp;selected_facets=item_acces_exact:{{ 'viewable'|urlencode }}">viewable</a> ({{viewable_count}})</td><td></td>
+                            {% 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' %}
+                                        <td><a href="{{ request.get_full_path }}&amp;selected_facets=item_acces_exact:{{ item_acces.0|urlencode }}">{{ item_acces.0 }}</a> ({{ item_acces.1 }})</td>
+                                    {% endifequal %}
+                                {% endfor %}
+                            {%endcomment%}
+                        {% else %}
+                            <p>No acces facets.</p>
+                        {% endif %}
+                    </tr>
+                </table>
+            </div>
              {% with object_list as items %}
                 <div class="fullpage">
-                    {% include "search/mediaitem_listhaystack.html" %}
+                    {% ifequal type 'item' %}
+                        {% include "search/mediaitem_listhaystack.html" %}
+                    {% else %}
+                        {% ifequal type 'collection' %}
+                            {% include "search/mediacollection_listhaystack.html" %}
+                        {%endifequal%}
+                    {%endifequal%}
                 </div>
 
                 {% if page.has_previous or page.has_next %}
index eda86b2ddd7da8223c1db114a94d0a2ff1b03080..d6cd0cfa18a9f085ce086e81e2da336c46c493e5 100644 (file)
@@ -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: