Files
odoo_source/addons/pos_self_order/controllers/self_entry.py
T
Pedram (pebr) e7d270063f [FIX] pos_self_order: prevent multi-company access error
Before this commit, if the POS user didn't have access to the first
company, an access error would be raised when accessing the self-order
page. The steps to reproduce this issue are as follows:

1. Add another company and set up POS self-order.
2. Remove the other company from the Marc user.
3. Open the POS in the new company.
4. Try to access the mobile menu.
This would result in an access error.

The issue was that the first company existed in the
`allowed_company_ids` in the context. To solve this, we need to
correctly set the `allowed_company_ids` in the context.

opw-3744500

closes odoo/odoo#156357

Signed-off-by: Joseph Caburnay (jcb) <jcb@odoo.com>
2024-03-08 09:42:52 +00:00

117 lines
4.4 KiB
Python

# -*- coding: utf-8 -*-
import werkzeug
from odoo import http
from odoo.http import request
class PosSelfKiosk(http.Controller):
@http.route(["/pos-self/<config_id>", "/pos-self/<config_id>/<path:subpath>"], auth="public", website=True, sitemap=True)
def start_self_ordering(self, config_id=None, access_token=None, table_identifier=None):
table_sudo = False
if not config_id or not config_id.isnumeric():
raise werkzeug.exceptions.NotFound()
if access_token:
config_access_token = True
pos_config_sudo = request.env["pos.config"].sudo().search([
("id", "=", config_id), ('access_token', '=', access_token)], limit=1)
else:
config_access_token = False
pos_config_sudo = request.env["pos.config"].sudo().search([
("id", "=", config_id)], limit=1)
if not pos_config_sudo or pos_config_sudo.self_ordering_mode == 'nothing':
raise werkzeug.exceptions.NotFound()
company = pos_config_sudo.company_id
user = pos_config_sudo.current_session_id.user_id or pos_config_sudo.self_ordering_default_user_id
pos_config = pos_config_sudo.sudo(False).with_company(company).with_user(user).with_context(allowed_company_ids=company.ids)
if not pos_config:
raise werkzeug.exceptions.NotFound()
if pos_config and pos_config.has_active_session and pos_config.self_ordering_mode == 'mobile':
if config_access_token:
config_access_token = pos_config.access_token
table_sudo = table_identifier and (
request.env["restaurant.table"]
.sudo()
.search([("identifier", "=", table_identifier), ("active", "=", True)], limit=1)
)
elif pos_config.self_ordering_mode == 'kiosk':
if config_access_token:
config_access_token = pos_config.access_token
table = table_sudo.sudo(False).with_company(company).with_user(user) if table_sudo else False
return request.render(
'pos_self_order.index',
{
'session_info': {
**request.env["ir.http"].get_frontend_session_info(),
'currencies': request.env["ir.http"].get_currencies(),
'pos_self_order_data': {
'table': table._get_self_order_data() if table else False,
'access_token': config_access_token,
**pos_config._get_self_ordering_data(),
},
"base_url": request.env['pos.session'].get_base_url(),
}
}
)
@http.route(
"/pos-self/get-category-image/<int:category_id>",
methods=["GET"],
type="http",
auth="public",
)
def pos_self_order_get_cat_image(self, category_id: int):
category = request.env["pos.category"].sudo().browse(category_id)
if not category.has_image:
raise werkzeug.exceptions.NotFound()
return (
request.env["ir.binary"]
._get_image_stream_from(
category,
field_name="image_128",
)
.get_response()
)
@http.route(
[
"/menu/get-image/<int:product_id>",
"/menu/get-image/<int:product_id>/<int:image_size>",
],
methods=["GET"],
type="http",
auth="public",
)
def pos_self_order_get_image(self, product_id, image_size=128, **kw):
# This controller is public and does not require an access code (access_token) because the user
# needs to see the product image in "menu" mode. In this mode, the user has no access_token.
self.get_any_pos_config_sudo()
return (
request.env["ir.binary"]
._get_image_stream_from(
request.env["product.product"].sudo().browse(product_id),
field_name=f"image_{image_size}",
)
.get_response()
)
def get_any_pos_config_sudo(self):
pos_config_sudo = request.env["pos.config"].sudo().search([
("self_ordering_mode", "not in", ['nothing'])], limit=1)
if not pos_config_sudo:
raise werkzeug.exceptions.NotFound()
return pos_config_sudo