Coverage for website/registrations/payables.py: 100.00%
40 statements
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1from django.template.defaultfilters import date
2from django.utils.functional import classproperty
4from payments.payables import Payable, PayableModel, payables
5from registrations.models import Registration, Renewal
8class _EntryPayable(Payable[PayableModel]):
9 """Abstract parent class for Registration- and RenewalPayables."""
11 @property
12 def payment_amount(self):
13 return self.model.contribution
15 @property
16 def payment_payer(self):
17 if self.model.membership:
18 return self.model.membership.user
19 return None
21 @property
22 def payment_notes(self):
23 return f"{self.payment_topic}. Creation date: {date(self.model.created_at)}. Completion date: {date(self.model.updated_at)}"
25 @classproperty
26 def immutable_after_payment(self):
27 return True
29 @classproperty
30 def immutable_model_fields_after_payment(self):
31 return ["length", "contribution"]
34class RegistrationPayable(_EntryPayable[Registration]):
35 @property
36 def payment_topic(self):
37 return f"Membership registration {self.model.membership_type} ({self.model.length})"
39 def can_manage_payment(self, member):
40 return member and member.has_perm("registrations.change_registration")
43class RenewalPayable(_EntryPayable[Renewal]):
44 @property
45 def payment_payer(self):
46 return self.model.member
48 @property
49 def payment_topic(self):
50 return f"Membership renewal {self.model.membership_type} ({self.model.length})"
52 def can_manage_payment(self, member):
53 return member and member.has_perm("registrations.change_renewal")
56def register():
57 payables.register(Renewal, RenewalPayable)
58 payables.register(Registration, RegistrationPayable)