예제 #1
0
def checkout_form_factory():
    """Returns a form corresponding to a subset of the ORDER_DETAIL_MODEL, if 
       one is specified and CHECKOUT_FORM_FIELDS is set. Otherwise returns a 
       dummy form."""
    try:
        order_detail_cls = get_order_detail_class()
    except OrderDetailNotAvailable:
        order_detail_cls = None

    if order_detail_cls and cart_settings.CHECKOUT_FORM_FIELDS:

        class CheckoutForm(forms.ModelForm):
            class Meta:
                model = order_detail_cls
                fields = cart_settings.CHECKOUT_FORM_FIELDS

            def update(self, cart):
                for name in self.cleaned_data:
                    cart.detail_data[name] = self.cleaned_data[name]
                cart.modified()

        return CheckoutForm
    else:

        class DummyForm(forms.Form):
            def update(self, cart):
                pass

        return DummyForm
예제 #2
0
 def get_detail(self):
     """
     Returns extra detail as stored in the ORDER_DETAIL_MODEL setting
     """
     if not hasattr(self, '_detail_cache'):
         try:
             self._detail_cache = get_order_detail_class()._default_manager.using(self._state.db).get(order__id__exact=self.id)
             self._detail_cache.order = self
         except OrderDetailNotAvailable:
             self._detail_cache = None
     return self._detail_cache
예제 #3
0
def order_detail_form_factory():
    """Returns a form for the extra custom details defined in ORDER_DETAIL_MODEL.
       Excludes those displayed in the checkout via CHECKOUT_FORM_FIELDS."""
    try:
        model_cls = get_order_detail_class()

        class OrderDetailForm(forms.ModelForm):
            class Meta:
                model = model_cls
                exclude = ['order'] + (cart_settings.CHECKOUT_FORM_FIELDS)

        return OrderDetailForm
    except OrderDetailNotAvailable:
        # dummy form class with no fields, to simplify the view
        class DummyForm(forms.Form):
            def __init__(self, *args, **kwargs):
                kwargs.pop('instance', None)
                super(DummyForm, self).__init__(*args, **kwargs)

        return DummyForm
예제 #4
0
def delivery(request, order_form_cls=OrderForm):
    """Collects standard delivery information, along with any extra information
       from the order_detail model."""
    
    cart = Cart(request)
    
    if not validate_cart(request, 'delivery'):
        return HttpResponseRedirect(reverse(checkout))
    else:
        try:
            instance = Order.objects.get(pk=cart.data.get('order_pk', None))
            try:
                detail_instance = instance.get_detail()
            except get_order_detail_class().DoesNotExist:
                detail_instance = None
        except Order.DoesNotExist:
            instance = None
            detail_instance = None
        
        # get detail form, or dummy form if no ORDER_DETAIL_MODEL defined
        detail_form_cls = order_detail_form_factory()
        
        form_kwargs = {'label_suffix': '', 'instance': instance, 'initial': cart.data}
        detail_form_kwargs = {'label_suffix': '', 'instance': detail_instance, 'initial': cart.detail_data, 'prefix': 'detail'}
        
        
        if request.POST:
            form = order_form_cls(request.POST, **form_kwargs)
            detail_form = detail_form_cls(request.POST, **detail_form_kwargs)
            valid = form.is_valid() and detail_form.is_valid()
            if valid:
                order = form.save(commit=False)
                order.session_id = request.session.session_key
                order.shipping_cost = cart.shipping_cost()
                order.status = 'confirmed'
                
                order.save()
                
                for line in order.orderline_set.all():
                    line.delete()
                for item in cart:
                    order.orderline_set.create(
                        product=item.product,
                        quantity=item['quantity'],
                        price=item.row_total(),
                        options=simplejson.dumps(item['options'])
                    )
                
                
                # if the form has no 'save' method, assume it's the dummy form
                if callable(getattr(detail_form, 'save', None)):
                    detail = detail_form.save(commit=False)
                    detail.order = order # in case it is being created for the first time
                    for field in cart_settings.CHECKOUT_FORM_FIELDS:
                        setattr(detail, field, cart.detail_data[field])
                    detail.save()
                
                cart.data['order_pk'] = order.pk
                cart.modified()
                
                redirect_url = reverse('cart.views.payment', args=(order.hash,))
            else:
                redirect_url = None
                
            if request.is_ajax():
                html = render_to_string(
                    'cart/delivery_ajax.html',
                    RequestContext(request, {
                        'cart': cart,
                        'form': form,
                        'detail_form': detail_form,
                        'steps': steps(request),
                        'current_step': 2,
                    })
                )
                    
                return HttpResponse(simplejson.dumps({
                    'success': valid,
                    'redirect_url': redirect_url,
                    'hard_redirect': True,
                    'html': html,
                }), mimetype='application/json')

            elif valid:
                return HttpResponseRedirect(redirect_url)
                
        else:
            form = order_form_cls(**form_kwargs)
            detail_form = detail_form_cls(**detail_form_kwargs)
    
    
        return render_to_response(
            'cart/delivery.html', 
            RequestContext(request, {
                'cart': cart,
                'form': form,
                'detail_form': detail_form,
                'steps': steps(request),
                'current_step': 2,
            })
        )