Coverage for website/payments/widgets.py: 100.00%

38 statements  

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

1from django.forms import Widget 

2 

3from payments.models import Payment, PaymentUser 

4from payments.payables import payables 

5 

6 

7class PaymentWidget(Widget): 

8 """Custom widget for the Payment object, used in registrations.""" 

9 

10 template_name = "payments/widgets/payment.html" 

11 

12 def __init__(self, attrs=None, obj=None): 

13 super().__init__(attrs) 

14 self.obj = obj 

15 

16 def get_context(self, name, value, attrs) -> dict: 

17 context = super().get_context(name, value, attrs) 

18 if self.obj: 

19 # Make sure to ALWAYS use committed data from the database, and never invalid data that is not saved, for example from an invalid form 

20 self.obj.refresh_from_db() 

21 payable = payables.get_payable(self.obj) 

22 context["obj"] = payable 

23 context["app_label"] = self.obj._meta.app_label 

24 context["model_name"] = self.obj._meta.model_name 

25 if payable.payment: 

26 value = payable.payment.pk 

27 if self.obj and not value: 

28 context["payable_payer"] = ( 

29 PaymentUser.objects.get(pk=payable.payment_payer.pk) 

30 if getattr(payable, "payment_payer", None) is not None 

31 else None 

32 ) 

33 elif value: 

34 payment = Payment.objects.get(pk=value) 

35 context["url"] = payment.get_admin_url() 

36 context["payment"] = payment 

37 return context 

38 

39 def value_from_datadict(self, data, files, name): 

40 if self.obj: 

41 payable = payables.get_payable(self.obj) 

42 if payable.payment: 

43 return payable.payment.pk 

44 return None 

45 

46 class Media: 

47 js = ("admin/payments/js/payments.js",) 

48 

49 

50class SignatureWidget(Widget): 

51 """Widget for signature image.""" 

52 

53 template_name = "payments/widgets/signature.html" 

54 

55 class Media: 

56 js = ( 

57 "payments/js/signature_pad.min.js", 

58 "payments/js/main.js", 

59 ) 

60 css = {"all": ("admin/payments/css/signature.css",)}