Esempio n. 1
0
    def post(self, request, *args, **kwargs):
        profile = request.user.get_profile()
        self.object = self.get_object()
        has_errors = not (profile.billing_address and profile.shipping_address) and not self.object
        if has_errors:
            return self.render_to_response(self.get_context_data())
        try:
            with transaction.atomic():
                profile = UserProfile.objects.get(user=request.user)
                if profile.balance < self.object.price:
                    raise NotEnoughCoins

                self.object.is_sold = True
                self.object.save()

                profile.balance -= self.object.price
                profile.save()

                billing_address = profile.billing_address
                billing_address.pk = None
                billing_address.save()

                shipping_address = profile.shipping_address
                shipping_address.pk = None
                shipping_address.save()

                order = Order()
                order.item = self.object
                order.amount = self.object.price
                order.customer = request.user
                order.billing_address = billing_address
                order.shipping_address = shipping_address
                order.save()
        except IntegrityError:
            messages.error(request, 'Could not process request')
            return self.render_to_response(self.get_context_data())
        except NotEnoughCoins:
            messages.error(request, 'You have not enough coins.')
            return self.render_to_response(self.get_context_data())

        if Site._meta.installed:
            site = Site.objects.get_current()
        else:
            site = RequestSite(request)
        signals.item_was_sold.send(sender=self.__class__,
                                   order=order,
                                   site=site,
                                   request=request)
        return HttpResponseRedirect(self.get_success_url())