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