Add messaging.
[wolnelektury.git] / src / messaging / states.py
diff --git a/src/messaging/states.py b/src/messaging/states.py
new file mode 100644 (file)
index 0000000..317be21
--- /dev/null
@@ -0,0 +1,75 @@
+from datetime import timedelta
+from django.utils.timezone import now
+from django.utils.translation import ugettext_lazy as _
+from .recipient import Recipient
+
+
+class State:
+    allow_negative_offset = False
+    context_fields = []
+
+
+    def __init__(self, offset=0, time=None):
+        self.time = time or now()
+        if isinstance(offset, int):
+            offset = timedelta(offset)
+        self.offset = offset
+
+    def get_recipients(self):
+        return [
+            Recipient(
+                hash_value=self.get_hash_value(obj),
+                email=self.get_email(obj),
+                context=self.get_context(obj),
+            )
+            for obj in self.get_objects()
+        ]
+
+    def get_objects(self):
+        raise NotImplemented
+
+    def get_hash_value(self, obj):
+        return str(obj.pk)
+    
+    def get_email(self, obj):
+        return obj.email
+
+    def get_context(self, obj):
+        ctx = {
+            obj._meta.model_name: obj,
+        }
+        return ctx
+
+
+class ClubMembershipExpiring(State):
+    slug = 'club-membership-expiring'
+    allow_negative_offset = True
+    name = _('club membership expiring')
+
+    def get_objects(self):
+        from club.models import Schedule
+        return Schedule.objects.filter(
+                is_active=True,
+                expires_at__lt=self.time - self.offset
+            )
+
+    def get_hashed_value(self, obj):
+        return '%s:%s' % (obj.pk, obj.expires_at.isoformat())
+
+class ClubPaymentUnfinished(State):
+    slug = 'club-payment-unfinished'
+    name = _('club payment unfinished')
+
+    def get_objects(self):
+        from club.models import Schedule
+        return Schedule.objects.filter(
+                payuorder=None,
+                started_at__lt=self.time - self.offset,
+            )
+
+
+states = [
+    ClubMembershipExpiring,
+    ClubPaymentUnfinished,
+]
+