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
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1from django.forms import Widget
3from payments.models import Payment, PaymentUser
4from payments.payables import payables
7class PaymentWidget(Widget):
8 """Custom widget for the Payment object, used in registrations."""
10 template_name = "payments/widgets/payment.html"
12 def __init__(self, attrs=None, obj=None):
13 super().__init__(attrs)
14 self.obj = obj
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
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
46 class Media:
47 js = ("admin/payments/js/payments.js",)
50class SignatureWidget(Widget):
51 """Widget for signature image."""
53 template_name = "payments/widgets/signature.html"
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",)}