General A/B testing.
[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 class ClubPaymentUnfinished(State):
60     slug = 'club-payment-unfinished'
61     name = _('club payment unfinished')
62
63     def get_objects(self):
64         from club.models import Schedule
65         return Schedule.objects.filter(
66                 payuorder=None,
67                 started_at__lt=self.time - self.offset,
68             )
69
70
71 states = [
72     ClubMembershipExpiring,
73     ClubPaymentUnfinished,
74 ]
75