Source code for checkout.forms
# -*- encoding: utf-8 -*-
from django import forms
from .models import (
CheckoutAction,
Customer,
CustomerPayment,
ObjectPaymentPlan,
ObjectPaymentPlanInstalment,
PaymentPlan,
)
[docs]class CheckoutForm(forms.ModelForm):
""" Checkout form.
If extending this to a form that has contact address fields then set
additional_prefix to make the field names unique.
"""
additional_prefix = ""
action = forms.ChoiceField(widget=forms.RadioSelect)
# token is not required for payment by invoice
token = forms.CharField(required=False)
def __init__(self, *args, **kwargs):
actions = kwargs.pop("actions")
super().__init__(*args, **kwargs)
self.fields[self.additional_prefix + "company_name"] = forms.CharField(
required=False, label="Company Name"
)
self.fields[self.additional_prefix + "address_1"] = forms.CharField(
label="Address", required=False
)
self.fields[self.additional_prefix + "address_2"] = forms.CharField(
label="", required=False
)
self.fields[self.additional_prefix + "address_3"] = forms.CharField(
label="", required=False
)
self.fields[self.additional_prefix + "town"] = forms.CharField(
required=False, label="Town"
)
self.fields[self.additional_prefix + "county"] = forms.CharField(
required=False, label="County"
)
self.fields[self.additional_prefix + "postcode"] = forms.CharField(
required=False, label="Postcode"
)
self.fields[self.additional_prefix + "country"] = forms.CharField(
required=False, label="Country"
)
# contact
self.fields[self.additional_prefix + "contact_name"] = forms.CharField(
required=False, label="Contact Name"
)
self.fields[self.additional_prefix + "email"] = forms.EmailField(
required=False, label="Email"
)
self.fields[self.additional_prefix + "phone"] = forms.CharField(
required=False, label="Phone"
)
choices = self._action_choices(actions)
self.fields["action"].choices = choices
if len(choices) == 1:
self.fields["action"].widget = forms.HiddenInput()
self.initial["action"] = choices[0][0]
elif CheckoutAction.PAYMENT in actions:
self.initial["action"] = CheckoutAction.PAYMENT
hidden_fields = []
# hide invoice fields if not used
if not CheckoutAction.INVOICE in actions:
hidden_fields = [
self.additional_prefix + "company_name",
self.additional_prefix + "address_1",
self.additional_prefix + "address_2",
self.additional_prefix + "address_3",
self.additional_prefix + "town",
self.additional_prefix + "county",
self.additional_prefix + "postcode",
self.additional_prefix + "country",
self.additional_prefix + "contact_name",
self.additional_prefix + "email",
self.additional_prefix + "phone",
]
hidden_fields.append("token")
for name in hidden_fields:
self.fields[name].widget = forms.HiddenInput()
for field_name in (
self.additional_prefix + "company_name",
self.additional_prefix + "address_1",
self.additional_prefix + "town",
self.additional_prefix + "county",
self.additional_prefix + "postcode",
self.additional_prefix + "contact_name",
self.additional_prefix + "email",
self.additional_prefix + "phone",
):
if "class" in self.fields[field_name].widget.attrs:
css_class = (
self.fields[field_name].widget.attrs["class"]
+ " required-when-invoice"
)
else:
css_class = "required-when-invoice"
self.fields[field_name].widget.attrs.update({"class": css_class})
def _action_choices(self, actions):
result = []
for item in actions:
obj = CheckoutAction.objects.get(slug=item)
result.append((item, obj.name))
return result
[docs] def clean(self):
cleaned_data = super().clean()
action = cleaned_data.get("action")
if action == CheckoutAction.INVOICE:
valid = True
for name in (
self.additional_prefix + "company_name",
self.additional_prefix + "address_1",
self.additional_prefix + "town",
self.additional_prefix + "county",
self.additional_prefix + "postcode",
self.additional_prefix + "country",
self.additional_prefix + "contact_name",
):
cleaned_field_data = cleaned_data.get(name)
if cleaned_field_data:
valid = valid and cleaned_field_data.strip()
else:
valid = False
if valid:
cleaned_email_data = cleaned_data.get(
self.additional_prefix + "email"
)
cleaned_phone_data = cleaned_data.get(
self.additional_prefix + "phone"
)
valid = (cleaned_email_data and cleaned_email_data.strip()) or (
cleaned_phone_data and cleaned_phone_data.strip()
)
if not valid:
raise forms.ValidationError(
"Please enter an email address or phone number."
)
else:
raise forms.ValidationError(
"Please enter an invoice company name, address, town, "
"county, postcode, country, contact name and an email "
"address or phone number."
)
return cleaned_data
[docs] def additional_data(self):
return dict(
company_name=self.cleaned_data[
self.additional_prefix + "company_name"
],
address_1=self.cleaned_data[self.additional_prefix + "address_1"],
address_2=self.cleaned_data[self.additional_prefix + "address_2"],
address_3=self.cleaned_data[self.additional_prefix + "address_3"],
town=self.cleaned_data[self.additional_prefix + "town"],
county=self.cleaned_data[self.additional_prefix + "county"],
postcode=self.cleaned_data[self.additional_prefix + "postcode"],
country=self.cleaned_data[self.additional_prefix + "country"],
contact_name=self.cleaned_data[
self.additional_prefix + "contact_name"
],
email=self.cleaned_data[self.additional_prefix + "email"],
phone=self.cleaned_data[self.additional_prefix + "phone"],
)
[docs]class CustomerPaymentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["description"].widget.attrs.update(
{"class": "pure-input-1-2"}
)