Example #1
0
    def create_order(self):
        """ Create an Order object from the Cart"""
        cart = Cart.from_request(self.request)

        assert cart.pk, 'Cart not persistent'
        assert cart.customer, 'No customer for Cart'
        assert cart.customer.get_address(), 'No address for customer'
        assert cart.get_items(), 'No items in Cart'

        order = Order.from_cart(cart)

        # Don't assume transactions here - clean up after ourselves manually
        try:
            order.update()
            order.save()

            # Double-check whether stock is available
            order.check_stock()

            # Delete old potential errors for this cart
            # Make sure the current order is excluded, as well as orders
            # for which a payment has been initiated.
            old_orders = Order.objects.filter(cart=cart, payment_cluster__isnull=True).exclude(pk=order.pk)
            logger.debug(u'Deleting old %d orders for cart %s',
                         old_orders.count(), cart)
            old_orders.delete()

        except:
            # Delete the order if something went wrong - as to prevent
            # double order numbers
            if order.pk:
                order.delete()

            raise

        return order
Example #2
0
    def get_context_data(self, object, **kwargs):
        """
        Add an eventual category and subcategory to the request when the
        `category` and `subcategory` COOKIES-parameters has been specified.
        """

        context = super(ProductDetail, self).get_context_data(**kwargs)

        # User and product for quick reference
        user = self.request.user
        product = self.object

        # Rating code
        if self.request.method == 'POST' and \
            'rating_submit' in self.request.POST:

            # We're catching a post: parse results of the form
            ratingform = RatingForm(user, product, self.request.POST, prefix='rating')
            if ratingform.is_valid():
                logger.debug(u'Rating saved for product %s' % product)
                ratingform.save()

                messages.add_message(self.request,
                                     messages.SUCCESS,
                                     _(u'Your rating has been succesfully saved.'))

                # Start with an empty form
                ratingform = RatingForm(user, product, prefix='rating')
        else:
            ratingform = RatingForm(user, product, prefix='rating')

        if self.request.method == 'POST' and \
            'email_submit' in self.request.POST:

            emailform = EmailForm(self.request.POST, prefix='email')

            if emailform.is_valid():
                from django.conf import settings
                from django.contrib.sites.models import Site, RequestSite

                email = emailform.cleaned_data['email']
                recipient_list = [mail_tuple[1] for mail_tuple in settings.MANAGERS]

                if Site._meta.installed:
                    site = Site.objects.get_current()
                else:
                    site = RequestSite(self.request)

                # Render the e-mail template
                request_context = RequestContext(self.request, dict(email=email, site=site, product=product))
                msg = loader.render_to_string('basic_webshop/emails/backorder_request.txt', request_context)
                subject = '%s: Aanvraag voor melding herbevoorrading' % (product.name, )

                send_mail(fail_silently=False, recipient_list = recipient_list, message = msg, from_email = email, subject = subject)

                logger.debug(u'Backorder made for email: %s product %s' % (email, product))

                context.update({'backorder_sent': True})
        else:
            emailform = EmailForm(prefix='email')

            

        # Cart adding
        cart = Cart.from_request(self.request)
        if self.request.method == 'POST' and \
            'cart_submit' in self.request.POST:

            cartaddform = CartAddForm(self.object,
                                      cart,
                                      self.request.POST, prefix='cartadd')


            if cartaddform.is_valid():
                logger.debug(u'Adding items to cart for %s' % product)

                if not cart.pk:
                    # Make sure our Cart is saved
                    cart.save()

                    # Store a reference to the newly created persistent cart
                    # onto the request
                    cart.to_request(self.request)

                assert cart.pk
                assert cart.from_request(self.request) == cart

                cartaddform.save()

                messages.add_message(self.request,
                                     messages.SUCCESS,
                                     _(u'Added %s to shopping cart.') \
                                     % product)
        else:
            cartaddform = CartAddForm(product, cart, prefix='cartadd')

        category_pk = self.request.COOKIES.get('category_pk', None)
        if category_pk:
            try:
                category = Category.in_shop.get(product=product, pk=category_pk)
            except Category.DoesNotExist:
                category = None
                logger.debug('Category for pk %d does not match product %s',
                             category_pk, product)

        else:
            category = None

        # If category not found by cookie, start guessing
        if not category:
            # Grab the first main category
            try:
                category = object.categories.filter(level=0)[0]
            except IndexError:
                category = None
                logger.warning(u'No categories defined for %s', object)

        ancestors = category.get_ancestors(include_self=True)

        # Voterange is used to render the rating result
        voterange = xrange(1, 6)

        # Ratings
        ratings = ProductRating.objects.filter(product=product)
        # Filter by language
        language_code = get_language()
        ratings = ratings.filter(language=language_code)

        # Average rating and total ratings count
        average_rating = ratings.aggregate(models.Avg('rating')).get('rating__avg', None)

        from django.contrib.auth.forms import AuthenticationForm

        loginform = AuthenticationForm()

        # Update the context
        context.update({
            'ratings': ratings,
            'average_rating': average_rating,
            'voterange': range(1, 6),
            'ratingform': ratingform,
            'cartaddform': cartaddform,
            'loginform' : loginform,
            'emailform': emailform,
            'category': category,
            'category_ancestors': ancestors,
        })

        return context