edit buttons
[wolnelektury.git] / src / club / models.py
index 548423a..acf131b 100644 (file)
@@ -26,9 +26,7 @@ from . import utils
 class Club(models.Model):
     min_amount = models.IntegerField(_('minimum amount'))
     min_for_year = models.IntegerField(_('minimum amount for year'))
-    single_amounts = models.CharField(_('proposed amounts for single payment'), max_length=255)
     default_single_amount = models.IntegerField(_('default single amount'))
-    monthly_amounts = models.CharField(_('proposed amounts for monthly payments'), max_length=255)
     default_monthly_amount = models.IntegerField(_('default monthly amount'))
 
     class Meta:
@@ -37,12 +35,23 @@ class Club(models.Model):
     
     def __str__(self):
         return 'Klub'
-    
-    def proposed_single_amounts(self):
-        return [int(x) for x in self.single_amounts.split(',')]
 
-    def proposed_monthly_amounts(self):
-        return [int(x) for x in self.monthly_amounts.split(',')]
+
+class SingleAmount(models.Model):
+    club = models.ForeignKey(Club, models.CASCADE)
+    amount = models.IntegerField()
+    description = models.TextField(blank=True)
+
+    class Meta:
+        ordering = ['amount']
+
+class MonthlyAmount(models.Model):
+    club = models.ForeignKey(Club, models.CASCADE)
+    amount = models.IntegerField()
+    description = models.TextField(blank=True)
+
+    class Meta:
+        ordering = ['amount']
 
 
 class Consent(models.Model):
@@ -116,6 +125,13 @@ class Schedule(models.Model):
     def get_payment_method(self):
         return [m for m in methods if m.slug == self.method][0]
 
+    def get_payment_methods(self):
+        for method in methods:
+            if (self.monthly or self.yearly) and method.is_recurring:
+                yield method
+            elif not (self.monthly or self.yearly) and method.is_onetime:
+                yield method
+
     def is_expired(self):
         return self.expires_at is not None and self.expires_at <= now()
 
@@ -150,6 +166,16 @@ class Schedule(models.Model):
             return utils.add_year(date)
         return utils.add_month(date)
 
+    def get_other_active_recurring(self):
+        schedules = type(self).objects.exclude(
+            monthly=False, yearly=False
+        ).filter(is_cancelled=False, expires_at__gt=now()).exclude(pk=self.pk)
+        mine_q = models.Q(email=self.email)
+        if self.membership is not None:
+            mine_q |= models.Q(membership__user=self.membership.user)
+        schedules = schedules.filter(mine_q)
+        return schedules.order_by('-expires_at').first()
+    
     def send_email(self):
         ctx = {'schedule': self}
         send_mail(
@@ -159,6 +185,17 @@ class Schedule(models.Model):
         self.email_sent = True
         self.save()
 
+    def send_email_failed_recurring(self):
+        ctx = {
+            'schedule': self,
+            'other': self.get_other_active_recurring(),
+        }
+        send_mail(
+            'Darowizna na Wolne Lektury — problem z płatnością',
+            template.loader.render_to_string('club/email/failed_recurring.txt', ctx),
+            settings.CONTACT_EMAIL, [self.email], fail_silently=False
+        )
+        
     def update_contact(self):
         Contact = apps.get_model('messaging', 'Contact')
         if not self.payed_at:
@@ -278,7 +315,7 @@ class PayUOrder(payu_models.Order):
             self.schedule.get_thanks_url())
 
     def get_description(self):
-        return ugettext('Towarzystwo Przyjaciół Wolnych Lektur')
+        return 'Wolne Lektury'
 
     def is_recurring(self):
         return self.schedule.get_payment_method().is_recurring
@@ -294,6 +331,11 @@ class PayUOrder(payu_models.Order):
     def status_updated(self):
         if self.status == 'COMPLETED':
             self.schedule.set_payed()
+
+        elif self.status == 'CANCELED' or self.status.startswith('ERR-'):
+            if self.is_recurring() and self.schedule.expires_at:
+                self.schedule.send_email_failed_recurring()
+            
         self.report_activity()
 
     @property
@@ -326,7 +368,7 @@ class PayUOrder(payu_models.Order):
         )            
 
     @classmethod
-    def send_receipt(cls, email, year):
+    def send_receipt(cls, email, year, resend=False):
         Contact = apps.get_model('messaging', 'Contact')
         Funding = apps.get_model('funding', 'Funding')
         BillingAgreement = apps.get_model('paypal', 'BillingAgreement')
@@ -380,6 +422,7 @@ class PayUOrder(payu_models.Order):
             "total": sum(x['amount'] for x in payments),
             "payments": payments,
             "optout": optout,
+            "resend": resend,
         }
         temp = tempfile.NamedTemporaryFile(prefix='receipt-', suffix='.pdf', delete=False)
         temp.close()