from .. import controller from odoo import http from odoo.http import request class Cart(controller.Controller): prefix = '/api/v1/' PREFIX_USER = prefix + 'user//' @http.route(PREFIX_USER + 'cart', auth='public', methods=['GET', 'OPTIONS']) @controller.Controller.must_authorized() def get_cart_by_user_id(self, user_id, **kw): user_cart = request.env['website.user.cart'] user_id = int(user_id) limit = int(kw.get('limit', 0)) offset = int(kw.get('offset', 0)) query = [('user_id', '=', user_id)] carts = user_cart.search(query, limit=limit, offset=offset, order='create_date desc') products = [] products_inactive = [] for cart in carts: try: if cart.product_id: price = cart.product_id._v2_get_website_price_include_tax() if cart.product_id.active and price > 0: product = cart.with_context(price_for="web").get_products() for product_active in product: products.append(product_active) else: product_inactives = cart.with_context(price_for="web").get_products() for inactives in product_inactives: products_inactive.append(inactives) else: program = cart.with_context(price_for="web").get_products() for programs in program: products.append(programs) except Exception as e: continue data = { 'product_total': user_cart.search_count(query), 'products': products, 'products_inactive': products_inactive } return self.response(data) @http.route(PREFIX_USER + 'cart/count', auth='public', methods=['GET', 'OPTIONS']) @controller.Controller.must_authorized() def get_cart_count_by_user_id(self, user_id, **kw): user_id = int(user_id) query = [('user_id', '=', user_id)] carts = request.env['website.user.cart'].search(query) products_active = [] products_inactive = [] for cart in carts: if cart.product_id: price = cart.product_id._v2_get_website_price_include_tax() if cart.product_id.active and price > 0: product = cart.with_context(price_for="web").get_products() for product_active in product: products_active.append(product_active) else: product_inactives = cart.with_context(price_for="web").get_products() for inactives in product_inactives: products_inactive.append(inactives) else: program = cart.with_context(price_for="web").get_products() for programs in program: products_active.append(programs) return self.response(len(products_active)) @http.route(PREFIX_USER + 'cart/create-or-update', auth='public', methods=['POST', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized(private=True, private_key='user_id') def create_or_update_cart(self, user_id, **kw): # Convert input values to appropriate types user_id = int(user_id) product_id = kw.get('product_id', 0) product_id = False if product_id == 'null' or not product_id else int(product_id) program_line_id = kw.get('program_line_id', False) program_line_id = False if program_line_id == 'null' or not program_line_id else int(program_line_id) qty = int(kw.get('qty', 0)) source = kw.get('source') qty_append = kw.get('qty_append', False) is_selected = kw.get('selected', False) is_selected = is_selected in ('true', True) # Check required fields if not user_id: return self.response(code=400, description='user_id is required') if not product_id and not program_line_id: return self.response(code=400, description='product_id or program_line_id is required') website_user_cart = request.env['website.user.cart'] # Remove previous 'buy' entries for the user user_query = ('user_id', '=', user_id) website_user_cart.search([user_query, ('source', '=', 'buy')]).unlink() # Prepare query to find existing cart entry query = [user_query, ('source', '=', 'add_to_cart')] if product_id: query.append(('product_id', '=', product_id)) elif program_line_id: query.append(('program_line_id', '=', program_line_id)) cart = website_user_cart.search(query, limit=1) data_to_update = { 'user_id': user_id, 'qty': qty, 'is_selected': is_selected, 'program_line_id': program_line_id, 'product_id': product_id, 'source': source or False } if isinstance(qty_append, str) and qty_append.lower() == "true" and cart: data_to_update['qty'] += cart.qty if cart: cart.write(data_to_update) else: cart = website_user_cart.create(data_to_update) return self.response({ 'id': cart.id, 'product': { 'id': cart.product_id.id, 'name': cart.product_id.name } if cart.product_id else None, 'program_line': { 'id': cart.program_line_id.id, 'name': cart.program_line_id.name } if cart.program_line_id else None, 'qty': cart.qty, 'is_selected': cart.is_selected, 'source': cart.source }) @http.route(PREFIX_USER + 'cart', auth='public', methods=['DELETE', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() def delete_cart_by_user_id(self, user_id, **kw): user_id = int(user_id) query = [('user_id', '=', user_id)] ids = kw.get('ids') if ids: query += [('id', 'in', [int(x) for x in ids.split(',')])] product_ids = kw.get('product_ids') if product_ids: query += [('product_id', 'in', [int(x) for x in product_ids.split(',')])] cart = request.env['website.user.cart'].search(query).unlink() return self.response(cart) @http.route(PREFIX_USER + 'cart/select-all', auth='public', methods=['POST', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized(private=True, private_key='user_id') def select_all_cart_by_user_id(self, user_id): user_id = int(user_id) website_user_cart = request.env['website.user.cart'] query = [('user_id', '=', user_id)] website_user_cart.search(query).write({ 'is_selected': True }) return self.response(True)