from .. import controller from odoo import http from odoo.http import request import ast class Product(controller.Controller): prefix = '/api/v1/' @http.route(prefix + 'product', auth='public', methods=['GET', 'OPTIONS']) def get_product(self, **kw): if not self.authenticate(): return self.response(code=401, description='Unauthorized') name = kw.get('name') manufactures = kw.get('manufactures') categories = kw.get('categories') promotions = kw.get('promotions') ready_stock = kw.get('ready_stock') require_betweens = ['name', 'manufactures', 'categories', 'ready_stock', 'promotions'] is_fulfill = False for required in require_betweens: if kw.get(required): is_fulfill = True if not is_fulfill: return self.response(code=400, description='name or manufactures or categories or ready_stock or promotions is required') query = [('sale_ok', '=', True)] if name: name = '%' + name.replace(' ', '%') + '%' query += [ '|', ('default_code', 'ilike', name), ('name', 'ilike', name), ] if manufactures: query.append(('x_manufacture', 'in', [int(x) for x in manufactures.split(',')])) if categories: query.append(('public_categ_ids', 'child_of', [int(x) for x in categories.split(',')])) if ready_stock == '1': query.append(('virtual_qty', '>', 0)) if promotions: coupon_programs = request.env['coupon.program'].search([('id', 'in', promotions.split(','))]) promotion_query = [x for coupon_program in coupon_programs for x in ast.literal_eval(coupon_program.rule_products_domain)] query += promotion_query price_from = kw.get('price_from') if price_from and int(price_from): query.append(('web_price_sorting', '>=', int(price_from))) price_to = kw.get('price_to') if price_to and int(price_to): query.append(('web_price_sorting', '<=', int(price_to))) product_variants = request.env['product.product'].search(query) product_variant_ids = [x.id for x in product_variants] query = [('product_variant_ids', 'in', product_variant_ids)] limit = int(kw.get('limit', 0)) offset = int(kw.get('offset', 0)) order = self.get_product_default_order(kw.get('order')) product_templates = request.env['product.template'].search(query, limit=limit, offset=offset, order=order) data = { 'product_total': request.env['product.template'].search_count(query), 'products': [request.env['product.template'].api_single_response(x) for x in product_templates] } return self.response(data) @http.route(prefix + 'product/solr', auth='public', methods=['GET']) def get_product_solr(self, **kw): if not self.authenticate(): return self.response(code=401, description='Unauthorized') name = kw.get('name') solr_flag = kw.get('flag') limit = int(kw.get('limit', 0)) offset = int(kw.get('offset', 0)) if not solr_flag: return self.response(code=400, description='flag is required') query = [ ('sale_ok', '=', True), ('solr_flag', '=', int(solr_flag)) ] if name: name = '%' + name.replace(' ', '%') + '%' query += [ '|', ('default_code', 'ilike', name), ('name', 'ilike', name), ] product_templates = request.env['product.template'].search(query, limit=limit, offset=offset) data = { 'product_total': request.env['product.template'].search_count(query), 'products': [request.env['product.template'].api_single_response(x, with_detail='SOLR') for x in product_templates] } return self.response(data) @http.route(prefix + 'product/', auth='public', methods=['GET']) def get_product_by_id(self, **kw): if not self.authenticate(): return self.response(code=401, description='Unauthorized') id = kw.get('id') if not id: return self.response(code=400, description='id is required') data = [] id = [int(x) for x in id.split(',')] product_templates = request.env['product.template'].search([('id', 'in', id)]) if product_templates: data = [request.env['product.template'].api_single_response(x, with_detail='DEFAULT') for x in product_templates] return self.response(data) @http.route(prefix + 'product//similar', auth='public', methods=['GET', 'OPTIONS']) def get_product_similar_by_id(self, **kw): if not self.authenticate(): return self.response(code=401, description='Unauthorized') id = kw.get('id') if not id: return self.response(code=400, description='id is required') id = int(id) product_template = request.env['product.template'].search([('id', '=', id)]) if not product_template: return self.response([]) query = [('id', '!=', id)] if product_template.x_manufacture: query.append(('x_manufacture', '=', product_template.x_manufacture.id)) if product_template.public_categ_ids: query.append(('public_categ_ids', 'in', [x.id for x in product_template.public_categ_ids])) if len(query) == 2: query.insert(0, '|') limit = int(kw.get('limit', 0)) offset = int(kw.get('offset', 0)) order = self.get_product_default_order(kw.get('order')) product_templates = request.env['product.template'].search(query, limit=limit, offset=offset, order=order) data = { 'product_total': request.env['product.template'].search_count(query), 'products': [request.env['product.template'].api_single_response(x) for x in product_templates] } return self.response(data) def get_product_default_order(self, order): orders = ['product_rating desc'] if order != 'price-asc': orders.append('web_price_sorting desc') if order == 'price-asc': orders.append('web_price_sorting asc') elif order == 'latest': orders.append('create_date desc') return ','.join(orders)