def post(self, request, *args, **kwargs): form_class = self.get_form_class() form = form_class(request.POST, instance=get_order_product( product=self.get_object(), order=get_or_create_order(user=self.request.user))) if form.is_valid(): order = get_or_create_order(request.user) # Sanity checks assert order.finalized is False assert order.paid is False order_product = form.save(commit=False) order_product.order = order order_product.retail_price = self.get_object().retail_price order_product.base_price = self.get_object().base_price if order_product.product.order_round: # TODO: nicer error, or just disable ordering. assert (order_product.product.order_round == self.request.current_order_round) # Remove product from order when amount is zero if order_product.amount < 1: if order_product.id is not None: order_product.delete() return self.form_valid(form) order_product.save() return self.form_valid(form)
def post(self, request, *args, **kwargs): form_class = self.get_form_class() form = form_class(request.POST, instance=get_order_product(product=self.get_object(), order=get_or_create_order( user=self.request.user ))) if form.is_valid(): order = get_or_create_order(request.user) assert order.finalized is False assert order.paid is False order_product = form.save(commit=False) order_product.order = order order_product.retail_price = self.get_object().retail_price order_product.base_price = self.get_object().base_price if order_product.product.order_round: assert order_product.product.order_round == self.request.current_order_round # TODO: nicer error, or just disable ordering. # Remove product from order when amount is zero if order_product.amount < 1: if order_product.id is not None: order_product.delete() return self.form_valid(form) order_product.save() return self.form_valid(form)
def get_context_data(self, **kwargs): ctx = super(OverView, self).get_context_data(**kwargs) if self.request.user.id: # TODO: this line might be obsolete get_or_create_order(self.request.user) ctx['orders'] = self.request.user.orders.filter( paid=True).order_by("-pk") ctx['balances'] = self.request.user.balance.all().order_by('-pk') return ctx
def form(self): existing_op = get_order_product( product=self.get_object(), order=get_or_create_order(self.request.user) ) return OrderProductForm(initial=self._get_initial(), instance=existing_op)
def get(self, *args, **kwargs): ret = super(ProductsView, self).get(*args, **kwargs) order = get_or_create_order(self.request.user) if order.finalized is True: messages.warning(self.request, "Je bent doorgestuurd naar de betaalpagina omdat je " "bestelling nog niet is betaald!") return HttpResponseRedirect(reverse('finance.choosebank')) return ret
def get_context_data(self, **kwargs): context = super(ProductsView, self).get_context_data(**kwargs) context['current_order_round'] = self.request.current_order_round # Manual override to show product list of specific round if 'round' in self.request.GET: context['current_order_round'] = OrderRound.objects.get(id=int(self.request.GET.get('round'))) context['order'] = get_or_create_order(self.request.user) return context
def get(self, *args, **kwargs): ret = super(ProductsView, self).get(*args, **kwargs) order = get_or_create_order(self.request.user) if order.finalized is True: messages.warning( self.request, "Je bent doorgestuurd naar de betaalpagina " "omdat je bestelling nog niet is betaald!" ) return HttpResponseRedirect(reverse('finance.choosebank')) return ret
def get_current_order(self): """ Allows us to use: VokoUser.orders.get_current_order() """ try: return super(OrderManager, self).get_queryset().filter(paid=False, user=self.instance, order_round=get_current_order_round()).order_by('-pk')[0] except IndexError: return get_or_create_order(user=self.instance)
def get_context_data(self, **kwargs): context = super(ProductsView, self).get_context_data(**kwargs) context['current_order_round'] = self.request.current_order_round # Manual override to show product list of specific round if 'round' in self.request.GET: context['current_order_round'] = OrderRound.objects.get( id=int(self.request.GET.get('round')) ) context['order'] = get_or_create_order(self.request.user) return context
def get_current_order(self): """ Allows us to use: VokoUser.orders.get_current_order() """ try: return super(OrderManager, self).get_queryset().filter( paid=False, user=self.instance, order_round=get_current_order_round()).order_by('-pk')[0] except IndexError: return get_or_create_order(user=self.instance)
def products(self): """ Return all products in this round. Assign an 'ordered_amount' attribute to any product for which an OrderProduct exists for the current open order and the product. """ user_open_order = get_or_create_order(self.request.user) qs = list(self.get_queryset()) for product in qs: if product.orderproducts.filter(order=user_open_order): product.ordered_amount = product.orderproducts.get(order=user_open_order).amount # don't show unavailable stock products. This is not very efficient, it should be done at DB level if product.is_stock_product() and not product.is_available: continue yield product
def products(self): """ Return all products in this round. Assign an 'ordered_amount' attribute to any product for which an OrderProduct exists for the current open order and the product. """ user_open_order = get_or_create_order(self.request.user) qs = list(self.get_queryset()) for product in qs: if product.orderproducts.filter(order=user_open_order): product.ordered_amount = product.orderproducts.get( order=user_open_order).amount # Don't show unavailable stock products. # This is not very efficient, it should be done at DB level if product.is_stock_product() and not product.is_available: continue yield product
def post(self, request, *args, **kwargs): """ Handling complex forms using Django's forms framework is nearly impossible without all kinds of trickery that don't necessarily make the code more readable. Hence: manual parsing of POST data. """ order = get_or_create_order(self.request.user) assert order.finalized is False assert order.paid is False for key, value in request.POST.iteritems(): if key.startswith("order-product-") and (value.isdigit() or value == ""): try: prod_id = int(key.split("-")[-1]) value = value.strip() product = Product.objects.get(id=prod_id) except (IndexError, ValueError, Product.DoesNotExist): messages.add_message(self.request, messages.ERROR, "Er ging iets fout bij het opslaan. " "Probeer het opnieuw of neem contact met ons op.") return redirect('view_products') try: order_product = OrderProduct.objects.get(order=order, product=product) except OrderProduct.DoesNotExist: order_product = None if value.isdigit() and product.maximum_total_order and int(value) > product.amount_available: if product.is_available: messages.add_message(self.request, messages.ERROR, "Van het product '%s' van %s is nog %s %s beschikbaar!" % (product.name, product.supplier.name, product.amount_available, product.unit_of_measurement.lower())) else: messages.add_message(self.request, messages.ERROR, "Het product '%s' van %s is uitverkocht!" % (product.name, product.supplier.name)) value = 0 # User deleted a product if type(value) != int and not value.isdigit(): value = 0 if not int(value): if order_product: order_product.delete() continue # Update orderproduct if order_product: if order_product.amount != int(value): order_product.amount = int(value) order_product.save() continue # Create orderproduct if value and int(value) > 0: OrderProduct.objects.create(order=order, product=product, amount=int(value), retail_price=product.retail_price, base_price=product.base_price) return redirect(reverse('finish_order', args=(order.pk,)))
def _get_initial(self): order = get_or_create_order(self.request.user) return {'product': self.get_object().pk, 'order': order.pk}
def get_success_url(self): return reverse( "finish_order", kwargs={'pk': get_or_create_order(self.request.user).pk} )
def post(self, request, *args, **kwargs): """ Handling complex forms using Django's forms framework is nearly impossible without all kinds of trickery that don't necessarily make the code more readable. Hence: manual parsing of POST data. """ order = get_or_create_order(self.request.user) assert order.finalized is False assert order.paid is False for key, value in list(request.POST.items()): if (key.startswith("order-product-") and (value.isdigit() or value == "")): try: prod_id = int(key.split("-")[-1]) value = value.strip() product = Product.objects.get(id=prod_id) except (IndexError, ValueError, Product.DoesNotExist): self._message_unknown_error() return redirect('view_products') try: order_product = OrderProduct.objects.get(order=order, product=product) except OrderProduct.DoesNotExist: order_product = None if (value.isdigit() and product.maximum_total_order and int(value) > product.amount_available): if product.is_available: self._message_insufficient_available(product) else: self._message_sold_out(product) value = 0 # User deleted a product if type(value) != int and not value.isdigit(): value = 0 if not int(value): if order_product: order_product.delete() continue # Update order_product if order_product: if order_product.amount != int(value): order_product.amount = int(value) order_product.save() continue # Create order_product if value and int(value) > 0: OrderProduct.objects.create( order=order, product=product, amount=int(value), retail_price=product.retail_price, base_price=product.base_price ) return redirect(reverse('finish_order', args=(order.pk,)))
def get_success_url(self): return reverse("finish_order", kwargs={'pk': get_or_create_order(self.request.user).pk})
def form(self): existing_op = get_order_product(product=self.get_object(), order=get_or_create_order(self.request.user)) return OrderProductForm(initial=self._get_initial(), instance=existing_op)