Browse Source

Don't show country field if only one is available

This affects the shipping address form in checkout.
master
David Winterbottom 12 years ago
parent
commit
a77e78cc23
2 changed files with 20 additions and 11 deletions
  1. 10
    6
      oscar/apps/checkout/forms.py
  2. 10
    5
      oscar/apps/checkout/views.py

+ 10
- 6
oscar/apps/checkout/forms.py View File

@@ -8,19 +8,23 @@ from oscar.apps.customer.utils import normalise_email
8 8
 from oscar.core.compat import get_user_model
9 9
 
10 10
 User = get_user_model()
11
+Country = get_model('address', 'Country')
11 12
 
12 13
 
13 14
 class ShippingAddressForm(AbstractAddressForm):
14 15
 
15 16
     def __init__(self, *args, **kwargs):
16 17
         super(ShippingAddressForm, self).__init__(*args, **kwargs)
17
-        self.set_country_queryset()
18
-        self.fields['country'].empty_label = None
18
+        countries = Country._default_manager.filter(
19
+            is_shipping_country=True)
19 20
 
20
-    def set_country_queryset(self):
21
-        self.fields['country'].queryset = get_model(
22
-            'address', 'country')._default_manager.filter(
23
-                is_shipping_country=True)
21
+        # No need to show country dropdown if there is only one option
22
+        if len(countries) == 1:
23
+            del self.fields['country']
24
+            self.instance.country = countries[0]
25
+        else:
26
+            self.fields['country'].queryset = countries
27
+            self.fields['country'].empty_label = None
24 28
 
25 29
     class Meta:
26 30
         model = get_model('order', 'shippingaddress')

+ 10
- 5
oscar/apps/checkout/views.py View File

@@ -149,10 +149,11 @@ class ShippingAddressView(CheckoutSessionMixin, FormView):
149 149
         return UserAddress._default_manager.filter(user=self.request.user).order_by('-is_default_for_shipping')
150 150
 
151 151
     def post(self, request, *args, **kwargs):
152
-        # Check if a shipping address was selected directly (eg no form was filled in)
152
+        # Check if a shipping address was selected directly (eg no form was
153
+        # filled in)
153 154
         if self.request.user.is_authenticated() and 'address_id' in self.request.POST:
154
-            address = UserAddress._default_manager.get(pk=self.request.POST['address_id'],
155
-                                                       user=self.request.user)
155
+            address = UserAddress._default_manager.get(
156
+                pk=self.request.POST['address_id'], user=self.request.user)
156 157
             action = self.request.POST.get('action', None)
157 158
             if action == 'ship_to':
158 159
                 # User has selected a previous address to ship to
@@ -166,11 +167,15 @@ class ShippingAddressView(CheckoutSessionMixin, FormView):
166 167
             else:
167 168
                 return HttpResponseBadRequest()
168 169
         else:
169
-            return super(ShippingAddressView, self).post(request, *args, **kwargs)
170
+            return super(ShippingAddressView, self).post(
171
+                request, *args, **kwargs)
170 172
 
171 173
     def form_valid(self, form):
172 174
         # Store the address details in the session and redirect to next step
173
-        self.checkout_session.ship_to_new_address(form.clean())
175
+        address_fields = dict(
176
+            (k, v) for (k, v) in form.instance.__dict__.items()
177
+            if not k.startswith('_'))
178
+        self.checkout_session.ship_to_new_address(address_fields)
174 179
         return super(ShippingAddressView, self).form_valid(form)
175 180
 
176 181
     def get_success_url(self):

Loading…
Cancel
Save