Source code for geonode.documents.search_indexes

#########################################################################
#
# Copyright (C) 2016 OSGeo
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#########################################################################

from pinax.ratings.models import OverallRating
from django.contrib.contenttypes.models import ContentType
from django.db.models import Avg
from haystack import indexes
from geonode.documents.models import Document


[docs] class DocumentIndex(indexes.SearchIndex, indexes.Indexable):
[docs] id = indexes.IntegerField(model_attr="id")
[docs] abstract = indexes.CharField(model_attr="abstract", boost=1.5)
[docs] category__gn_description = indexes.CharField(model_attr="category__gn_description", null=True)
[docs] csw_type = indexes.CharField(model_attr="csw_type")
[docs] csw_wkt_geometry = indexes.CharField(model_attr="csw_wkt_geometry")
[docs] detail_url = indexes.CharField(model_attr="get_absolute_url")
[docs] owner__username = indexes.CharField(model_attr="owner", faceted=True, null=True)
[docs] srid = indexes.CharField(model_attr="srid")
[docs] supplemental_information = indexes.CharField(model_attr="supplemental_information", null=True)
[docs] thumbnail_url = indexes.CharField(model_attr="thumbnail_url", null=True)
[docs] uuid = indexes.CharField(model_attr="uuid")
[docs] title = indexes.CharField(model_attr="title", boost=2)
[docs] date = indexes.DateTimeField(model_attr="date")
[docs] text = indexes.EdgeNgramField(document=True, use_template=True, stored=False)
[docs] type = indexes.CharField(faceted=True)
[docs] title_sortable = indexes.CharField(indexed=False, stored=False) # Necessary for sorting
[docs] category = indexes.CharField(model_attr="category__identifier", faceted=True, null=True, stored=True)
[docs] bbox_left = indexes.FloatField(model_attr="bbox_x0", null=True, stored=False)
[docs] bbox_right = indexes.FloatField(model_attr="bbox_x1", null=True, stored=False)
[docs] bbox_bottom = indexes.FloatField(model_attr="bbox_y0", null=True, stored=False)
[docs] bbox_top = indexes.FloatField(model_attr="bbox_y1", null=True, stored=False)
[docs] temporal_extent_start = indexes.DateTimeField(model_attr="temporal_extent_start", null=True, stored=False)
[docs] temporal_extent_end = indexes.DateTimeField(model_attr="temporal_extent_end", null=True, stored=False)
[docs] keywords = indexes.MultiValueField(model_attr="keyword_slug_list", null=True, faceted=True, stored=True)
[docs] regions = indexes.MultiValueField(model_attr="region_name_list", null=True, faceted=True, stored=True)
[docs] popular_count = indexes.IntegerField(model_attr="popular_count", default=0, boost=20)
[docs] share_count = indexes.IntegerField(model_attr="share_count", default=0)
[docs] rating = indexes.IntegerField(null=True)
[docs] num_ratings = indexes.IntegerField(stored=False)
[docs] def get_model(self): return Document
[docs] def prepare_type(self, obj): return "document"
[docs] def prepare_rating(self, obj): ct = ContentType.objects.get_for_model(obj) try: rating = OverallRating.objects.filter(object_id=obj.pk, content_type=ct).aggregate(r=Avg("rating"))["r"] return float(str(rating or "0")) except OverallRating.DoesNotExist: return 0.0
[docs] def prepare_num_ratings(self, obj): ct = ContentType.objects.get_for_model(obj) try: return OverallRating.objects.filter(object_id=obj.pk, content_type=ct).all().count() except OverallRating.DoesNotExist: return 0
[docs] def prepare_title_sortable(self, obj): return obj.title.lower().lstrip()