def google_products(self, request): def prettify_xml(elem): """ Return a pretty-printed XML string for the Element. """ rough_string = tostring(elem) reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent='\t').encode('utf-8', 'replace') products = get_product_model().objects.filter(feed_google=True) root = Element('rss') root.attrib['xmlns:g'] = 'http://base.google.com/ns/1.0' root.attrib['version'] = '2.0' channel = SubElement(root, 'channel') title = SubElement(channel, 'title') title.text = request.settings.name link = SubElement(channel, 'link') link.text = settings.DOMAIN_NAME description = SubElement(channel, 'description') for p in products: # availability if p.is_available and not p.pre_order: txt_availability = 'in stock' elif p.pre_order: txt_availability = 'preorder' else: txt_availability = 'out of stock' # determine delivery charge by placing the product onto the basket basket = Basket() basket.add_item(p, None, 1) delivery_charge = basket.delivery # determine feed item attributes txt_id = unicode(p.id) txt_title = clean_unicode(p.title).strip() txt_link = p.get_absolute_url() txt_description = text_from_html(p.description, 5000) txt_condition = 'new' txt_price = '%.2f GBP' % p.price txt_google_category = p.category.google_product_category if p.category and p.category.google_product_category else None txt_category = p.category.get_taxonomy_path( ) if p.category else None txt_country = 'GB' txt_delivery_price = '%s %s' % (delivery_charge, 'GBP') txt_barcode = p.barcode.strip() if p.barcode else None txt_part_number = p.part_number.strip() if p.part_number else None txt_brand = p.get_brand_title() # create item item = SubElement(channel, 'item') # id _id = SubElement(item, 'g:id') _id.text = txt_id # title title = SubElement(item, 'title') title.text = txt_title # link/url link = SubElement(item, 'link') link.text = txt_link # main text description = SubElement(item, 'description') description.text = txt_description # condition condition = SubElement(item, 'g:condition') condition.text = txt_condition # price price = SubElement(item, 'g:price') price.text = txt_price # availability availability = SubElement(item, 'g:availability') availability.text = txt_availability # google shopping category if txt_google_category: gcategory = SubElement(item, 'g:google_product_category') gcategory.text = txt_google_category # product type if txt_category: category = SubElement(item, 'g:product_type') category.text = txt_category # shipping shipping = SubElement(item, 'g:shipping') # country country = SubElement(shipping, 'g:country') country.text = txt_country # delivery price delivery_price = SubElement(shipping, 'g:price') delivery_price.text = txt_delivery_price # barcode, must be a valid UPC-A (GTIN-12), EAN/JAN (GTIN-13) # or GTIN-14, so we need to have at least 12 characters. if txt_barcode: gtin = SubElement(item, 'g:gtin') gtin.text = txt_barcode # part number if txt_part_number: _mpn = SubElement(item, 'g:mpn') _mpn.text = txt_part_number # brand if txt_brand: brand = SubElement(item, 'g:brand') brand.text = txt_brand # image if p.image: image = SubElement(item, 'g:image_link') image.text = p.image.large_url # additional images if len(p.gallery) > 0: for m in p.gallery[:10]: additional_image_link = SubElement( item, 'g:additional_image_link') additional_image_link.text = m.large_url # get temp. filename f = NamedTemporaryFile(delete=False) tmp_filename = f.name f.close() # create tmp file (utf-8) f = open(tmp_filename, 'w+b') f.write(prettify_xml(root)) f.seek(0) # send response filename = 'google_products_%s.xml' % datetime.date.today().strftime( '%d_%m_%Y') response = HttpResponse(FileWrapper(f), content_type='text/plain') response['Content-Disposition'] = 'attachment; filename=%s' % filename return response
def add(request): """ Add given product to the customer's basket and redirect to the basket page. """ product = get_product_or_404(request) return_url = get_return_url(request) form = AddToBasketForm(request.POST, request=request, product=product) variant = '' quantity = 0 price = 0 prefix = None if form.is_valid(): d = form.cleaned_data variety_options = form.get_variety_options() variety_option_labels = form.get_variety_option_labels(variety_options) variant = ', '.join([option.title for option in variety_options]) quantity = form.get_quantity() prefix = get_basket_prefix(request, d) # add to basket basket = Basket(request, prefix=prefix) item = basket.add_item(product, variety_options, quantity, custom=None, labels=variety_option_labels) if item: price = item.total_product else: messages.error( request, "Please note that the product '%s' cannot be added to basket." % product.title) # alert for non-returnable products if product.non_returnable: messages.warning( request, "Please note that the product '%s' cannot be returned." % product.title) # hook shop = get_shop() shop.on_basket_added(request, basket, product, variety_options, quantity) basket.save() errors = False else: errors = form.errors if request.is_ajax(): basket = Basket(request, prefix=prefix) return to_json_response({ 'success': True, 'html': get_basket_html(request, basket), 'errors': errors, 'prefix': basket.prefix, 'added': product.to_ga_dict({ 'variant': variant, 'quantity': quantity, 'price': price }) }) else: return HttpResponseRedirect(return_url)