Source code for oscar.apps.checkout.forms
from django import forms
from django.contrib.auth.forms import AuthenticationForm
from django.utils.translation import gettext_lazy as _
from oscar.apps.customer.utils import normalise_email
from oscar.core.compat import get_user_model
from oscar.core.loading import get_class, get_model
from oscar.forms.mixins import PhoneNumberMixin
User = get_user_model()
AbstractAddressForm = get_class("address.forms", "AbstractAddressForm")
Country = get_model("address", "Country")
[docs]class ShippingAddressForm(PhoneNumberMixin, AbstractAddressForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.adjust_country_field()
def adjust_country_field(self):
countries = Country._default_manager.filter(is_shipping_country=True)
# No need to show country dropdown if there is only one option
if len(countries) == 1:
self.fields.pop("country", None)
self.instance.country = countries[0]
else:
self.fields["country"].queryset = countries
self.fields["country"].empty_label = None
class Meta:
model = get_model("order", "shippingaddress")
fields = [
"first_name",
"last_name",
"line1",
"line2",
"line3",
"line4",
"state",
"postcode",
"country",
"phone_number",
"notes",
]
[docs]class ShippingMethodForm(forms.Form):
method_code = forms.ChoiceField(widget=forms.HiddenInput)
def __init__(self, *args, **kwargs):
methods = kwargs.pop("methods", [])
super().__init__(*args, **kwargs)
self.fields["method_code"].choices = ((m.code, m.name) for m in methods)
[docs]class GatewayForm(AuthenticationForm):
username = forms.EmailField(label=_("My email address is"))
GUEST, NEW, EXISTING = "anonymous", "new", "existing"
CHOICES = (
(GUEST, _("I am a new customer and want to checkout as a guest")),
(
NEW,
_(
"I am a new customer and want to create an account "
"before checking out"
),
),
(EXISTING, _("I am a returning customer, and my password is")),
)
options = forms.ChoiceField(
widget=forms.widgets.RadioSelect, choices=CHOICES, initial=GUEST
)
def clean_username(self):
return normalise_email(self.cleaned_data["username"])
[docs] def clean(self):
if self.is_guest_checkout() or self.is_new_account_checkout():
if "password" in self.errors:
del self.errors["password"]
if "username" in self.cleaned_data:
email = normalise_email(self.cleaned_data["username"])
if User._default_manager.filter(email__iexact=email).exists():
msg = _("A user with that email address already exists")
self._errors["username"] = self.error_class([msg])
# change the value of the 'options' in the submitted data,
# which will be used to render the form
options_field = self.add_prefix("options")
self.data = self.data.copy()
self.data[options_field] = self.EXISTING
return self.cleaned_data
return super().clean()
def is_guest_checkout(self):
return self.cleaned_data.get("options", None) == self.GUEST
def is_new_account_checkout(self):
return self.cleaned_data.get("options", None) == self.NEW
# The BillingAddress form is in oscar.apps.payment.forms