1 # This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
4 from decimal import Decimal
5 from django import forms
6 from newsletter.forms import NewsletterForm
7 from . import models, payment_methods
8 from .payu.forms import CardTokenForm
11 class PayUCardTokenForm(CardTokenForm):
12 def get_queryset(self, view):
13 return view.get_schedule().payucardtoken_set
17 class DonationStep1Form(forms.ModelForm):
18 switch = forms.CharField()
19 single_amount = forms.IntegerField(required=False)
20 monthly_amount = forms.IntegerField(required=False)
21 single_amount_selected = forms.IntegerField(required=False)
22 monthly_amount_selected = forms.IntegerField(required=False)
23 custom_amount = forms.IntegerField(required=False)
25 amount = forms.IntegerField(required=False) # hidden
28 model = models.Schedule
34 def __init__(self, *args, referer=None, **kwargs):
35 self.referer = referer
36 super().__init__(*args, **kwargs)
37 club = models.Club.objects.first()
38 if self.instance.is_custom_amount():
39 self.fields['custom_amount'].initial = int(self.instance.amount)
41 self.fields['custom_amount'].widget.attrs['min'] = club.min_amount
45 state['monthly'] = self.cleaned_data['switch'] == 'monthly'
46 which = 'monthly' if state['monthly'] else 'single'
48 self.cleaned_data[f'{which}_amount'] or \
49 self.cleaned_data['custom_amount'] or \
50 self.cleaned_data[f'{which}_amount_selected']
54 def save(self, *args, **kwargs):
55 if self.referer is not None:
56 self.instance.source = self.referer
57 return super().save(*args, **kwargs)
60 class DonationStep2Form(forms.ModelForm, NewsletterForm):
62 model = models.Schedule
64 'first_name', 'last_name',
67 'postal_code', 'postal_town', 'postal_country',
70 'amount': forms.HiddenInput,
71 'monthly': forms.HiddenInput,
74 def __init__(self, **kwargs):
75 super().__init__(**kwargs)
77 self.fields['first_name'].required = True
78 self.fields['last_name'].required = True
81 for c in models.Consent.objects.filter(active=True).order_by('order'):
82 key = f'consent{c.id}'
83 self.fields[key] = forms.BooleanField(
88 c, key, (lambda k: lambda: self[k])(key)
91 def save(self, *args, **kwargs):
92 NewsletterForm.save(self, *args, **kwargs)
93 instance = super().save(*args, **kwargs)
96 for consent, key, consent_field in self.consent:
97 if self.cleaned_data[key]:
98 instance.consent.add(consent)