예제 #1
0
파일: views.py 프로젝트: thomaspaulb/voko
    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)
예제 #2
0
    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)
예제 #3
0
파일: views.py 프로젝트: rikva/voko
    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
예제 #4
0
    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
예제 #5
0
파일: views.py 프로젝트: thomaspaulb/voko
 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)
예제 #6
0
 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
예제 #7
0
    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
예제 #8
0
파일: views.py 프로젝트: thomaspaulb/voko
 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
예제 #9
0
 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)
예제 #10
0
파일: views.py 프로젝트: thomaspaulb/voko
    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
예제 #11
0
 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)
예제 #12
0
    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
예제 #13
0
파일: views.py 프로젝트: thomaspaulb/voko
    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
예제 #14
0
    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,)))
예제 #15
0
파일: views.py 프로젝트: thomaspaulb/voko
 def _get_initial(self):
     order = get_or_create_order(self.request.user)
     return {'product': self.get_object().pk,
             'order': order.pk}
예제 #16
0
파일: views.py 프로젝트: thomaspaulb/voko
 def get_success_url(self):
     return reverse(
         "finish_order",
         kwargs={'pk': get_or_create_order(self.request.user).pk}
     )
예제 #17
0
파일: views.py 프로젝트: thomaspaulb/voko
    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,)))
예제 #18
0
 def get_success_url(self):
     return reverse("finish_order", kwargs={'pk': get_or_create_order(self.request.user).pk})
예제 #19
0
 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)
예제 #20
0
 def _get_initial(self):
     order = get_or_create_order(self.request.user)
     return {'product': self.get_object().pk,
             'order': order.pk}