From a7661f21bcd3d14b198494120d333cd1afbb99fb Mon Sep 17 00:00:00 2001 From: Danial Sheikhani Date: Fri, 9 Sep 2022 13:12:06 +0000 Subject: [PATCH] [IMP] website_sale_stock_renting: rental - search bar This commit adds the necessary hooks to add a rental search bar snippet. See odoo/enterprise#29909 TaskId-2833724 closes odoo/odoo#96995 Signed-off-by: William Braeckman (wbr) Co-authored-by: Alexandre De Pape Co-authored-by: William Braeckman --- addons/website/views/snippets/snippets.xml | 1 + addons/website_sale/controllers/main.py | 196 ++++++++++-------- .../website_sale/views/snippets/snippets.xml | 2 +- 3 files changed, 113 insertions(+), 86 deletions(-) diff --git a/addons/website/views/snippets/snippets.xml b/addons/website/views/snippets/snippets.xml index e7c68f7b624..936495b1b7b 100644 --- a/addons/website/views/snippets/snippets.xml +++ b/addons/website/views/snippets/snippets.xml @@ -160,6 +160,7 @@ + diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 1f94c6a5191..91908bc5dc1 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -233,87 +233,13 @@ class WebsiteSale(http.Controller): 'display_currency': pricelist.currency_id, } - @http.route([ - '/shop', - '/shop/page/', - '/shop/category/', - '/shop/category//page/', - ], type='http', auth="public", website=True, sitemap=sitemap_shop) - def shop(self, page=0, category=None, search='', min_price=0.0, max_price=0.0, ppg=False, **post): - add_qty = int(post.get('add_qty', 1)) - try: - min_price = float(min_price) - except ValueError: - min_price = 0 - try: - max_price = float(max_price) - except ValueError: - max_price = 0 - - Category = request.env['product.public.category'] - if category: - category = Category.search([('id', '=', int(category))], limit=1) - if not category or not category.can_access_from_current_website(): - raise NotFound() - else: - category = Category - - website = request.env['website'].get_current_website() - if ppg: - try: - ppg = int(ppg) - post['ppg'] = ppg - except ValueError: - ppg = False - if not ppg: - ppg = website.shop_ppg or 20 - - ppr = website.shop_ppr or 4 - - attrib_list = request.httprequest.args.getlist('attrib') - attrib_values = [[int(x) for x in v.split("-")] for v in attrib_list if v] - attributes_ids = {v[0] for v in attrib_values} - attrib_set = {v[1] for v in attrib_values} - - keep = QueryURL('/shop', category=category and int(category), search=search, attrib=attrib_list, min_price=min_price, max_price=max_price, order=post.get('order')) - - now = datetime.timestamp(datetime.now()) - pricelist = request.env['product.pricelist'].browse(request.session.get('website_sale_current_pl')) - if not pricelist or request.session.get('website_sale_pricelist_time', 0) < now - 60*60: # test: 1 hour in session - pricelist = website.get_current_pricelist() - request.session['website_sale_pricelist_time'] = now - request.session['website_sale_current_pl'] = pricelist.id - - request.update_context(pricelist=pricelist.id, partner=request.env.user.partner_id) - - filter_by_price_enabled = website.is_view_active('website_sale.filter_products_price') - if filter_by_price_enabled: - company_currency = website.company_id.currency_id - conversion_rate = request.env['res.currency']._get_conversion_rate( - company_currency, pricelist.currency_id, request.website.company_id, fields.Date.today()) - else: - conversion_rate = 1 - - url = "/shop" - if search: - post["search"] = search - if attrib_list: - post['attrib'] = attrib_list - - options = self._get_search_options( - category=category, - attrib_values=attrib_values, - pricelist=pricelist, - min_price=min_price, - max_price=max_price, - conversion_rate=conversion_rate, - **post - ) + def _shop_lookup_products(self, attrib_set, options, post, search, website): # No limit because attributes are obtained from complete product list product_count, details, fuzzy_search_term = website._search_with_fuzzy("products_only", search, - limit=None, order=self._get_search_order(post), options=options) - search_product = details[0].get('results', request.env['product.template']).with_context(bin_size=True) - + limit=None, + order=self._get_search_order(post), + options=options) + search_result = details[0].get('results', request.env['product.template']).with_context(bin_size=True) if attrib_set: # Attributes value per attribute attribute_values = request.env['product.attribute.value'].browse(attrib_set) @@ -359,7 +285,96 @@ class WebsiteSale(http.Controller): possible_attrib_values_list = [request.env['product.attribute.value'].browse([v.id for v in values]) for values in cartesian_product(*values_per_attribute.values())] - search_product = search_product.filtered(lambda tmpl: filter_template(tmpl, possible_attrib_values_list)) + search_result = search_result.filtered(lambda tmpl: filter_template(tmpl, possible_attrib_values_list)) + return fuzzy_search_term, product_count, search_result + + def _shop_get_query_url_kwargs(self, category, search, min_price, max_price, attrib=None, order=None, **post): + return { + 'category': category, + 'search': search, + 'attrib': attrib, + 'min_price': min_price, + 'max_price': max_price, + 'order': order, + } + + @http.route([ + '/shop', + '/shop/page/', + '/shop/category/', + '/shop/category//page/', + ], type='http', auth="public", website=True, sitemap=sitemap_shop) + def shop(self, page=0, category=None, search='', min_price=0.0, max_price=0.0, ppg=False, **post): + add_qty = int(post.get('add_qty', 1)) + try: + min_price = float(min_price) + except ValueError: + min_price = 0 + try: + max_price = float(max_price) + except ValueError: + max_price = 0 + + Category = request.env['product.public.category'] + if category: + category = Category.search([('id', '=', int(category))], limit=1) + if not category or not category.can_access_from_current_website(): + raise NotFound() + else: + category = Category + + website = request.env['website'].get_current_website() + if ppg: + try: + ppg = int(ppg) + post['ppg'] = ppg + except ValueError: + ppg = False + if not ppg: + ppg = website.shop_ppg or 20 + + ppr = website.shop_ppr or 4 + + attrib_list = request.httprequest.args.getlist('attrib') + attrib_values = [[int(x) for x in v.split("-")] for v in attrib_list if v] + attributes_ids = {v[0] for v in attrib_values} + attrib_set = {v[1] for v in attrib_values} + + keep = QueryURL('/shop', **self._shop_get_query_url_kwargs(category and int(category), search, min_price, max_price, **post)) + + now = datetime.timestamp(datetime.now()) + pricelist = request.env['product.pricelist'].browse(request.session.get('website_sale_current_pl')) + if not pricelist or request.session.get('website_sale_pricelist_time', 0) < now - 60*60: # test: 1 hour in session + pricelist = website.get_current_pricelist() + request.session['website_sale_pricelist_time'] = now + request.session['website_sale_current_pl'] = pricelist.id + + request.update_context(pricelist=pricelist.id, partner=request.env.user.partner_id) + + filter_by_price_enabled = website.is_view_active('website_sale.filter_products_price') + if filter_by_price_enabled: + company_currency = website.company_id.currency_id + conversion_rate = request.env['res.currency']._get_conversion_rate( + company_currency, pricelist.currency_id, request.website.company_id, fields.Date.today()) + else: + conversion_rate = 1 + + url = "/shop" + if search: + post["search"] = search + if attrib_list: + post['attrib'] = attrib_list + + options = self._get_search_options( + category=category, + attrib_values=attrib_values, + pricelist=pricelist, + min_price=min_price, + max_price=max_price, + conversion_rate=conversion_rate, + **post + ) + fuzzy_search_term, product_count, search_product = self._shop_lookup_products(attrib_set, options, post, search, website) filter_by_price_enabled = website.is_view_active('website_sale.filter_products_price') if filter_by_price_enabled: @@ -614,6 +629,15 @@ class WebsiteSale(http.Controller): product = request.env['product.product'].browse(product_id) return product._is_add_to_cart_allowed() + def _product_get_query_url_kwargs(self, category, search, min_price, max_price, attrib=None, **kwargs): + return { + 'category': category, + 'search': search, + 'attrib': attrib, + 'min_price': min_price, + 'max_price': max_price, + } + def _prepare_product_values(self, product, category, search, **kwargs): ProductCategory = request.env['product.public.category'] @@ -626,11 +650,13 @@ class WebsiteSale(http.Controller): keep = QueryURL( '/shop', - category=category and category.id, - search=search, - attrib=attrib_list, - min_price=request.params.get('min_price'), - max_price=request.params.get('max_price'), + **self._product_get_query_url_kwargs( + category=category and category.id, + search=search, + min_price=request.params.get('min_price'), + max_price=request.params.get('max_price'), + **kwargs, + ), ) # Needed to trigger the recently viewed product rpc diff --git a/addons/website_sale/views/snippets/snippets.xml b/addons/website_sale/views/snippets/snippets.xml index 808b48ad464..8ba302ac132 100644 --- a/addons/website_sale/views/snippets/snippets.xml +++ b/addons/website_sale/views/snippets/snippets.xml @@ -80,7 +80,7 @@ data-customize-website-views="website_sale.products_description" data-no-preview="true" data-reload="/"/> - +