From: Frédéric Péters Date: Sat, 21 Nov 2020 11:42:52 +0000 (+0100) Subject: add new sounds cell X-Git-Tag: v2021~18 X-Git-Url: https://git.0d.be/?p=django-panik-combo.git;a=commitdiff_plain;h=a26af06d5a8089f693280a7b54ba5159df9dc360 add new sounds cell --- diff --git a/panikombo/migrations/0016_soundscell.py b/panikombo/migrations/0016_soundscell.py new file mode 100644 index 0000000..3695356 --- /dev/null +++ b/panikombo/migrations/0016_soundscell.py @@ -0,0 +1,40 @@ +# -*- 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', + }, + ), + ] diff --git a/panikombo/models.py b/panikombo/models.py index 905b7f2..d541921 100644 --- a/panikombo/models.py +++ b/panikombo/models.py @@ -15,7 +15,7 @@ from taggit.utils import parse_tags 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): @@ -221,3 +221,34 @@ class ItemTopik(models.Model): 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, + }