From: Kaltar5679 Date: Wed, 29 Apr 2015 07:57:33 +0000 (+0200) Subject: Merge branch 'feature/haystack' of github.com:afilsaime/Telemeta into feature/haystack X-Git-Tag: 1.6a^2~15^2~81 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=7275c8bfbe06d8d56420b5e996999ad8e7df80fc;p=telemeta.git Merge branch 'feature/haystack' of github.com:afilsaime/Telemeta into feature/haystack Conflicts: telemeta/search_indexes.py telemeta/views/haystack_search.py --- 7275c8bfbe06d8d56420b5e996999ad8e7df80fc diff --cc telemeta/forms/haystack_form.py index f28688d1,dfad2010..6ff97c0d --- a/telemeta/forms/haystack_form.py +++ b/telemeta/forms/haystack_form.py @@@ -12,82 -12,21 +12,82 @@@ class HaySearchForm(FacetedSearchForm) 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 + +class HayAdvanceFormItem(SearchForm): + + cote = forms.CharField(required=False, label=('Cote'), widget=forms.TextInput(attrs={'type': 'search'})) + + def search(self): + 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']) + + 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 self.no_query_found() + + if self.cleaned_data.get('q'): + sqs = sqs.filter(title__title__contains=self.cleaned_data['q']) + + if self.cleaned_data.get('cote'): + sqs = sqs.filter(cote__cote__contains=self.cleaned_data['cote']) + + if self.cleaned_data.get('location'): + sqs = sqs.filter(location__location__contains=self.cleaned_data['location']) + - return sqs ++ return sqs diff --cc telemeta/search_indexes.py index 70b610f1,b845312b..27c45ce2 --- a/telemeta/search_indexes.py +++ b/telemeta/search_indexes.py @@@ -5,11 -5,17 +5,20 @@@ from telemeta.models import 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): ++ item_acces = indexes.CharField(model_attr='collection__public_access', faceted=True) ++ item_status = indexes.CharField(model_attr='collection__document_status', faceted=True) + title = indexes.NgramField(model_attr='title') + code = indexes.NgramField(model_attr='code') + location = indexes.NgramField(model_attr='location__name', default='') ++ 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 @@@ -18,13 -24,12 +27,19 @@@ class MediaCollectionIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.NgramField(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) - - def prepare_digitized(self,obj): + #rec_date = indexes.DateTimeField(use_template=True, null=True) + title = indexes.NgramField(model_attr='title') + code = indexes.NgramField(model_attr='code') + location = indexes.NgramField(default='') ++ 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 + return MediaCollection + + def prepare_location(self, obj): - return "%s" % obj.countries() ++ return "%s" % obj.countries() diff --cc telemeta/views/haystack_search.py index 7dd303fb,d6cd0cfa..47127d6f --- a/telemeta/views/haystack_search.py +++ b/telemeta/views/haystack_search.py @@@ -1,75 -1,45 +1,87 @@@ # -*- coding: utf-8 -*- - from haystack.views import SearchView - from haystack.query import SearchQuerySet + from haystack.views import * -from haystack.query import SearchQuerySet ++#from haystack.query import SearchQuerySet from telemeta.models import * -from telemeta.forms.haystack_form import HaySearchForm +from telemeta.forms.haystack_form import * + - class HaystackSearch(SearchView): - - def __call__(self,request,type=None): - self.type = type - if(self.type=='collection'): - self.form_class=HaySearchFormCollection - else: - self.form_class=HaySearchFormItem - return super(HaystackSearch,self).__call__(request) + class HaystackSearch(FacetedSearchView): - def __call__(self,request,type=None): ++ def __call__(self, request, type=None): + self.type = type - self.form_class=HaySearchForm - return super(HaystackSearch,self).__call__(request) - - ++ 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() - if self.type=='collection': - extra['type']='collection' - extra['collection_count']=super(HaystackSearch, self).get_results().models(MediaCollection).count() - extra['item_count']=super(HaystackSearch, self).get_results().models(MediaItem).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' ++ 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: -- extra['type']='item' ++ extra['type'] = 'item' return extra + +class HaystackAdvanceSearch(SearchView): + + def __call__(self, request, type=None): + self.type = type + return super(HaystackAdvanceSearch, self).__call__(request) + + def get_query(self): + """ + Returns the query provided by the user. + + Returns an empty string if the query is invalid. + """ + if self.form.is_valid(): + return self.form.cleaned_data + + return '' + + 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