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

1from django.template.defaultfilters import date 

2from django.utils.functional import classproperty 

3 

4from payments.payables import Payable, PayableModel, payables 

5from registrations.models import Registration, Renewal 

6 

7 

8class _EntryPayable(Payable[PayableModel]): 

9 """Abstract parent class for Registration- and RenewalPayables.""" 

10 

11 @property 

12 def payment_amount(self): 

13 return self.model.contribution 

14 

15 @property 

16 def payment_payer(self): 

17 if self.model.membership: 

18 return self.model.membership.user 

19 return None 

20 

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)}" 

24 

25 @classproperty 

26 def immutable_after_payment(self): 

27 return True 

28 

29 @classproperty 

30 def immutable_model_fields_after_payment(self): 

31 return ["length", "contribution"] 

32 

33 

34class RegistrationPayable(_EntryPayable[Registration]): 

35 @property 

36 def payment_topic(self): 

37 return f"Membership registration {self.model.membership_type} ({self.model.length})" 

38 

39 def can_manage_payment(self, member): 

40 return member and member.has_perm("registrations.change_registration") 

41 

42 

43class RenewalPayable(_EntryPayable[Renewal]): 

44 @property 

45 def payment_payer(self): 

46 return self.model.member 

47 

48 @property 

49 def payment_topic(self): 

50 return f"Membership renewal {self.model.membership_type} ({self.model.length})" 

51 

52 def can_manage_payment(self, member): 

53 return member and member.has_perm("registrations.change_renewal") 

54 

55 

56def register(): 

57 payables.register(Renewal, RenewalPayable) 

58 payables.register(Registration, RegistrationPayable)