]> git.0d.be Git - django-panik-combo.git/blobdiff - panikombo/models.py
add additional "and_tags" field to auto selection, for ANDing criterias
[django-panik-combo.git] / panikombo / models.py
index 57848f57127874b103d57cec11916b4f256a37cc..350f77e609fe11a3894a502929daede0bc985178 100644 (file)
@@ -5,7 +5,10 @@ from django import template
 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
@@ -58,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):
@@ -78,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')
@@ -93,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):
@@ -125,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)
@@ -136,16 +176,23 @@ 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:
             newsitems_queryset = newsitems_queryset.filter(category=self.category)
+        newsitems_queryset = newsitems_queryset.order_by('-event_date', '-creation_timestamp')
         return newsitems_queryset
 
     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):
@@ -171,6 +218,11 @@ class Topik(models.Model):
     got_focus = models.DateTimeField(default=None, null=True, blank=True)
     has_focus = models.BooleanField(default=False)
 
+    def __unicode__(self):
+        if not self.page:
+            return super(Topik, self).__unicode__()
+        return unicode(self.page)
+
 
 class ItemTopik(models.Model):
     newsitem = models.ForeignKey('emissions.NewsItem', verbose_name=_('News Item'),
@@ -179,3 +231,19 @@ class ItemTopik(models.Model):
             null=True, blank=True)
     topik = models.ForeignKey('Topik', verbose_name='Topik',
             null=True, blank=True)
+
+
+@register_cell_class
+class TopikCell(CellBase):
+    topik = models.ForeignKey(Topik, null=True)
+    text = RichTextField(_('Text'), blank=True, null=True)
+
+    template_name = 'panikombo/topik-cell.html'
+
+    class Meta:
+        verbose_name = _('Topik')
+
+    def get_additional_label(self):
+        if not self.topik:
+            return ''
+        return self.topik.page.title