Source code for annotations.search_indexes

from django.db.models import Count

import datetime
from haystack import indexes
from annotations.models import Text
from concepts.models import Concept


[docs]class TextIndex(indexes.SearchIndex, indexes.Indexable): """ Index annotatable texts. """ text = indexes.CharField(document=True, use_template=False) title = indexes.EdgeNgramField(model_attr='title', indexed=False) created = indexes.DateField(model_attr='created', faceted=True, indexed=False, null=True) added = indexes.DateField(model_attr='added', faceted=True, indexed=False) addedBy = indexes.CharField(model_attr='addedBy') uri = indexes.CharField(model_attr='id') relation_count = indexes.CharField(model_attr='relation_count') collections = indexes.MultiValueField(indexed=False, faceted=True, null=True)
[docs] def get_model(self): """ Get model to be used for indexing """ return Text
[docs] def index_queryset(self, using=None): """ Used when entire index for model is updated """ return self.get_model().objects.all()
[docs] def prepare_text(self, instance): return instance.title
[docs] def prepare_added(self, instance): return instance.added.date()
[docs] def prepare_collections(self, instance): return [c.id for c in instance.partOf.all()]
[docs]class ConceptIndex(indexes.SearchIndex, indexes.Indexable): """ Index :class:`.Concept`\s that have been used in :class:`.Appellation`\s. """ text = indexes.CharField(document=True, use_template=False) label = indexes.EdgeNgramField() uri = indexes.CharField(null=True) typed = indexes.CharField(model_attr='typed', faceted=True, null=True) description = indexes.CharField(null=True)
[docs] def get_model(self): return Concept
[docs] def index_queryset(self, using=None): """ Only index Concepts that have been used in annotations. """ return self.get_model().objects.annotate(num_appellations=Count('appellation')).filter(num_appellations__gte=1)
[docs] def prepare_text(self, instance): return self.prepare_label(instance)
[docs] def prepare_label(self, instance): if instance.label: return instance.label.replace('_', ' ').strip().lower() return u'No label'
[docs] def prepare_typed(self, instance): if hasattr(instance, 'typed') and getattr(instance, 'typed'): return unicode(instance.typed.label) return 'None'
[docs] def prepare_description(self, instance): return instance.description
[docs] def prepare_uri(self, instance): return instance.uri