from haystack.forms import *
from haystack.query import SearchQuerySet
-class HaySearchFormItem(SearchForm):
+class HaySearchForm(FacetedSearchForm):
def search(self):
sqs=SearchQuerySet().load_all()
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
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'),
)
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
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
--- /dev/null
+{% 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 %}
{% 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 %}
{% endfor %}
</table>
{% else %}
- <p>{% trans "No item" %}</p>
+ <p>{% trans "No results found" %}</p>
{% endif %}
</table>
{% if query %}
+
+
+
+
<h1>{% trans "Results" %}</h1>
+
{% ifequal type 'item' %}
- <p><b>Items ({{item_count}}) | <a href="{% url "haystack_search_type" "collection" %}?q={{ query }}&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 }}&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 }}&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 }}&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 }}&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 }}&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 %}
# -*- 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)
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: