diff options
| author | IT Fixcomart <it@fixcomart.co.id> | 2022-09-27 14:41:16 +0700 |
|---|---|---|
| committer | IT Fixcomart <it@fixcomart.co.id> | 2022-09-27 14:41:16 +0700 |
| commit | 469dd515bacbd4f76265860a9d7c8c745cb5bcf0 (patch) | |
| tree | e0e086990d2d2afeb87356af2ff81a518395f716 /indoteknik_custom/controllers | |
| parent | d057901e1b30dc24978ec345e4daec1d16abf117 (diff) | |
fix rest api response, image api, search product api
Diffstat (limited to 'indoteknik_custom/controllers')
| -rw-r--r-- | indoteknik_custom/controllers/api/product.py | 96 | ||||
| -rw-r--r-- | indoteknik_custom/controllers/api/sale_order.py | 195 | ||||
| -rw-r--r-- | indoteknik_custom/controllers/api_controller.py | 29 |
3 files changed, 199 insertions, 121 deletions
diff --git a/indoteknik_custom/controllers/api/product.py b/indoteknik_custom/controllers/api/product.py index 5c5a6c1a..0cd02e90 100644 --- a/indoteknik_custom/controllers/api/product.py +++ b/indoteknik_custom/controllers/api/product.py @@ -1,27 +1,95 @@ +import base64 + from .. import api_controller from odoo import http from odoo.http import request -import json class ProductApi(api_controller.ApiController): @http.route('/api/product/search', auth='public', methods=['GET']) def search_product(self, **kw): self.authenticate(kw) - limit = kw.get('limit', 0) - offset = kw.get('offset', 0) - order = kw.get('order', '') - domain = kw.get('domain', []) - if domain: - domain = json.loads(domain) + query = kw.get('query') + if not query: + return self.response(code=400, description='Field query is required') + + query = '%' + query.replace(' ', '%') + '%' + domain = [ + ('sale_ok', '=', True), + '|', + ('default_code', 'ilike', query), + ('name', 'ilike', query) + ] + + manufactures = kw.get('manufactures') + if manufactures: + manufactures = [int(x) for x in manufactures.split(',')] + domain.append(('x_manufacture', 'in', manufactures)) + + categories = kw.get('categories') + if categories: + categories = [int(x) for x in categories.split(',')] + domain.append(('public_categ_ids', 'child_of', categories)) product_variants = request.env['product.product'].search(domain) product_variant_ids = [v['id'] for v in product_variants] - domain = [('product_variant_ids', 'in', product_variant_ids)] - products = request.env['product.template'].search(domain, limit=int(limit), offset=int(offset), order=order) - response = [] - for product in products: - response.append({ - 'name': product.name + + base_url = request.env['ir.config_parameter'].sudo().get_param('web.base.url') + domain = [ + ('product_variant_ids', 'in', product_variant_ids) + ] + product_templates = self.search_with_api_params('product.template', kw, domain) + data = { + 'total_records': len(request.env['product.template'].search(domain)), + 'products': [] + } + for product_template in product_templates: + stock = 0 + for product_variant in product_template.product_variant_ids: + stock += product_variant.qty_stock_vendor + + discount_price = 0 + price = product_template.web_price + if price > 0: + if product_template.taxes_id: + if not product_template.taxes_id.price_include: + price += (price * product_template.taxes_id.amount / 100) + else: + price += (price * 11 / 100) + + promotion = {} + manufacture = {} + if product_template.x_manufacture: + manufacture.update({ + 'id': product_template.x_manufacture.id, + 'name': product_template.x_manufacture.x_name, + }) + domain = [ + ('rule_products_domain', 'ilike', product_template.x_manufacture.x_name), + ('active', '=', True) + ] + coupon_program = request.env['coupon.program'].search(domain, limit=1) + if coupon_program: + discount_price = price - (price * coupon_program.discount_percentage / 100) + icon_1 = (base_url + 'api/image/coupon.program/x_studio_field_Ifopn/' + str(coupon_program.id)) if coupon_program.x_studio_field_Ifopn else '' + icon_2 = (base_url + 'api/image/coupon.program/x_studio_field_2Ul77/' + str(coupon_program.id)) if coupon_program.x_studio_field_2Ul77 else '' + promotion.update({ + 'name': coupon_program.name, + 'discount_percentage': coupon_program.discount_percentage, + 'icon_1': icon_1, + 'icon_2': icon_2 + }) + + data['products'].append({ + 'id': product_template.id, + 'image': base_url + 'api/image/product.template/image_128/' + str(product_template.id), + 'name': product_template.name, + 'price': price, + 'discount_price': discount_price, + 'total_variant': len(product_template.product_variant_ids), + 'stock': stock, + 'manufacture': manufacture, + 'promotion': promotion, }) - return json.dumps(response) + + return self.response(data) diff --git a/indoteknik_custom/controllers/api/sale_order.py b/indoteknik_custom/controllers/api/sale_order.py index 4194bcb6..c00a94d3 100644 --- a/indoteknik_custom/controllers/api/sale_order.py +++ b/indoteknik_custom/controllers/api/sale_order.py @@ -1,119 +1,110 @@ from .. import api_controller from odoo import http from odoo.http import request -import json class SaleOrderApi(api_controller.ApiController): @http.route('/api/sale_order/invoiced', auth='public', methods=['GET']) - def get_sale_order_invoiced_by_partner_id(self, partner_id=None, **kw): + def get_sale_order_invoiced_by_partner_id(self, **kw): self.authenticate(kw) - response = [] - if partner_id: - # Get company member by partner_id - parent_partner_id = request.env['res.partner'].search([('id', '=', int(partner_id))], limit=1).parent_id.id - partner_childs = request.env['res.partner'].search([('parent_id', '=', int(parent_partner_id))]) - partner_child_ids = [v['id'] for v in partner_childs] + [int(partner_id)] + partner_id = kw.get('partner_id') + if not partner_id: + return self.response(code=400, description='Field partner_id is required') - # Get sale order by company member and invoiced - default_domain = [ - ('partner_id', 'in', partner_child_ids), - '|', - ('invoice_status', '=', 'invoiced'), - ('invoice_status', '=', 'to_invoice') - ] - sale_orders = self.search_with_api_params('sale.order', kw, default_domain) - for sale_order in sale_orders: - pickings = [] - for picking in sale_order.picking_ids: - if picking.state in ['confirmed', 'assigned', 'done']: - pickings.append({ - 'id': picking.id, - 'name': picking.name, - 'delivery_address': picking.partner_id.street, - 'delivery_tracking_no': picking.delivery_tracking_no, - 'delivery_status': picking.delivery_status - }) + partner_id = int(partner_id) + # Get company member by partner_id + parent_partner_id = request.env['res.partner'].search([('id', '=', partner_id)], limit=1).parent_id.id + partner_childs = request.env['res.partner'].search([('parent_id', '=', int(parent_partner_id))]) + partner_child_ids = [v['id'] for v in partner_childs] + [partner_id] - response.append({ - 'id': sale_order.id, - 'name': sale_order.name, - 'amount_total': sale_order.amount_total, - 'salesperson': sale_order.user_id.name, - 'date_order': self.time_to_str(sale_order.date_order, '%d/%m/%Y'), - 'pickings': pickings, - 'access_token': sale_order.access_token - }) - return json.dumps(response) + # Get sale order by company member and invoiced + data = [] + default_domain = [ + ('partner_id', 'in', partner_child_ids), + '|', + ('invoice_status', '=', 'invoiced'), + ('invoice_status', '=', 'to_invoice') + ] + sale_orders = self.search_with_api_params('sale.order', kw, default_domain) + for sale_order in sale_orders: + pickings = [] + for picking in sale_order.picking_ids: + if picking.state in ['confirmed', 'assigned', 'done']: + pickings.append({ + 'id': picking.id, + 'name': picking.name, + 'delivery_address': picking.partner_id.street, + 'delivery_tracking_no': picking.delivery_tracking_no, + 'delivery_status': picking.delivery_status + }) - # @http.route('/api/test', auth='public', methods=['GET']) - # def test(self, **kw): - # self.authenticate(kw) - # response = [] - # products = self.search_with_api_params('product.template', kw) - # for product in products: - # response.append({ - # 'id': product.id, - # 'name': product.name - # }) - # return json.dumps(response) + data.append({ + 'id': sale_order.id, + 'name': sale_order.name, + 'amount_total': sale_order.amount_total, + 'salesperson': sale_order.user_id.name, + 'date_order': self.time_to_str(sale_order.date_order, '%d/%m/%Y'), + 'pickings': pickings, + 'access_token': sale_order.access_token + }) + return self.response(data) @http.route('/api/sale_order/invoiced/detail', auth='public', methods=['GET']) - def get_sale_order_invoiced_detail(self, id=None, partner_id=None, **kw): + def get_sale_order_invoiced_detail_by_partner(self, **kw): self.authenticate(kw) - response = {} - if id: - default_domain = [ - ('id', '=', id), - '|', - ('invoice_status', '=', 'invoiced'), - ('invoice_status', '=', 'to_invoice') - ] - if partner_id: - # Get company member by partner_id - parent_partner_id = request.env['res.partner'].search([('id', '=', int(partner_id))], limit=1).parent_id.id - partner_childs = request.env['res.partner'].search([('parent_id', '=', int(parent_partner_id))]) - partner_child_ids = [v['id'] for v in partner_childs] + [int(partner_id)] - default_domain.append(('partner_id', 'in', partner_child_ids)) - sale_order = self.search_with_api_params('sale.order', kw, default_domain) - if sale_order: - orders = [] - for order in sale_order.order_line: - orders.append({ - 'name': order.name, - 'product_qty': order.product_qty, - 'price_unit': order.price_unit, - 'price_tax': order.price_tax, - 'price_total': order.price_total, - 'price_subtotal': order.price_subtotal, - 'tax': order.tax_id.name, - 'discount': order.discount, - }) + id = kw.get('id') + partner_id = kw.get('partner_id') + if not id: + return self.response(code=400, description='Field id is required') + if not partner_id: + return self.response(code=400, description='Field partner_id is required') + + default_domain = [ + ('id', '=', id), + '|', + ('invoice_status', '=', 'invoiced'), + ('invoice_status', '=', 'to_invoice') + ] + parent_partner_id = request.env['res.partner'].search([('id', '=', int(partner_id))], limit=1).parent_id.id + partner_childs = request.env['res.partner'].search([('parent_id', '=', int(parent_partner_id))]) + partner_child_ids = [v['id'] for v in partner_childs] + [int(partner_id)] + default_domain.append(('partner_id', 'in', partner_child_ids)) + + sale_order = self.search_with_api_params('sale.order', kw, default_domain) + orders = [] + for order in sale_order.order_line: + orders.append({ + 'name': order.name, + 'product_qty': order.product_qty, + 'price_unit': order.price_unit, + 'price_tax': order.price_tax, + 'price_total': order.price_total, + 'price_subtotal': order.price_subtotal, + 'tax': order.tax_id.name, + 'discount': order.discount, + }) - response.update({ - 'id': sale_order.id, - 'name': sale_order.name, - 'carrier': sale_order.carrier_id.name, - 'partner': { - 'id': sale_order.partner_id.id, - 'name': sale_order.partner_id.name, - 'mobile': sale_order.partner_id.mobile, - 'email': sale_order.partner_id.email - }, - 'delivery_address': sale_order.partner_shipping_id.street, - 'delivery_method': sale_order.carrier_id.name, - 'payment_term': sale_order.payment_term_id.name, - 'salesperson': sale_order.user_id.name, - 'date_order': self.time_to_str(sale_order.date_order, '%d/%m/%Y %H:%M:%S'), - 'note': sale_order.note, - 'amount_untaxed': sale_order.amount_untaxed, - 'amount_tax': sale_order.amount_tax, - 'amount_total': sale_order.amount_total, - 'orders': orders - }) - return json.dumps(response) + data = { + 'id': sale_order.id, + 'name': sale_order.name, + 'carrier': sale_order.carrier_id.name, + 'partner': { + 'id': sale_order.partner_id.id, + 'name': sale_order.partner_id.name, + 'mobile': sale_order.partner_id.mobile, + 'email': sale_order.partner_id.email + }, + 'delivery_address': sale_order.partner_shipping_id.street, + 'delivery_method': sale_order.carrier_id.name, + 'payment_term': sale_order.payment_term_id.name, + 'salesperson': sale_order.user_id.name, + 'date_order': self.time_to_str(sale_order.date_order, '%d/%m/%Y %H:%M:%S'), + 'note': sale_order.note, + 'amount_untaxed': sale_order.amount_untaxed, + 'amount_tax': sale_order.amount_tax, + 'amount_total': sale_order.amount_total, + 'orders': orders + } - @http.route('/api/sale_order', auth='public', methods=['POST'], csrf=False) - def post_sale_order(self, **kw): - return json.dumps(['a']) + return self.response(data) diff --git a/indoteknik_custom/controllers/api_controller.py b/indoteknik_custom/controllers/api_controller.py index cb5fae60..faf8b640 100644 --- a/indoteknik_custom/controllers/api_controller.py +++ b/indoteknik_custom/controllers/api_controller.py @@ -1,4 +1,5 @@ import datetime +import base64 from odoo import http from odoo.http import request @@ -19,14 +20,32 @@ class ApiController(http.Controller): time = object.astimezone(timezone('Asia/Jakarta')).strftime(format) return time + def response(self, data=[], code=200, description='OK'): + response = { + 'status': { + 'code': code, + 'description': description + } + } + if code == 200: + response.update({'result': data}) - def search_with_api_params(self, model: str, kw, default_domain=[]): + response = json.dumps(response) + return request.make_response(response, [('Content-Type', 'application/json')]) + + def search_with_api_params(self, model: str, kw, domain=[]): limit = kw.get('limit', 0) offset = kw.get('offset', 0) order = kw.get('order', '') - domain = kw.get('domain', []) - if domain: - domain = json.loads(domain) - domain += default_domain + # domain = kw.get('domain', []) + # if domain: + # domain = json.loads(domain) + # domain += default_domain return request.env[model].search(domain, limit=int(limit), offset=int(offset), order=order) + + @http.route('/api/image/<model>/<field>/<id>', auth='public', methods=['GET']) + def get_image(self, model, field, id): + model = request.env[model].sudo().search([('id', '=', id)], limit=1) + image = model[field] if model[field] else '' + return request.make_response(base64.b64decode(image), [('Content-Type', 'image/jpg')]) |
