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 CustomerCheckoutForm(CheckoutForm):
[docs] class Meta: model = Customer fields = ("action",)
[docs]class CustomerEmptyForm(forms.ModelForm):
[docs] class Meta: model = Customer fields = ()
[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"} )
[docs] class Meta: model = CustomerPayment fields = ("description", "total")
[docs]class ObjectPaymentPlanEmptyForm(forms.ModelForm):
[docs] class Meta: model = ObjectPaymentPlan fields = ()
[docs]class ObjectPaymentPlanInstalmentEmptyForm(forms.ModelForm):
[docs] class Meta: model = ObjectPaymentPlanInstalment fields = ()
[docs]class ObjectPaymentPlanInstalmentCheckoutForm(CheckoutForm):
[docs] class Meta: model = ObjectPaymentPlanInstalment fields = ("action",)
[docs]class PaymentPlanEmptyForm(forms.ModelForm):
[docs] class Meta: model = PaymentPlan fields = ()
[docs]class PaymentPlanForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["name"].widget.attrs.update( {"class": "pure-input-1-2", "rows": 4} )
[docs] class Meta: model = PaymentPlan fields = ("slug", "name", "deposit", "count", "interval")