import urllib.parse from django import forms from django.conf import settings class DonateForm(forms.Form): CUSTOM_AMOUNT = -1 DEFAULT_CUSTOM_AMOUNT = 1000 ALLOWED_PERIODICITY = [730, 99999] PORTAL_ID_IN_SELECT = -1 amount = forms.IntegerField() custom_amount = forms.IntegerField(required=False) periodicity = forms.IntegerField() portal_project_id = forms.IntegerField() select_portal_project_id = forms.IntegerField(required=False) def clean_periodicity(self): value = self.cleaned_data["periodicity"] if value not in self.ALLOWED_PERIODICITY: raise forms.ValidationError("Wrong periodicity!") return value def clean(self): cleaned_data = super().clean() if ( cleaned_data["portal_project_id"] == self.PORTAL_ID_IN_SELECT and cleaned_data["select_portal_project_id"] is None ): raise forms.ValidationError("Není zadán účel daru.") return cleaned_data def get_amount(self): amount = self.cleaned_data["amount"] if amount == self.CUSTOM_AMOUNT: amount = ( abs(self.cleaned_data["custom_amount"]) or self.DEFAULT_CUSTOM_AMOUNT ) return amount def get_redirect_url(self): amount = self.get_amount() periodicity = self.cleaned_data["periodicity"] portal_project_id = self.cleaned_data["portal_project_id"] if portal_project_id == self.PORTAL_ID_IN_SELECT: portal_project_id = self.cleaned_data["select_portal_project_id"] query = urllib.parse.urlencode( { "amount": amount, "periodicity": periodicity, "projectAccount": portal_project_id, "source": settings.DONATE_PORTAL_REDIRECT_SOURCE, } ) return f"{settings.DONATE_PORTAL_REDIRECT_URL}?{query}"