Coverage for website/sales/payables.py: 100.00%

33 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2025-08-14 10:31 +0000

1from django.utils.functional import classproperty 

2 

3from payments.payables import Payable, payables 

4from sales.models.order import Order, OrderItem 

5from sales.services import is_adult, is_manager 

6 

7 

8class OrderPayable(Payable[Order]): 

9 @property 

10 def payment_amount(self): 

11 return self.model.total_amount 

12 

13 @property 

14 def payment_topic(self): 

15 return f"Sales at {self.model.shift}" 

16 

17 @property 

18 def payment_notes(self): 

19 return f"{self.model.order_description}. Ordered at {self.model.created_at.time()} ({self.model.id})" 

20 

21 @property 

22 def payment_payer(self): 

23 return self.model.payer 

24 

25 @property 

26 def paying_allowed(self): 

27 return not ( 

28 self.model.age_restricted 

29 and self.model.payer 

30 and not is_adult(self.model.payer) 

31 ) 

32 

33 def can_manage_payment(self, member): 

34 return is_manager(member, self.model.shift) and member.has_perm( 

35 "sales.change_order" 

36 ) 

37 

38 @classproperty 

39 def immutable_after_payment(self): 

40 return True 

41 

42 @classproperty 

43 def immutable_foreign_key_models(self): 

44 return {OrderItem: "order"} 

45 

46 @classproperty 

47 def immutable_model_fields_after_payment(self): 

48 return { 

49 Order: [ 

50 "items", 

51 "discount", 

52 "order_description", 

53 "subtotal", 

54 "total_amount", 

55 "payer", 

56 "shift", 

57 ], 

58 OrderItem: ["product", "order", "total", "amount"], 

59 } 

60 

61 

62def register(): 

63 payables.register(Order, OrderPayable)