Admin club counters.
[wolnelektury.git] / src / messaging / states.py
1 from datetime import timedelta
2 from django.utils.timezone import now
3 from django.utils.translation import ugettext_lazy as _
4 from .recipient import Recipient
5
6
7 class State:
8     allow_negative_offset = False
9     context_fields = []
10
11
12     def __init__(self, offset=0, time=None):
13         self.time = time or now()
14         if isinstance(offset, int):
15             offset = timedelta(offset)
16         self.offset = offset
17
18     def get_recipients(self):
19         return [
20             Recipient(
21                 hash_value=self.get_hash_value(obj),
22                 email=self.get_email(obj),
23                 context=self.get_context(obj),
24             )
25             for obj in self.get_objects()
26         ]
27
28     def get_objects(self):
29         raise NotImplemented
30
31     def get_hash_value(self, obj):
32         return str(obj.pk)
33     
34     def get_email(self, obj):
35         return obj.email
36
37     def get_context(self, obj):
38         ctx = {
39             obj._meta.model_name: obj,
40         }
41         return ctx
42
43
44 class ClubMembershipExpiring(State):
45     slug = 'club-membership-expiring'
46     allow_negative_offset = True
47     name = _('club membership expiring')
48
49     def get_objects(self):
50         from club.models import Schedule
51         return Schedule.objects.filter(
52                 is_active=True,
53                 expires_at__lt=self.time - self.offset
54             )
55
56     def get_hashed_value(self, obj):
57         return '%s:%s' % (obj.pk, obj.expires_at.isoformat())
58
59
60 class ClubPaymentUnfinished(State):
61     slug = 'club-payment-unfinished'
62     name = _('club payment unfinished')
63
64     def get_objects(self):
65         from club.models import Schedule
66         return Schedule.objects.filter(
67                 payuorder=None,
68                 started_at__lt=self.time - self.offset,
69             )
70
71
72 class ClubRecurringPaymentProblem(State):
73     slug = 'club-recurring-payment-problem'
74     name = _('club recurring payment problem')
75
76     def get_objects(self):
77         from club.models import Schedule
78         return Schedule.objects.none()
79
80
81 states = [
82     ClubMembershipExpiring,
83     ClubPaymentUnfinished,
84     ClubRecurringPaymentProblem,
85 ]
86