From 9d8f0e887b4f894453511ba77bd31187229ce221 Mon Sep 17 00:00:00 2001 From: Raouf Benmansour Date: Thu, 17 Dec 2015 13:39:27 +0100 Subject: [PATCH] =?utf8?q?Corpus=20and=20Fonds=20added=20in=20the=20search?= =?utf8?q?=20module=20+=20Submodule=20locale=20mis=20=C3=A0=20jour?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- examples/sandbox/settings.py | 3 +- telemeta/forms/haystack_form.py | 10 ++- telemeta/locale | 2 +- telemeta/models/collection.py | 1 - telemeta/search_indexes.py | 65 ++++++++++++++++++- telemeta/templates/search/advanceSearch.html | 44 ++++++++++--- .../indexes/telemeta/mediacollection_text.txt | 5 ++ .../indexes/telemeta/mediaitem_text.txt | 12 +++- telemeta/templates/search/search.html | 56 ++++++++++++---- telemeta/views/haystack_search.py | 58 ++++++++++++----- 10 files changed, 211 insertions(+), 45 deletions(-) diff --git a/examples/sandbox/settings.py b/examples/sandbox/settings.py index a79eea62..a0c35532 100644 --- a/examples/sandbox/settings.py +++ b/examples/sandbox/settings.py @@ -281,7 +281,7 @@ LOGGING = { BROKER_URL = 'amqp://guest:guest@rabbitmq//' CELERY_IMPORTS = ("timeside.server.tasks",) -CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend' +CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend' CELERY_TASK_SERIALIZER = "json" CELERY_ACCEPT_CONTENT = ['application/json'] @@ -293,6 +293,7 @@ HAYSTACK_CONNECTIONS = { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://search:9200/', 'INDEX_NAME': 'haystack', + 'INLUDE_SPELLING': True, }, } diff --git a/telemeta/forms/haystack_form.py b/telemeta/forms/haystack_form.py index 945509e8..85373e59 100644 --- a/telemeta/forms/haystack_form.py +++ b/telemeta/forms/haystack_form.py @@ -30,8 +30,9 @@ # The fact that you are presently reading this means that you have had # knowledge of the CeCILL license and that you accept its terms. # -# Authors: Angy Fil-Aimé +# Authors: Angy Fils-Aimé # Killian Mary +# Novembre 2015 : Raouf Benmansour from telemeta.models import * @@ -52,7 +53,12 @@ class HaySearchForm(FacetedSearchForm): return sqs if self.cleaned_data['q']: - sqs = sqs.filter(content__contains=self.cleaned_data['q']).facet('item_acces').facet('item_status').facet('digitized').facet('recording_context').facet('physical_format').facet('media_type') + #search input of a code, contains at least '_YYYY_' + if not re.match('([a-zA-Z]*_?[EI])?_[0-9]{4}_([0-9]{3}_[0-9]{3})?', self.cleaned_data.get('q')): + sqs = sqs.filter(content__contains=self.cleaned_data['q']).facet('item_acces').facet('item_status').facet('digitized').facet('recording_context').facet('physical_format').facet('media_type') + else: + sqs = sqs.filter(code__exact=self.cleaned_data['q']).facet('item_acces').facet('item_status').facet('digitized').facet('recording_context').facet('physical_format').facet('media_type') + print(self.cleaned_data['q']) for facet in self.selected_facets: if ":" not in facet: diff --git a/telemeta/locale b/telemeta/locale index 91973b13..030ff8fb 160000 --- a/telemeta/locale +++ b/telemeta/locale @@ -1 +1 @@ -Subproject commit 91973b13f9dc9405052727c0c525d342dee15562 +Subproject commit 030ff8fbada394775abfd9deec770706dd531acc diff --git a/telemeta/models/collection.py b/telemeta/models/collection.py index 2b76bda4..600e028b 100644 --- a/telemeta/models/collection.py +++ b/telemeta/models/collection.py @@ -54,7 +54,6 @@ collection_unpublished_code_regex = getattr(settings, 'COLLECTION_UNPUBLISHED_CO collection_code_regex = '(?:%s|%s)' % (collection_published_code_regex, collection_unpublished_code_regex) - class MediaCollection(MediaResource): "Describe a collection of items" diff --git a/telemeta/search_indexes.py b/telemeta/search_indexes.py index 47b1814a..6162cbfe 100644 --- a/telemeta/search_indexes.py +++ b/telemeta/search_indexes.py @@ -12,6 +12,7 @@ class MediaItemIndex(indexes.SearchIndex, indexes.Indexable): media_type = indexes.CharField(model_attr='media_type', null='None', faceted=True) recording_context = indexes.CharField(model_attr='collection__recording_context', default='', faceted=True) physical_format = indexes.CharField(model_attr='collection__physical_format', default='', faceted=True) + #content_auto = indexes.EdgeNgramField(model_attr='content') #advance search title = indexes.NgramField(model_attr='title') @@ -82,6 +83,7 @@ class MediaCollectionIndex(indexes.SearchIndex, indexes.Indexable): media_type = indexes.CharField(model_attr='media_type', null='None', faceted=True) recording_context = indexes.CharField(model_attr='recording_context', default='', faceted=True) physical_format = indexes.CharField(model_attr='physical_format', default='', faceted=True) + #content_auto = indexes.EdgeNgramField(model_attr='content') #advance search title = indexes.NgramField(model_attr='title') @@ -151,4 +153,65 @@ class MediaCollectionIndex(indexes.SearchIndex, indexes.Indexable): if obj.recorded_to_year != 0: return datetime.date(int(obj.recorded_to_year), 01, 01) else: - return None \ No newline at end of file + return None + + +class MediaCorpusIndex(indexes.SearchIndex, indexes.Indexable): + + text = indexes.CharField(document=True, use_template=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) + #media_type = indexes.CharField(model_attr='media_type', null='None', faceted=True) + #recording_context = indexes.CharField(model_attr='recording_context', default='', faceted=True) + #physical_format = indexes.CharField(model_attr='collection__physical_format', default='', faceted=True) + #content_auto = indexes.EdgeNgramField(model_attr='content') + + #advance search + title = indexes.NgramField(model_attr='title') + code = indexes.NgramField(model_attr='code', default='') + #location_principal = indexes.CharField(default='', boost=1.05) + #location_relation = indexes.CharField() + #ethnic_group = indexes.CharField(default='') + #instruments = indexes.NgramField(default='') + #collectors = indexes.NgramField(model_attr='collector', default='') + #recorded_from_date = indexes.DateField(model_attr='recorded_from_year', null=True) + recorded_to_date = indexes.DateField(model_attr='recorded_to_year', null=True) + #year_published = indexes.IntegerField(model_attr='year_published', default='') + + def prepare_digitized(self, obj): + return obj.has_mediafile + + def get_model(self): + return MediaCorpus + + +class MediaFondsIndex(indexes.SearchIndex, indexes.Indexable): + + text = indexes.CharField(document=True, use_template=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) + #media_type = indexes.CharField(model_attr='media_type', null='None', faceted=True) + #recording_context = indexes.CharField(model_attr='recording_context', default='', faceted=True) + #physical_format = indexes.CharField(model_attr='physical_format', default='', faceted=True) + #content_auto = indexes.EdgeNgramField(model_attr='content') + + #advance search + title = indexes.NgramField(model_attr='title') + code = indexes.NgramField(model_attr='code', default='') + #location_principal = indexes.CharField(default='', boost=1.05) + #location_relation = indexes.CharField() + #ethnic_group = indexes.CharField(default='') + #instruments = indexes.NgramField(default='') + #collectors = indexes.NgramField(model_attr='collector', default='') + #recorded_from_date = indexes.DateField(model_attr='recorded_from_year', null=True) + #recorded_to_date = indexes.DateField(model_attr='recorded_to_year', null=True) + #year_published = indexes.IntegerField(model_attr='year_published', default='') + + def prepare_digitized(self, obj): + return obj.has_mediafile + + def get_model(self): + return MediaFonds + diff --git a/telemeta/templates/search/advanceSearch.html b/telemeta/templates/search/advanceSearch.html index df3ef20e..ca1c381a 100644 --- a/telemeta/templates/search/advanceSearch.html +++ b/telemeta/templates/search/advanceSearch.html @@ -22,7 +22,7 @@
{{form.collectors.errors}} - {{ form.collectors.label_tag }}
+ {% trans form.collectors.label_tag %}
{{form.collectors}}
@@ -151,12 +151,20 @@
{% ifequal type 'item' %} -

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

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

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

+

Items ({{item_count}}) | Collections ({{collection_count}}) | Corpus ({{corpus_count}}) | Fonds ({{fonds_count}})

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

Items ({{item_count}}) | Collections ({{collection_count}}) | Corpus ({{corpus_count}}) | Fonds ({{fonds_count}})

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

Items ({{item_count}}) | Collections ({{collection_count}}) | Corpus ({{corpus_count}}) | Fonds ({{fonds_count}})

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

Items ({{item_count}}) | Collections ({{collection_count}}) | Corpus ({{corpus_count}}) | Fonds ({{fonds_count}})

+ {% endifequal %} + {% endifequal %} {% endifequal %} - {% endifequal %} + {% endifequal %}
@@ -181,8 +189,16 @@ {% ifequal type 'item' %} {% include "search/mediaitem_listhaystack.html" %} {% else %} - {% ifequal type 'collection' %} - {% include "search/mediacollection_listhaystack.html" %} + {% ifequal type 'corpus' %} + {% include "search/mediacorpus_listhaystack.html" %} + {% else %} + {% ifequal type 'fonds' %} + {% include "search/mediafonds_listhaystack.html" %} + {% else %} + {% ifequal type 'collection' %} + {% include "search/mediacollection_listhaystack.html" %} + {%endifequal%} + {%endifequal%} {%endifequal%} {%endifequal%}
@@ -191,8 +207,16 @@ {% ifequal type 'item' %} {% include "search/mediaitem_listhaystack.html" %} {% else %} - {% ifequal type 'collection' %} - {% include "search/mediacollection_listhaystack.html" %} + {% ifequal type 'corpus' %} + {% include "search/mediacorpus_listhaystack.html" %} + {% else %} + {% ifequal type 'fonds' %} + {% include "search/mediafonds_listhaystack.html" %} + {% else %} + {% ifequal type 'collection' %} + {% include "search/mediacollection_listhaystack.html" %} + {%endifequal%} + {%endifequal%} {%endifequal%} {%endifequal%}
diff --git a/telemeta/templates/search/indexes/telemeta/mediacollection_text.txt b/telemeta/templates/search/indexes/telemeta/mediacollection_text.txt index a877fddd..fc4648cb 100644 --- a/telemeta/templates/search/indexes/telemeta/mediacollection_text.txt +++ b/telemeta/templates/search/indexes/telemeta/mediacollection_text.txt @@ -5,6 +5,8 @@ {{ object.recorded_to_year }} {{ object.description }} {{ object.collector }} +{{ object.publisher_id }} +{{ object.publisher_collection_id }} {{ object.publisher_serial }} {{ object.booklet_author }} {{ object.external_references }} @@ -16,4 +18,7 @@ {{ object.items_done }} {{ object.conservation_site }} {{ object.location }} +{{ object.code }} +{{ object.countries }} +{{ object.ethnic_groups }} {{ object.body }} diff --git a/telemeta/templates/search/indexes/telemeta/mediaitem_text.txt b/telemeta/templates/search/indexes/telemeta/mediaitem_text.txt index bdcde2c2..afe92cfc 100644 --- a/telemeta/templates/search/indexes/telemeta/mediaitem_text.txt +++ b/telemeta/templates/search/indexes/telemeta/mediaitem_text.txt @@ -1,12 +1,22 @@ {{ object.title }} {{ object.alt_title }} +{{ object.collector }} {{ object.recorded_from_date }} {{ object.recorded_to_date }} {{ object.code }} +{{ object.old_code }} {{ object.location }} {{ object.location.name }} {{ object.comment }} {{ object.external_references }} {{ object.location_comment }} {{ object.cultural_area }} -{{ object.body }} +{{ object.language }} +{{ object.language_iso_id }} +{{ object.ethnic_group_id }} +{{ object.context_comment }} +{{ object.moda_execut }} +{{ object.vernacular_style_id }} +{{ object.generic_style_id }} +#{{ object.instrument_vernacular_names }} +{{ object.body }} \ No newline at end of file diff --git a/telemeta/templates/search/search.html b/telemeta/templates/search/search.html index 125a8776..ada51828 100644 --- a/telemeta/templates/search/search.html +++ b/telemeta/templates/search/search.html @@ -19,15 +19,23 @@
 
-
+
- {% ifequal type 'item' %} -

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

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

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

+ {% ifequal type 'collection'%} +

Items ({{item_count}}) | Collections ({{collection_count}}) | Corpus ({{corpus_count}}) | Fonds ({{corpus_count}})

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

Items ({{item_count}}) | Collections ({{collection_count}}) | Corpus ({{corpus_count}}) | Fonds ({{corpus_count}})

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

Items ({{item_count}}) | Collections ({{collection_count}}) | Corpus ({{corpus_count}}) | Fonds ({{corpus_count}})

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

Items ({{item_count}}) | Collections ({{collection_count}}) | Corpus ({{corpus_count}}) | Fonds ({{corpus_count}})

+ {% endifequal %} + {% endifequal %} {% endifequal %} - {% endifequal %} + {% endifequal %}
@@ -56,22 +64,46 @@ {% else %} {% ifequal type 'collection' %} {% include "search/mediacollection_listhaystack.html" %} + {% else %} + {% ifequal type 'corpus' %} + {% include "search/mediacorpus_listhaystack.html" %} + {% else %} + {% ifequal type 'fonds' %} + {% include "search/mediafonds_listhaystack.html" %} + {% else %} + {% ifequal type 'fonds' %} + {% include "search/mediafonds_listhaystack.html" %} + {%endifequal%} + {%endifequal%} + {%endifequal%} {%endifequal%} {%endifequal%}
- {% endwith %} + {% if user.is_authenticated %} diff --git a/telemeta/views/haystack_search.py b/telemeta/views/haystack_search.py index 0d7d5b7f..45bc27d7 100644 --- a/telemeta/views/haystack_search.py +++ b/telemeta/views/haystack_search.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from haystack.views import * -#from haystack.query import SearchQuerySet +from haystack.query import SearchQuerySet from telemeta.models import * from telemeta.forms.haystack_form import * @@ -13,7 +13,7 @@ class HaystackSearch(FacetedSearchView): self.form_class = HaySearchForm self.selected_facet = self.selected_facet_list(request.GET.getlist('selected_facets', ['a'])) if request.GET.get('results_page'): - self.results_per_page=int(request.GET.get('results_page')) + self.results_per_page = int(request.GET.get('results_page')) else: self.results_per_page = 20 return super(HaystackSearch, self).__call__(request) @@ -22,13 +22,17 @@ class HaystackSearch(FacetedSearchView): return super(HaystackSearch, self).get_query() def get_results(self): - if(self.type == 'collection'): - return super(HaystackSearch, self).get_results().models(MediaCollection) - else: + if(self.type == 'item'): return super(HaystackSearch, self).get_results().models(MediaItem) + elif(self.type == 'corpus'): + return super(HaystackSearch, self).get_results().models(MediaCorpus) + elif(self.type == 'fonds'): + return super(HaystackSearch, self).get_results().models(MediaFonds) + else: + return super(HaystackSearch, self).get_results().models(MediaCollection) - def selected_facet_list(self,selected_facets): - facet_list=[] + def selected_facet_list(self, selected_facets): + facet_list = [] for facet in selected_facets: if ":" not in facet: continue @@ -36,7 +40,7 @@ class HaystackSearch(FacetedSearchView): field, value = facet.split(":", 1) if value and not value in facet_list: - if field=='digitized_exact': + if field == 'digitized_exact': facet_list.append('Sound') else: facet_list.append(value) @@ -47,6 +51,8 @@ class HaystackSearch(FacetedSearchView): extra = super(HaystackSearch, self).extra_context() extra['collection_count'] = super(HaystackSearch, self).get_results().models(MediaCollection).count() extra['item_count'] = super(HaystackSearch, self).get_results().models(MediaItem).count() + extra['corpus_count'] = super(HaystackSearch, self).get_results().models(MediaCorpus).count() + extra['fonds_count'] = super(HaystackSearch, self).get_results().models(MediaFonds).count() if extra['facets']: viewable_total = 0 @@ -68,23 +74,31 @@ class HaystackSearch(FacetedSearchView): extra['Radio_count'] = self.get_results().narrow('recording_context:Radio').count() extra['Video_count'] = self.get_results().narrow('media_type:Video').count() extra['Audio_count'] = self.get_results().narrow('media_type:Audio').count() - if self.type == 'collection': - extra['type'] = 'collection' - else: + if self.type == 'item': extra['type'] = 'item' + elif self.type == 'fonds': + extra['type'] = 'fonds' + elif self.type == 'corpus': + extra['type'] = 'corpus' + else: + extra['type'] = 'collection' extra['selected_facets'] = self.selected_facet extra['selected_facets_url'] = self.request.GET.getlist('selected_facets') extra['results_page'] = self.results_per_page return extra + #def auto_complete(request): + #content = SearchQuerySet().autocomplete(content_auto=request.POST.get('seatch_text', '')) + + #return render_to_response('', {'content' : content]) class HaystackAdvanceSearch(SearchView): def __call__(self, request, type=None): self.type = type if request.GET.get('results_page'): - self.results_per_page=int(request.GET.get('results_page')) + self.results_per_page = int(request.GET.get('results_page')) else: self.results_per_page = 20 return super(HaystackAdvanceSearch, self).__call__(request) @@ -97,18 +111,30 @@ class HaystackAdvanceSearch(SearchView): return '' def get_results(self): - if(self.type == 'collection'): + if(self.type == 'item'): + return self.form.search().models(MediaItem) + elif(self.type == 'collection'): return self.form.search().models(MediaCollection) + elif(self.type == 'corpus'): + return self.form.search().models(MediaCorpus) else: - return self.form.search().models(MediaItem) + return self.form.search().models(MediaFonds) def extra_context(self): extra = super(HaystackAdvanceSearch, self).extra_context() + extra['fonds_count'] = self.form.search().models(MediaFonds).count() + extra['corpus_count'] = self.form.search().models(MediaCorpus).count() extra['collection_count'] = self.form.search().models(MediaCollection).count() extra['item_count'] = self.form.search().models(MediaItem).count() - if self.type == 'collection': + + if self.type == 'item': + extra['type'] = 'item' + elif self.type == 'collection': extra['type'] = 'collection' + elif(self.type == 'corpus'): + extra['type'] = 'corpus' else: - extra['type'] = 'item' + extra['type'] = 'fonds' + extra['results_page'] = self.results_per_page return extra -- 2.39.5