1 from django.apps import apps
 
   2 from django.conf import settings
 
   3 from django.db import models
 
   4 from django.utils.translation import ugettext_lazy as _
 
   5 from django.utils.timezone import now
 
   6 from .places import PLACES, PLACE_CHOICES
 
   9 class Banner(models.Model):
 
  10     place = models.SlugField(_('place'), choices=PLACE_CHOICES)
 
  11     action_label = models.CharField(
 
  13         max_length=255, blank=True,
 
  14         help_text=_('If empty, whole banner will serve as a link')
 
  16     open_label = models.CharField(_('open label'), max_length=255, blank=True)
 
  17     close_label = models.CharField(_('close label'), max_length=255, blank=True)
 
  18     text = models.TextField(_('text'))
 
  19     url = models.CharField(_('url'), max_length=1024)
 
  20     priority = models.PositiveSmallIntegerField(
 
  21         _('priority'), default=0,
 
  22         help_text=_('Banners with higher priority come first.'))
 
  23     since = models.DateTimeField(_('since'), null=True, blank=True)
 
  24     until = models.DateTimeField(_('until'), null=True, blank=True)
 
  25     show_members = models.BooleanField(_('show members'), default=False)
 
  26     staff_preview = models.BooleanField(_('staff preview'), default=False)
 
  29         verbose_name = _('banner')
 
  30         verbose_name_plural = _('banners')
 
  31         ordering = ('place', '-priority',)
 
  37     def choice(cls, place, request):
 
  38         Membership = apps.get_model('club', 'Membership')
 
  40         if hasattr(request, 'annoy_banner_exempt'):
 
  41             return cls.objects.none()
 
  44             assert place in PLACES, "Banner place `{}` must be defined in annoy.places.".format(place)
 
  47         banners = cls.objects.filter(
 
  53         ).order_by('-priority', '?')
 
  55         if not request.user.is_staff:
 
  56             banners = banners.filter(staff_preview=False)
 
  59             if Membership.is_active_for(request.user):
 
  60                 banners = banners.filter(show_members=True)
 
  64 class DynamicTextInsert(models.Model):
 
  65     paragraphs = models.IntegerField(_('pararaphs'))
 
  66     url = models.CharField(max_length=1024)
 
  69         verbose_name = _('dynamic insert')
 
  70         verbose_name_plural = _('dynamic inserts')
 
  71         ordering = ('paragraphs', )
 
  74         return str(self.paragraphs)
 
  77         return self.dynamictextinserttext_set.order_by('?').first()
 
  80 class DynamicTextInsertText(models.Model):
 
  81     insert = models.ForeignKey(DynamicTextInsert, models.CASCADE)
 
  82     background_color = models.CharField(max_length=10, blank=True)
 
  83     text_color = models.CharField(max_length=10, blank=True)
 
  84     text = models.TextField(_('text'))
 
  85     image = models.FileField(blank=True)