9ed724c0eaeb2d609ddf3a84255d71feeae3b596
[wolnelektury.git] / src / annoy / models.py
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
7
8
9 class Banner(models.Model):
10     place = models.SlugField(_('place'), choices=PLACE_CHOICES)
11     action_label = models.CharField(
12         _('action label'),
13         max_length=255, blank=True,
14         help_text=_('If empty, whole banner will serve as a link')
15     )
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     image = models.FileField(_('image'), upload_to='annoy/banners/', blank=True)
20     url = models.CharField(_('url'), max_length=1024)
21     priority = models.PositiveSmallIntegerField(
22         _('priority'), default=0,
23         help_text=_('Banners with higher priority come first.'))
24     since = models.DateTimeField(_('since'), null=True, blank=True)
25     until = models.DateTimeField(_('until'), null=True, blank=True)
26     show_members = models.BooleanField(_('show members'), default=False)
27     staff_preview = models.BooleanField(_('staff preview'), default=False)
28
29     class Meta:
30         verbose_name = _('banner')
31         verbose_name_plural = _('banners')
32         ordering = ('place', '-priority',)
33
34     def __str__(self):
35         return self.text
36
37     @classmethod
38     def choice(cls, place, request):
39         Membership = apps.get_model('club', 'Membership')
40
41         if hasattr(request, 'annoy_banner_exempt'):
42             return cls.objects.none()
43
44         if settings.DEBUG:
45             assert place in PLACES, f"Banner place `{place}` must be defined in annoy.places."
46
47         n = now()
48         banners = cls.objects.filter(
49             place=place
50         ).exclude(
51             since__gt=n
52         ).exclude(
53             until__lt=n
54         ).order_by('-priority', '?')
55
56         if not request.user.is_staff:
57             banners = banners.filter(staff_preview=False)
58
59         if request:
60             if Membership.is_active_for(request.user):
61                 banners = banners.filter(show_members=True)
62         return banners
63
64
65 class DynamicTextInsert(models.Model):
66     paragraphs = models.IntegerField(_('pararaphs'))
67     url = models.CharField(max_length=1024)
68
69     class Meta:
70         verbose_name = _('dynamic insert')
71         verbose_name_plural = _('dynamic inserts')
72         ordering = ('paragraphs', )
73
74     def __str__(self):
75         return str(self.paragraphs)
76
77     @classmethod
78     def get_all(cls, request):
79         Membership = apps.get_model('club', 'Membership')
80         if Membership.is_active_for(request.user) and not request.user.is_staff:
81             return cls.objects.none()
82         return cls.objects.all()
83
84
85     def choose(self):
86         return self.dynamictextinserttext_set.order_by('?').first()
87
88
89 class DynamicTextInsertText(models.Model):
90     insert = models.ForeignKey(DynamicTextInsert, models.CASCADE)
91     own_colors = models.BooleanField(default=False)
92     background_color = models.CharField(max_length=10, blank=True)
93     text_color = models.CharField(max_length=10, blank=True)
94     text = models.TextField(_('text'))
95     image = models.FileField(blank=True, upload_to='annoy/inserts/')