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:
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):
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()
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(
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:
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
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
)
@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')
"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()