--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.29 on 2020-11-21 12:40
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('data', '0046_auto_20200611_1121'),
+ ('auth', '0008_alter_user_username_max_length'),
+ ('panikombo', '0015_auto_20200611_1250'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='SoundsCell',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('placeholder', models.CharField(max_length=20)),
+ ('order', models.PositiveIntegerField()),
+ ('slug', models.SlugField(blank=True, verbose_name='Slug')),
+ ('extra_css_class', models.CharField(blank=True, max_length=100, verbose_name='Extra classes for CSS styling')),
+ ('public', models.BooleanField(default=True, verbose_name='Public')),
+ ('restricted_to_unlogged', models.BooleanField(default=False, verbose_name='Restrict to unlogged users')),
+ ('last_update_timestamp', models.DateTimeField(auto_now=True)),
+ ('include_search_input', models.BooleanField(default=True, verbose_name='Include search input')),
+ ('include_fragments', models.BooleanField(default=True, verbose_name='Include fragments')),
+ ('limit_to_focus', models.BooleanField(default=False, verbose_name='Limit to focused elements')),
+ ('count', models.PositiveSmallIntegerField(default=20, verbose_name='Count')),
+ ('groups', models.ManyToManyField(blank=True, to='auth.Group', verbose_name='Groups')),
+ ('page', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='data.Page')),
+ ],
+ options={
+ 'verbose_name': 'Latest Sounds',
+ },
+ ),
+ ]
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,
+ }