X-Git-Url: https://git.0d.be/?p=django-panik-combo.git;a=blobdiff_plain;f=panikombo%2Fmodels.py;h=350f77e609fe11a3894a502929daede0bc985178;hp=c587791c1e53621f62582f6ee5627da9bb88d7a2;hb=a53294a17b610fa38589d1ebe223ddad42d07f11;hpb=48f36974e727dd2fcce6b930ff76158345c15c20 diff --git a/panikombo/models.py b/panikombo/models.py index c587791..350f77e 100644 --- a/panikombo/models.py +++ b/panikombo/models.py @@ -6,7 +6,9 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from ckeditor.fields import RichTextField +from taggit.models import Tag from taggit.managers import TaggableManager +from taggit.utils import parse_tags from combo.data.models import CellBase from combo.data.library import register_cell_class @@ -59,7 +61,8 @@ class EpisodeCell(CellBase): def render(self, context): tmpl = template.loader.get_template('panikombo/episode.html') context['episode'] = self.episode - context['soundfile'] = self.episode.main_sound + if self.episode: + context['soundfile'] = self.episode.main_sound return tmpl.render(context) def get_included_items(self): @@ -79,11 +82,23 @@ class EpisodeCell(CellBase): return '' +def get_parsed_tags(tagstring): + tags = parse_tags(tagstring) + return [x for x in Tag.objects.filter(name__in=tags)] + + @register_cell_class class EpisodeAutoSelectionCell(CellBase): title = models.CharField(_('Title'), max_length=50, blank=True) tags = TaggableManager(_('Tags'), blank=True) + and_tags = models.CharField(_('And Tags'), max_length=100, blank=True) category = models.ForeignKey('emissions.Category', null=True, blank=True) + period = models.PositiveSmallIntegerField( + _('Period'), default=0, + choices=((0, _('All')), + (1, _('Future')), + (2, _('Past')))) + class Meta: verbose_name = _('Automatic Episode Selection') @@ -94,23 +109,46 @@ class EpisodeAutoSelectionCell(CellBase): episodes_queryset = episodes_queryset.filter(emission__categories__in=[self.category.id]) if self.tags.count(): episodes_queryset = episodes_queryset.filter(tags__in=self.tags.all()) + if self.and_tags: + and_tags = get_parsed_tags(self.and_tags) + episodes_queryset = episodes_queryset.filter(tags__in=and_tags) + + if self.period == 0: + episodes_queryset = episodes_queryset.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']) + elif self.period == 1: + episodes_queryset = episodes_queryset.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) AND + datetime >= CURRENT_TIMESTAMP'''], + tables=['emissions_diffusion']) + elif self.period == 2: + episodes_queryset = episodes_queryset.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) AND + datetime < CURRENT_TIMESTAMP'''], + tables=['emissions_diffusion']) + return episodes_queryset def render(self, context): tmpl = template.loader.get_template('panikombo/episode_auto_selection.html') context['title'] = self.title - episodes_queryset = self.get_included_items() - episodes_queryset = episodes_queryset.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('-first_diffusion').distinct() - context['episodes'] = episodes_queryset + if (self.category or self.period or self.tags.count()): + episodes_queryset = self.get_included_items() + episodes_queryset = episodes_queryset.order_by('-first_diffusion').distinct() + context['episodes'] = episodes_queryset + else: + context['episodes'] = [] return tmpl.render(context) def get_default_form_class(self): @@ -126,6 +164,7 @@ class EpisodeAutoSelectionCell(CellBase): class NewsItemAutoSelectionCell(CellBase): title = models.CharField(_('Title'), max_length=50, blank=True) tags = TaggableManager(_('Tags'), blank=True) + and_tags = models.CharField(_('And Tags'), max_length=100, blank=True) future = models.BooleanField(_('Future Events Only'), default=True) category = models.ForeignKey('emissions.NewsCategory', verbose_name=_('Category'), null=True, blank=True) @@ -137,6 +176,9 @@ class NewsItemAutoSelectionCell(CellBase): newsitems_queryset = NewsItem.objects.select_related() if self.tags.count(): newsitems_queryset = newsitems_queryset.filter(tags__in=self.tags.all()) + if self.and_tags: + and_tags = get_parsed_tags(self.and_tags) + newsitems_queryset = newsitems_queryset.filter(tags__in=and_tags) if self.future: newsitems_queryset = newsitems_queryset.filter(event_date__gte=date.today()) if self.category: @@ -147,7 +189,10 @@ class NewsItemAutoSelectionCell(CellBase): def render(self, context): tmpl = template.loader.get_template('panikombo/newsitem_auto_selection.html') context['title'] = self.title - context['newsitems'] = self.get_included_items() + if self.tags.count() or self.future or self.category: + context['newsitems'] = self.get_included_items() + else: + context['newsitems'] = [] return tmpl.render(context) def get_default_form_class(self):