X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/e466cef774f05a0c2fd99df7b8e714d0da2b9773..190a12c5524f533a5fa74569575cccf22f745847:/src/club/models.py?ds=sidebyside diff --git a/src/club/models.py b/src/club/models.py index 548423a1b..acf131b12 100644 --- a/src/club/models.py +++ b/src/club/models.py @@ -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()