You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							269 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							269 lines
						
					
					
						
							11 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
							 | 
						|
								#
							 | 
						|
								#    You can modify it under the terms of the GNU LESSER
							 | 
						|
								#    GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
							 | 
						|
								#
							 | 
						|
								#    This program is distributed in the hope that it will be useful,
							 | 
						|
								#    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						|
								#    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
							 | 
						|
								#    (LGPL v3) along with this program.
							 | 
						|
								#    If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								#############################################################################
							 | 
						|
								import datetime
							 | 
						|
								
							 | 
						|
								from werkzeug.exceptions import NotFound
							 | 
						|
								from odoo.addons.http_routing.models.ir_http import slug
							 | 
						|
								from odoo.addons.website.controllers.main import QueryURL
							 | 
						|
								from odoo.addons.website_sale.controllers.main import TableCompute, WebsiteSale
							 | 
						|
								from odoo import http
							 | 
						|
								from odoo.http import request
							 | 
						|
								from odoo import fields
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class WebsiteProduct(http.Controller):
							 | 
						|
								    """Class for dynamic snippets for products"""
							 | 
						|
								
							 | 
						|
								    @http.route('/get_featured_product', auth='public', type='json',
							 | 
						|
								                website=True)
							 | 
						|
								    def get_featured_products(self):
							 | 
						|
								        """Function to get featured products"""
							 | 
						|
								        silon_configuration = request.env.ref(
							 | 
						|
								            'theme_silon.silon_configuration_data')
							 | 
						|
								        product_id = silon_configuration.featured_product_ids
							 | 
						|
								        rating = request.website.viewref('website_sale.product_comment').active
							 | 
						|
								        res = {'products': []}
							 | 
						|
								        for product in product_id:
							 | 
						|
								            combination_info = product._get_combination_info_variant()
							 | 
						|
								            res_product = product.read(['id', 'name', 'website_url',
							 | 
						|
								                                        'rating_avg', 'rating_count'])[0]
							 | 
						|
								            res_product['ratings'] = round(res_product['rating_avg'], 2)
							 | 
						|
								            res_product['rating'] = rating
							 | 
						|
								            res_product.update(combination_info)
							 | 
						|
								            res['products'].append(res_product)
							 | 
						|
								        products = res['products']
							 | 
						|
								        values = {'products': products}
							 | 
						|
								        response = http.Response(
							 | 
						|
								            template='theme_silon.featured_product_snippet', qcontext=values)
							 | 
						|
								        return response.render()
							 | 
						|
								
							 | 
						|
								    @http.route('/get_popular_product', auth='public', type='json',
							 | 
						|
								                website=True)
							 | 
						|
								    def get_popular_products(self):
							 | 
						|
								        """Function to get Popular Products"""
							 | 
						|
								        products = request.env['product.template'].sudo().search([])
							 | 
						|
								        for each in products:
							 | 
						|
								            each.qty_sold = 0
							 | 
						|
								            each.top_selling = False
							 | 
						|
								        date = fields.Datetime.now()
							 | 
						|
								        date_before = date - datetime.timedelta(days=7)
							 | 
						|
								        orders = request.env['sale.order'].sudo().search([
							 | 
						|
								            ('date_order', '<=', date),
							 | 
						|
								            ('date_order', '>=',
							 | 
						|
								             date_before),
							 | 
						|
								            ('website_id', '!=', False),
							 | 
						|
								            ('state', 'in', (
							 | 
						|
								                'sale', 'done'))])
							 | 
						|
								        for order in orders:
							 | 
						|
								            order_line = order.order_line
							 | 
						|
								            for product in order_line:
							 | 
						|
								                product.product_id.qty_sold = product.product_id.qty_sold + 1
							 | 
						|
								        website_product_ids = request.env['product.template'].sudo().search(
							 | 
						|
								            [('is_published', '=', True),
							 | 
						|
								             ('qty_sold', '!=', 0)],
							 | 
						|
								            order='qty_sold desc', limit=4)
							 | 
						|
								
							 | 
						|
								        website_product_ids.top_selling = True
							 | 
						|
								        rating = request.website.viewref('website_sale.product_comment').active
							 | 
						|
								        res = {'products': []}
							 | 
						|
								        for product in website_product_ids:
							 | 
						|
								            combination_info = product._get_combination_info()
							 | 
						|
								            res_product = product.read(['id', 'name', 'website_url',
							 | 
						|
								                                        'rating_avg', 'rating_count'])[0]
							 | 
						|
								            res_product['ratings'] = round(res_product['rating_avg'], 2)
							 | 
						|
								            res_product.update(combination_info)
							 | 
						|
								            res_product['rating'] = rating
							 | 
						|
								            res['products'].append(res_product)
							 | 
						|
								        products = res['products']
							 | 
						|
								        values = {'website_product_ids': products}
							 | 
						|
								        response = http.Response(
							 | 
						|
								            template='theme_silon.popular_snippet', qcontext=values)
							 | 
						|
								        return response.render()
							 | 
						|
								
							 | 
						|
								    @http.route('/get_trending_product', auth='public', type='json',
							 | 
						|
								                website=True)
							 | 
						|
								    def get_trending_product(self):
							 | 
						|
								        """Function to get Trending Products"""
							 | 
						|
								        products = request.env['product.template'].sudo().search([])
							 | 
						|
								        for each in products:
							 | 
						|
								            each.views = 0
							 | 
						|
								            each.most_viewed = False
							 | 
						|
								        date = fields.Datetime.now()
							 | 
						|
								        date_before = date - datetime.timedelta(days=7)
							 | 
						|
								        products = request.env['website.track'].sudo().search(
							 | 
						|
								            [('visit_datetime', '<=', date),
							 | 
						|
								             ('visit_datetime', '>=', date_before),
							 | 
						|
								             ('product_id', '!=', False)])
							 | 
						|
								        for pro in products:
							 | 
						|
								            pro.product_id.views = pro.product_id.views + 1
							 | 
						|
								
							 | 
						|
								        product_ids = request.env['product.template'].sudo().search(
							 | 
						|
								            [('is_published', '=', True),
							 | 
						|
								             ('views', '!=', 0)],
							 | 
						|
								            order='views desc', limit=8)
							 | 
						|
								
							 | 
						|
								        product_ids.most_viewed = True
							 | 
						|
								        rating = request.website.viewref('website_sale.product_comment').active
							 | 
						|
								        res = {'products': []}
							 | 
						|
								        for product in product_ids:
							 | 
						|
								            combination_info = product._get_combination_info()
							 | 
						|
								            res_product = product.read(['id', 'name', 'website_url',
							 | 
						|
								                                        'rating_avg', 'rating_count'])[0]
							 | 
						|
								            res_product['ratings'] = round(res_product['rating_avg'], 2)
							 | 
						|
								            res_product.update(combination_info)
							 | 
						|
								            res_product['rating'] = rating
							 | 
						|
								            res['products'].append(res_product)
							 | 
						|
								        products = res['products']
							 | 
						|
								        values = {'product_ids': products}
							 | 
						|
								        response = http.Response(
							 | 
						|
								            template='theme_silon.trending_snippet', qcontext=values)
							 | 
						|
								        return response.render()
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class PriceFilter(WebsiteSale):
							 | 
						|
								    """Price filtering Class"""
							 | 
						|
								
							 | 
						|
								    @http.route()
							 | 
						|
								    def shop(self, page=0, category=None, search='', ppg=False, **post):
							 | 
						|
								        """Override WebsiteSale shop for Price Filter"""
							 | 
						|
								        maximum = minimum = 0
							 | 
						|
								        add_qty = int(post.get('add_qty', 1))
							 | 
						|
								        product_category = request.env['product.public.category']
							 | 
						|
								        if category:
							 | 
						|
								            category = product_category.search([('id', '=', int(category))], limit=1)
							 | 
						|
								            if not category or not category.can_access_from_current_website():
							 | 
						|
								                raise NotFound()
							 | 
						|
								        else:
							 | 
						|
								            category = product_category
							 | 
						|
								
							 | 
						|
								        if ppg:
							 | 
						|
								            try:
							 | 
						|
								                ppg = int(ppg)
							 | 
						|
								                post['ppg'] = ppg
							 | 
						|
								            except ValueError:
							 | 
						|
								                ppg = False
							 | 
						|
								        if not ppg:
							 | 
						|
								            ppg = request.env['website'].get_current_website().shop_ppg or 20
							 | 
						|
								
							 | 
						|
								        ppr = request.env['website'].get_current_website().shop_ppr or 4
							 | 
						|
								
							 | 
						|
								        product_ids = request.env['product.template'].search(
							 | 
						|
								            ['&', ('sale_ok', '=', True), ('active', '=', True)])
							 | 
						|
								
							 | 
						|
								        if product_ids and product_ids.ids:
							 | 
						|
								            request.cr.execute(
							 | 
						|
								                'select min(list_price),max(list_price) from product_template where id in %s',
							 | 
						|
								                (tuple(product_ids.ids),))
							 | 
						|
								            list_prices = request.cr.fetchall()
							 | 
						|
								
							 | 
						|
								            minimum = list_prices[0][0]
							 | 
						|
								            maximum = list_prices[0][1]
							 | 
						|
								
							 | 
						|
								        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}
							 | 
						|
								
							 | 
						|
								        domain = self._get_search_domain(search, category, attrib_values)
							 | 
						|
								        if post.get('minimum') and post.get('maximum'):
							 | 
						|
								            domain = domain + [('list_price', '>=', float(post.get('minimum'))),
							 | 
						|
								                               ('list_price', '<=', float(post.get('maximum')))]
							 | 
						|
								
							 | 
						|
								        keep = QueryURL('/shop', category=category and int(category),
							 | 
						|
								                        search=search, attrib=attrib_list,
							 | 
						|
								                        order=post.get('order'), minimum=post.get('minimum'),
							 | 
						|
								                        maximum=post.get('maximum'))
							 | 
						|
								
							 | 
						|
								        pricelist_context, pricelist = self._get_pricelist_context()
							 | 
						|
								
							 | 
						|
								        request.context = dict(
							 | 
						|
								            request.context, pricelist=pricelist.id,
							 | 
						|
								            partner=request.env.user.partner_id)
							 | 
						|
								
							 | 
						|
								        url = "/shop"
							 | 
						|
								        if search:
							 | 
						|
								            post["search"] = search
							 | 
						|
								        if attrib_list:
							 | 
						|
								            post['attrib'] = attrib_list
							 | 
						|
								
							 | 
						|
								        product_template = request.env['product.template'].with_context(bin_size=True)
							 | 
						|
								
							 | 
						|
								        search_product = product_template.search(domain, order=self._get_search_order(post))
							 | 
						|
								        website_domain = request.website.website_domain()
							 | 
						|
								        categs_domain = [('parent_id', '=', False)] + website_domain
							 | 
						|
								        if search:
							 | 
						|
								            search_categories = product_category.search(
							 | 
						|
								                [('product_tmpl_ids', 'in', search_product.ids)] + website_domain).parents_and_self
							 | 
						|
								            categs_domain.append(('id', 'in', search_categories.ids))
							 | 
						|
								        else:
							 | 
						|
								            search_categories = product_category
							 | 
						|
								        categs = product_category.search(categs_domain)
							 | 
						|
								
							 | 
						|
								        if category:
							 | 
						|
								            url = f'{"/shop/category/%s"}' % slug(category)
							 | 
						|
								
							 | 
						|
								        product_count = len(search_product)
							 | 
						|
								        pager = request.website.pager(url=url, total=product_count,
							 | 
						|
								                                      page=page, step=ppg, scope=7,
							 | 
						|
								                                      url_args=post)
							 | 
						|
								        offset = pager['offset']
							 | 
						|
								        products = search_product[offset: offset + ppg]
							 | 
						|
								
							 | 
						|
								        product_attribute = request.env['product.attribute']
							 | 
						|
								        if products:
							 | 
						|
								            # get all products without limit
							 | 
						|
								            attributes = product_attribute.search([('product_tmpl_ids', 'in', search_product.ids)])
							 | 
						|
								        else:
							 | 
						|
								            attributes = product_attribute.browse(attributes_ids)
							 | 
						|
								
							 | 
						|
								        layout_mode = request.session.get('website_sale_shop_layout_mode')
							 | 
						|
								        if not layout_mode:
							 | 
						|
								            if request.website.viewref('website_sale.products_list_view').active:
							 | 
						|
								                layout_mode = 'list'
							 | 
						|
								            else:
							 | 
						|
								                layout_mode = 'grid'
							 | 
						|
								
							 | 
						|
								        values = {
							 | 
						|
								            'search': search,
							 | 
						|
								            'category': category,
							 | 
						|
								            'attrib_values': attrib_values,
							 | 
						|
								            'attrib_set': attrib_set,
							 | 
						|
								            'pager': pager,
							 | 
						|
								            'pricelist': pricelist,
							 | 
						|
								            'add_qty': add_qty,
							 | 
						|
								            'products': products,
							 | 
						|
								            'search_count': product_count,  # common for all searchbox
							 | 
						|
								            'bins': TableCompute().process(products, ppg, ppr),
							 | 
						|
								            'ppg': ppg,
							 | 
						|
								            'ppr': ppr,
							 | 
						|
								            'categories': categs,
							 | 
						|
								            'attributes': attributes,
							 | 
						|
								            'keep': keep,
							 | 
						|
								            'search_categories_ids': search_categories.ids,
							 | 
						|
								            'layout_mode': layout_mode,
							 | 
						|
								            'minimum': minimum,
							 | 
						|
								            'maximum': maximum,
							 | 
						|
								
							 | 
						|
								        }
							 | 
						|
								        if category:
							 | 
						|
								            values['main_object'] = category
							 | 
						|
								        return request.render("website_sale.products", values)
							 | 
						|
								
							 |