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 = [ 'title', '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]) 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