import werkzeug
from openerp import SUPERUSER_ID
-from openerp.addons.web import http
-from openerp.addons.web.http import request
+from openerp import http
+from openerp.http import request
from openerp.tools.translate import _
from openerp.addons.website.models.website import slug
pricelist = partner.property_product_pricelist
return pricelist
+ def get_attribute_value_ids(self, product):
+ cr, uid, context, pool = request.cr, request.uid, request.context, request.registry
+ currency_obj = pool['res.currency']
+ attribute_value_ids = []
+ if request.website.pricelist_id.id != context['pricelist']:
+ website_currency_id = request.website.currency_id.id
+ currency_id = self.get_pricelist().currency_id.id
+ for p in product.product_variant_ids:
+ price = currency_obj.compute(cr, uid, website_currency_id, currency_id, p.lst_price)
+ attribute_value_ids.append([p.id, map(int, p.attribute_value_ids), p.price, price])
+ else:
+ attribute_value_ids = [[p.id, map(int, p.attribute_value_ids), p.price, p.lst_price] for p in product.product_variant_ids]
+
+ return attribute_value_ids
+
@http.route(['/shop',
'/shop/page/<int:page>',
'/shop/category/<model("product.public.category"):category>',
if category:
domain += [('product_variant_ids.public_categ_ids', 'child_of', int(category))]
- attrib_values = [map(int,v.split(",")) for v in request.httprequest.args.getlist('attrib') if v]
+ attrib_list = request.httprequest.args.getlist('attrib')
+ attrib_values = [map(int,v.split("-")) for v in attrib_list if v]
+ attrib_set = set([v[1] for v in attrib_values])
+
if attrib_values:
attrib = None
ids = []
if attrib:
domain += [('attribute_line_ids.value_ids', 'in', ids)]
- attrib_set = set([v[1] for v in attrib_values])
- keep = QueryURL('/shop', category=category and int(category), search=search, attrib=attrib_set)
+ keep = QueryURL('/shop', category=category and int(category), search=search, attrib=attrib_list)
if not context.get('pricelist'):
- context['pricelist'] = int(self.get_pricelist())
+ pricelist = self.get_pricelist()
+ context['pricelist'] = int(pricelist)
+ else:
+ pricelist = pool.get('product.pricelist').browse(cr, uid, context['pricelist'], context)
+
product_obj = pool.get('product.template')
url = "/shop"
categs = filter(lambda x: not x.parent_id, categories)
attributes_obj = request.registry['product.attribute']
- attributes_ids = attributes_obj.search(cr, uid, [], context=request.context)
- attributes = attributes_obj.browse(cr, uid, attributes_ids, context=request.context)
+ attributes_ids = attributes_obj.search(cr, uid, [], context=context)
+ attributes = attributes_obj.browse(cr, uid, attributes_ids, context=context)
+
+ from_currency = pool.get('product.price.type')._get_field_currency(cr, uid, 'list_price', context)
+ to_currency = pricelist.currency_id
+ compute_currency = lambda price: pool['res.currency']._compute(cr, uid, from_currency, to_currency, price, context=context)
values = {
'search': search,
'attrib_values': attrib_values,
'attrib_set': attrib_set,
'pager': pager,
- 'pricelist': self.get_pricelist(),
+ 'pricelist': pricelist,
'products': products,
'bins': table_compute().process(products),
'rows': PPR,
'styles': styles,
'categories': categs,
'attributes': attributes,
+ 'compute_currency': compute_currency,
'keep': keep,
'style_in_product': lambda style, product: style.id in [s.id for s in product.website_style_ids],
'attrib_encode': lambda attribs: werkzeug.url_encode([('attrib',i) for i in attribs]),
}
-
return request.website.render("website_sale.products", values)
@http.route(['/shop/product/<model("product.template"):product>'], type='http', auth="public", website=True)
def product(self, product, category='', search='', **kwargs):
cr, uid, context, pool = request.cr, request.uid, request.context, request.registry
category_obj = pool['product.public.category']
+ template_obj = pool['product.template']
context.update(active_id=product.id)
if category:
- category = category_obj.browse(request.cr, request.uid, int(category), context=request.context)
+ category = category_obj.browse(cr, uid, int(category), context=context)
- attrib_values = [map(int,v.split(",")) for v in request.httprequest.args.getlist('attrib') if v]
+ attrib_list = request.httprequest.args.getlist('attrib')
+ attrib_values = [map(int,v.split("-")) for v in attrib_list if v]
attrib_set = set([v[1] for v in attrib_values])
- keep = QueryURL('/shop', category=category and category.id, search=search, attrib=attrib_set)
+ keep = QueryURL('/shop', category=category and category.id, search=search, attrib=attrib_list)
category_ids = category_obj.search(cr, uid, [], context=context)
category_list = category_obj.name_get(cr, uid, category_ids, context=context)
category_list = sorted(category_list, key=lambda category: category[1])
+ pricelist = self.get_pricelist()
+
+ from_currency = pool.get('product.price.type')._get_field_currency(cr, uid, 'list_price', context)
+ to_currency = pricelist.currency_id
+ compute_currency = lambda price: pool['res.currency']._compute(cr, uid, from_currency, to_currency, price, context=context)
+
if not context.get('pricelist'):
context['pricelist'] = int(self.get_pricelist())
- product = request.registry.get('product.template').browse(request.cr, request.uid, int(product), context=context)
-
- variants = [[p.id, map(int, p.attribute_value_ids), p.price] for p in product.product_variant_ids]
+ product = template_obj.browse(cr, uid, int(product), context=context)
values = {
'search': search,
'category': category,
- 'pricelist': self.get_pricelist(),
+ 'pricelist': pricelist,
'attrib_values': attrib_values,
+ 'compute_currency': compute_currency,
'attrib_set': attrib_set,
'keep': keep,
'category_list': category_list,
'main_object': product,
'product': product,
- 'variants': variants,
+ 'get_attribute_value_ids': self.get_attribute_value_ids
}
return request.website.render("website_sale.product", values)
@http.route(['/shop/cart'], type='http', auth="public", website=True)
def cart(self, **post):
+ cr, uid, context, pool = request.cr, request.uid, request.context, request.registry
order = request.website.sale_get_order()
+ if order:
+ from_currency = pool.get('product.price.type')._get_field_currency(cr, uid, 'list_price', context)
+ to_currency = order.pricelist_id.currency_id
+ compute_currency = lambda price: pool['res.currency']._compute(cr, uid, from_currency, to_currency, price, context=context)
+ else:
+ compute_currency = lambda price: price
+
values = {
'order': order,
+ 'compute_currency': compute_currency,
'suggested_products': [],
}
if order:
- if not request.context.get('pricelist'):
- request.context['pricelist'] = order.pricelist_id.id
- values['suggested_products'] = order._cart_accessories(context=request.context)
+ _order = order
+ if not context.get('pricelist'):
+ _order = order.with_context(pricelist=order.pricelist_id.id)
+ values['suggested_products'] = _order._cart_accessories()
+
return request.website.render("website_sale.cart", values)
@http.route(['/shop/cart/update'], type='http', auth="public", methods=['POST'], website=True)
def cart_update(self, product_id, add_qty=1, set_qty=0, **kw):
cr, uid, context = request.cr, request.uid, request.context
- request.website.sale_get_order(force_create=1)._cart_update(product_id=int(product_id), add_qty=add_qty, set_qty=set_qty)
+ request.website.sale_get_order(force_create=1)._cart_update(product_id=int(product_id), add_qty=float(add_qty), set_qty=float(set_qty))
return request.redirect("/shop/cart")
@http.route(['/shop/cart/update_json'], type='json', auth="public", methods=['POST'], website=True)
- def cart_update_json(self, product_id, line_id, add_qty=None, set_qty=None):
+ def cart_update_json(self, product_id, line_id, add_qty=None, set_qty=None, display=True):
order = request.website.sale_get_order(force_create=1)
- quantity = order._cart_update(product_id=product_id, line_id=line_id, add_qty=add_qty, set_qty=set_qty)
- return {
- 'quantity': quantity,
- 'cart_quantity': order.cart_quantity,
- 'website_sale.total': request.website._render("website_sale.total", {
- 'website_sale_order': request.website.sale_get_order()
- })
- }
+ value = order._cart_update(product_id=product_id, line_id=line_id, add_qty=add_qty, set_qty=set_qty)
+ if not display:
+ return None
+ value['cart_quantity'] = order.cart_quantity
+ value['website_sale.total'] = request.website._render("website_sale.total", {
+ 'website_sale_order': request.website.sale_get_order()
+ })
+ return value
#------------------------------------------------------
# Checkout
shipping_ids = []
checkout = {}
if not data:
+ print request.uid, request.website.user_id.id
if request.uid != request.website.user_id.id:
checkout.update( self.checkout_parse("billing", partner) )
shipping_ids = orm_partner.search(cr, SUPERUSER_ID, [("parent_id", "=", partner.id), ('type', "=", 'delivery')], context=context)
else:
order = request.website.sale_get_order(force_create=1, context=context)
if order.partner_id:
- domain = [("active", "=", False), ("partner_id", "=", order.partner_id.id)]
- user_ids = request.registry['res.users'].search(cr, SUPERUSER_ID, domain, context=context)
+ domain = [("partner_id", "=", order.partner_id.id)]
+ user_ids = request.registry['res.users'].search(cr, SUPERUSER_ID, domain, context=dict(context or {}, active_test=False))
if not user_ids or request.website.user_id.id not in user_ids:
checkout.update( self.checkout_parse("billing", order.partner_id) )
else:
checkout['shipping_id'] = shipping_id
+ # Default search by user country
+ country_code = request.session['geoip'].get('country_code')
+ if country_code:
+ country_ids = request.registry.get('res.country').search(cr, uid, [('code', '=', country_code)], context=context)
+ if country_ids:
+ checkout['country_id'] = country_ids[0]
+
values = {
'countries': countries,
'states': states,
'shipping_id': partner.id != shipping_id and shipping_id or 0,
'shippings': shippings,
'error': {},
+ 'has_check_vat': hasattr(registry['res.partner'], 'check_vat')
}
return values
if partner_id and request.website.partner_id.id != partner_id:
orm_partner.write(cr, SUPERUSER_ID, [partner_id], billing_info, context=context)
else:
+ # create partner
partner_id = orm_partner.create(cr, SUPERUSER_ID, billing_info, context=context)
# create a new shipping partner
'message_follower_ids': [(4, partner_id)],
'partner_invoice_id': partner_id,
}
- order_info.update(registry.get('sale.order').onchange_partner_id(cr, SUPERUSER_ID, [], partner_id, context=context)['value'])
+ order_info.update(order_obj.onchange_partner_id(cr, SUPERUSER_ID, [], partner_id, context=context)['value'])
+ order_info.update(order_obj.onchange_delivery_id(cr, SUPERUSER_ID, [], order.company_id.id, partner_id, checkout.get('shipping_id'), None, context=context)['value'])
+
order_info.pop('user_id')
order_info.update(partner_shipping_id=checkout.get('shipping_id') or partner_id)
@http.route(['/shop/checkout'], type='http', auth="public", website=True)
def checkout(self, **post):
- cr, uid, context, registry = request.cr, request.uid, request.context, request.registry
+ cr, uid, context = request.cr, request.uid, request.context
order = request.website.sale_get_order(force_create=1, context=context)
request.session['sale_last_order_id'] = order.id
+ request.website.sale_get_order(update_pricelist=True, context=context)
+
return request.redirect("/shop/payment")
#------------------------------------------------------
# acquirer_ids = [tx.acquirer_id.id]
# else:
acquirer_ids = payment_obj.search(cr, SUPERUSER_ID, [('website_published', '=', True)], context=context)
- values['acquirers'] = payment_obj.browse(cr, uid, acquirer_ids, context=context)
- render_ctx = dict(context, submit_class='btn btn-primary', submit_txt='Pay Now')
+ values['acquirers'] = list(payment_obj.browse(cr, uid, acquirer_ids, context=context))
+ render_ctx = dict(context, submit_class='btn btn-primary', submit_txt=_('Pay Now'))
for acquirer in values['acquirers']:
acquirer.button = payment_obj.render(
cr, SUPERUSER_ID, acquirer.id,