3 from haystack import indexes
5 from .models import Emission, Episode, NewsItem, SoundFile
8 class EmissionIndex(indexes.SearchIndex, indexes.Indexable):
9 title = indexes.CharField(model_attr='title', boost=1.5)
10 text = indexes.CharField(document=True, use_template=True)
11 categories = indexes.MultiValueField(faceted=True)
13 slug = indexes.CharField(model_attr='slug', indexed=False)
14 subtitle = indexes.CharField(model_attr='subtitle', indexed=False, null=True)
16 def prepare(self, obj):
17 data = super(EmissionIndex, self).prepare(obj)
24 def prepare_categories(self, obj):
25 return [category.title for category in obj.categories.all()]
27 def get_updated_field(self):
28 return 'last_update_timestamp'
31 class EpisodeIndex(indexes.SearchIndex, indexes.Indexable):
32 title = indexes.CharField(model_attr='title', boost=1.5)
33 text = indexes.CharField(document=True, use_template=True)
34 tags = indexes.MultiValueField(faceted=True)
35 emission_slug = indexes.CharField(faceted=True)
37 has_sound = indexes.BooleanField(indexed=False)
38 slug = indexes.CharField(model_attr='slug', indexed=False)
39 emission_title = indexes.CharField(indexed=False)
44 def prepare_emission_slug(self, obj):
45 return obj.emission.slug
47 def prepare_emission_title(self, obj):
48 return obj.emission.title
50 def prepare_tags(self, obj):
51 return [tag.name for tag in obj.tags.all()]
53 def prepare_has_sound(self, obj):
54 return obj.soundfile_set.exclude(podcastable=False).count() > 0
56 def get_updated_field(self):
57 return 'last_update_timestamp'
60 class NewsItemIndex(indexes.SearchIndex, indexes.Indexable):
61 title = indexes.CharField(model_attr='title', boost=1.5)
62 text = indexes.CharField(document=True, use_template=True)
63 tags = indexes.MultiValueField(faceted=True)
64 date = indexes.DateField(model_attr='date')
65 news_categories = indexes.CharField(model_attr='category', null=True, faceted=True)
67 slug = indexes.CharField(model_attr='slug', indexed=False)
69 def prepare(self, obj):
70 data = super(NewsItemIndex, self).prepare(obj)
71 today = datetime.datetime.today()
74 obj_datetime = datetime.datetime(*obj.date.timetuple()[:3])
75 if obj_datetime < today - datetime.timedelta(weeks=15):
76 # push older news in later pages
78 elif obj_datetime > today - datetime.timedelta(weeks=3):
86 def prepare_tags(self, obj):
87 return [tag.name for tag in obj.tags.all()]
89 def get_updated_field(self):
90 return 'last_update_timestamp'
93 class SoundFileIndex(indexes.SearchIndex, indexes.Indexable):
94 title = indexes.CharField(boost=1.5)
95 text = indexes.CharField(document=True, use_template=True)
96 tags = indexes.MultiValueField(faceted=True)
97 date = indexes.DateTimeField()
98 categories = indexes.MultiValueField(faceted=True)
99 format = indexes.CharField(model_attr='format', null=True, faceted=True)
104 def prepare_title(self, obj):
107 return obj.episode.title
109 def prepare_categories(self, obj):
110 return [category.title for category in obj.episode.emission.categories.all()]
112 def prepare_date(self, obj):
114 return obj.episode.diffusion_set.all().order_by('datetime')[0].datetime
118 def prepare_tags(self, obj):
119 return [tag.name for tag in obj.episode.tags.all()]
121 def get_updated_field(self):
122 return 'last_update_timestamp'
124 def load_all_queryset(self):
125 return SoundFile.objects.all().select_related().prefetch_related('episode__emission__categories')
127 def index_queryset(self, using=None):
128 return self.get_model()._default_manager.filter(podcastable=True)