]> git.0d.be Git - django-panik-emissions.git/blob - emissions/search_indexes.py
use a datetime index for sound date
[django-panik-emissions.git] / emissions / search_indexes.py
1 import datetime
2
3 from haystack import indexes
4
5 from .models import Emission, Episode, NewsItem, SoundFile
6
7
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)
12
13     slug = indexes.CharField(model_attr='slug', indexed=False)
14     subtitle = indexes.CharField(model_attr='subtitle', indexed=False, null=True)
15
16     def prepare(self, obj):
17         data = super(EmissionIndex, self).prepare(obj)
18         data['boost'] = 1.3
19         return data
20
21     def get_model(self):
22         return Emission
23
24     def prepare_categories(self, obj):
25         return [category.title for category in obj.categories.all()]
26
27     def get_updated_field(self):
28         return 'last_update_timestamp'
29
30
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)
36
37     has_sound = indexes.BooleanField(indexed=False)
38     slug = indexes.CharField(model_attr='slug', indexed=False)
39     emission_title = indexes.CharField(indexed=False)
40
41     def get_model(self):
42         return Episode
43
44     def prepare_emission_slug(self, obj):
45         return obj.emission.slug
46
47     def prepare_emission_title(self, obj):
48         return obj.emission.title
49
50     def prepare_tags(self, obj):
51         return [tag.name for tag in obj.tags.all()]
52
53     def prepare_has_sound(self, obj):
54         return obj.soundfile_set.exclude(podcastable=False).count() > 0
55
56     def get_updated_field(self):
57         return 'last_update_timestamp'
58
59
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)
66
67     slug = indexes.CharField(model_attr='slug', indexed=False)
68
69     def prepare(self, obj):
70         data = super(NewsItemIndex, self).prepare(obj)
71         today = datetime.datetime.today()
72         if obj.date is None:
73             return data
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
77             data['boost'] = 0.8
78         elif obj_datetime > today - datetime.timedelta(weeks=3):
79             # pull recent news
80             data['boost'] = 1.5
81         return data
82
83     def get_model(self):
84         return NewsItem
85
86     def prepare_tags(self, obj):
87         return [tag.name for tag in obj.tags.all()]
88
89     def get_updated_field(self):
90         return 'last_update_timestamp'
91
92
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)
100
101     def get_model(self):
102         return SoundFile
103
104     def prepare_title(self, obj):
105         if obj.title:
106             return obj.title
107         return obj.episode.title
108
109     def prepare_categories(self, obj):
110         return [category.title for category in obj.episode.emission.categories.all()]
111
112     def prepare_date(self, obj):
113         try:
114             return obj.episode.diffusion_set.all().order_by('datetime')[0].datetime
115         except IndexError:
116             return None
117
118     def prepare_tags(self, obj):
119         return [tag.name for tag in obj.episode.tags.all()]
120
121     def get_updated_field(self):
122         return 'last_update_timestamp'
123
124     def load_all_queryset(self):
125         return SoundFile.objects.all().select_related().prefetch_related('episode__emission__categories')
126
127     def index_queryset(self, using=None):
128         return self.get_model()._default_manager.filter(podcastable=True)