Change donation form
[wolnelektury.git] / src / club / forms.py
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.
3 #
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
9
10
11 class PayUCardTokenForm(CardTokenForm):
12     def get_queryset(self, view):
13         return view.get_schedule().payucardtoken_set
14
15
16
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)
24
25     amount = forms.IntegerField(required=False) # hidden
26
27     class Meta:
28         model = models.Schedule
29         fields = [
30             'amount',
31             'monthly'
32             ]
33
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)
40         if club is not None:
41             self.fields['custom_amount'].widget.attrs['min'] = club.min_amount
42
43     def clean(self):
44         state = {}
45         state['monthly'] = self.cleaned_data['switch'] == 'monthly'
46         which = 'monthly' if state['monthly'] else 'single'
47         state['amount'] = \
48             self.cleaned_data[f'{which}_amount'] or \
49             self.cleaned_data['custom_amount'] or \
50             self.cleaned_data[f'{which}_amount_selected']
51
52         return state
53
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)
58
59
60 class DonationStep2Form(forms.ModelForm, NewsletterForm):
61     class Meta:
62         model = models.Schedule
63         fields = [
64             'first_name', 'last_name',
65             'email', 'phone',
66             'postal',
67             'postal_code', 'postal_town', 'postal_country',
68             ]
69         widgets = {
70             'amount': forms.HiddenInput,
71             'monthly': forms.HiddenInput,
72         }
73     
74     def __init__(self, **kwargs):
75         super().__init__(**kwargs)
76
77         self.fields['first_name'].required = True
78         self.fields['last_name'].required = True
79         
80         self.consent = []
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(
84                 label=c.text,
85                 required=c.required
86             )
87             self.consent.append((
88                 c, key, (lambda k: lambda: self[k])(key)
89             ))
90
91     def save(self, *args, **kwargs):
92         NewsletterForm.save(self, *args, **kwargs)
93         instance = super().save(*args, **kwargs)
94
95         consents = []
96         for consent, key, consent_field in self.consent:
97             if self.cleaned_data[key]:
98                 instance.consent.add(consent)
99
100         return instance
101