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())