from combo.data.models import CellBase
from combo.data.library import register_cell_class
-from emissions.models import Episode, NewsItem
+from emissions.models import Episode, NewsItem, SoundFile
@register_cell_class
class SoundCell(CellBase):
episode = models.ForeignKey('emissions.Episode', verbose_name=_('Episode'),
null=True, blank=True)
page = models.ForeignKey('data.Page', null=True, blank=True)
+
+
+@register_cell_class
+class SoundsCell(CellBase):
+ include_search_input = models.BooleanField(_('Include search input'), default=True)
+ include_fragments = models.BooleanField(_('Include fragments'), default=True)
+ limit_to_focus = models.BooleanField(_('Limit to focused elements'), default=False)
+ count = models.PositiveSmallIntegerField(_('Count'), default=20)
+
+ class Meta:
+ verbose_name = _('Sounds')
+
+ def get_cell_extra_context(self, context):
+ soundfiles = SoundFile.objects.prefetch_related('episode__emission__categories')
+ soundfiles = soundfiles.filter(podcastable=True)
+ if not self.include_fragments:
+ soundfiles = soundfiles.filter(fragment=False)
+ if self.limit_to_focus:
+ soundfiles = soundfiles.filter(got_focus__isnull=False)
+ soundfiles = soundfiles.select_related().extra(
+ select={'first_diffusion': 'emissions_diffusion.datetime', },
+ select_params=(False, True),
+ where=['''datetime = (SELECT MIN(datetime)
+ FROM emissions_diffusion
+ WHERE episode_id = emissions_episode.id)'''],
+ tables=['emissions_diffusion'],).order_by('-creation_timestamp').distinct()
+ return {
+ 'include_search_input': self.include_search_input,
+ 'count': self.count,
+ 'soundfiles': soundfiles,
+ }