1 from datetime import date
4 from django import template
5 from django.db import models
6 from django.utils.translation import ugettext_lazy as _
8 from taggit.managers import TaggableManager
10 from combo.data.models import CellBase
11 from combo.data.library import register_cell_class
13 from emissions.models import Episode, NewsItem
16 class SoundCell(CellBase):
17 soundfile = models.ForeignKey('emissions.SoundFile', null=True)
20 verbose_name = _('Sound')
22 def render(self, context):
23 tmpl = template.loader.get_template('panikombo/audio.html')
24 context['soundfile'] = self.soundfile
25 return tmpl.render(context)
27 def get_default_form_class(self):
28 from .forms import SoundCellForm
31 def get_included_items(self):
32 if not self.soundfile:
34 return [self.soundfile.episode]
36 def get_additional_label(self):
38 if self.soundfile.fragment:
39 return u'%s - %s - %s' % (
40 self.soundfile.episode.emission.title,
41 self.soundfile.episode.title,
45 self.soundfile.episode.emission.title,
46 self.soundfile.episode.title)
52 class EpisodeCell(CellBase):
53 episode = models.ForeignKey('emissions.Episode', null=True)
56 verbose_name = _('Episode')
58 def render(self, context):
59 tmpl = template.loader.get_template('panikombo/episode.html')
60 context['episode'] = self.episode
61 context['soundfile'] = self.episode.main_sound
62 return tmpl.render(context)
64 def get_included_items(self):
69 def get_default_form_class(self):
70 from .forms import EpisodeCellForm
71 return EpisodeCellForm
73 def get_additional_label(self):
76 self.episode.emission.title,
82 class EpisodeAutoSelectionCell(CellBase):
83 title = models.CharField(_('Title'), max_length=50, blank=True)
84 tags = TaggableManager(_('Tags'), blank=True)
85 category = models.ForeignKey('emissions.Category', null=True, blank=True)
88 verbose_name = _('Automatic Episode Selection')
90 def get_included_items(self):
91 episodes_queryset = Episode.objects.select_related()
93 episodes_queryset = episodes_queryset.filter(emission__categories__in=[self.category.id])
95 episodes_queryset = episodes_queryset.filter(tags__in=self.tags.all())
96 return episodes_queryset
98 def render(self, context):
99 tmpl = template.loader.get_template('panikombo/episode_auto_selection.html')
100 context['title'] = self.title
102 episodes_queryset = self.get_included_items()
103 episodes_queryset = episodes_queryset.extra(select={
104 'first_diffusion': 'emissions_diffusion.datetime',
106 select_params=(False, True),
107 where=['''datetime = (SELECT MIN(datetime)
108 FROM emissions_diffusion
109 WHERE episode_id = emissions_episode.id)'''],
110 tables=['emissions_diffusion'],
111 ).order_by('-first_diffusion').distinct()
112 context['episodes'] = episodes_queryset
113 return tmpl.render(context)
115 def get_default_form_class(self):
116 from .forms import EpisodeAutoSelectionCellForm
117 return EpisodeAutoSelectionCellForm
119 def get_additional_label(self):
125 class NewsItemAutoSelectionCell(CellBase):
126 title = models.CharField(_('Title'), max_length=50, blank=True)
127 tags = TaggableManager(_('Tags'), blank=True)
128 future = models.BooleanField(_('Future Events Only'), default=True)
129 category = models.ForeignKey('emissions.NewsCategory',
130 verbose_name=_('Category'), null=True, blank=True)
133 verbose_name = _('Automatic Newsitem Selection')
135 def get_included_items(self):
136 newsitems_queryset = NewsItem.objects.select_related()
137 if self.tags.count():
138 newsitems_queryset = newsitems_queryset.filter(tags__in=self.tags.all())
140 newsitems_queryset = newsitems_queryset.filter(event_date__gte=date.today())
142 newsitems_queryset = newsitems_queryset.filter(category=self.category)
143 return newsitems_queryset
145 def render(self, context):
146 tmpl = template.loader.get_template('panikombo/newsitem_auto_selection.html')
147 context['title'] = self.title
148 context['newsitems'] = self.get_included_items()
149 return tmpl.render(context)
151 def get_default_form_class(self):
152 from .forms import NewsItemAutoSelectionCellForm
153 return NewsItemAutoSelectionCellForm
155 def get_additional_label(self):
161 def get_topik_image_path(instance, filename):
162 return os.path.join('images', 'topik', instance.page.slug,
163 os.path.basename(filename))
165 class Topik(models.Model):
166 page = models.ForeignKey('data.Page')
167 image = models.ImageField(_('Image'),
168 upload_to=get_topik_image_path, max_length=250, null=True, blank=True)
170 # denormalized from Focus
171 got_focus = models.DateTimeField(default=None, null=True, blank=True)
172 has_focus = models.BooleanField(default=False)
175 class ItemTopik(models.Model):
176 newsitem = models.ForeignKey('emissions.NewsItem', verbose_name=_('News Item'),
177 null=True, blank=True)
178 episode = models.ForeignKey('emissions.Episode', verbose_name=_('Episode'),
179 null=True, blank=True)
180 topik = models.ForeignKey('Topik', verbose_name='Topik',
181 null=True, blank=True)