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