#########################################################################
#
# 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.maps.models import Map
[docs]
class MapIndex(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]
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 Map
[docs]
def prepare_type(self, obj):
return "map"
[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()