HTTPS had been disabled on SaaS to allow the use of the IoT Box that had no valid SSL certificate. As of V13.0, IoT Boxes connected to Enterprise DBs have a valid certificate. POS can then use HTTPS. Nginx is configured to redirect all requests to `/pos/web` to HTTP, so we change the POS URL to `/pos/ui`, except when using a Six payment terminal as it only works in HTTP. closes odoo/odoo#56933 Taskid: 2191878 X-original-commit: 8aee4992778fee5e2f146c4cff8b35e83c7f56b3 Signed-off-by: pimodoo <pimodoo@users.noreply.github.com> Signed-off-by: Antoine Prieëls <aprieels@users.noreply.github.com>
87 lines
3.7 KiB
Python
87 lines
3.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
import json
|
|
import logging
|
|
import werkzeug.utils
|
|
|
|
from odoo import http
|
|
from odoo.http import request
|
|
from odoo.osv.expression import AND
|
|
from odoo.tools import convert
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class PosController(http.Controller):
|
|
|
|
@http.route(['/pos/web', '/pos/ui'], type='http', auth='user')
|
|
def pos_web(self, config_id=False, **k):
|
|
"""Open a pos session for the given config.
|
|
|
|
The right pos session will be selected to open, if non is open yet a new session will be created.
|
|
|
|
/pos/ui and /pos/web both can be used to acces the POS. On the SaaS,
|
|
/pos/ui uses HTTPS while /pos/web uses HTTP.
|
|
|
|
:param debug: The debug mode to load the session in.
|
|
:type debug: str.
|
|
:param config_id: id of the config that has to be loaded.
|
|
:type config_id: str.
|
|
:returns: object -- The rendered pos session.
|
|
"""
|
|
domain = [
|
|
('state', 'in', ['opening_control', 'opened']),
|
|
('user_id', '=', request.session.uid),
|
|
('rescue', '=', False)
|
|
]
|
|
if config_id:
|
|
domain = AND([domain,[('config_id', '=', int(config_id))]])
|
|
pos_session = request.env['pos.session'].sudo().search(domain, limit=1)
|
|
|
|
# The same POS session can be opened by a different user => search without restricting to
|
|
# current user. Note: the config must be explicitly given to avoid fallbacking on a random
|
|
# session.
|
|
if not pos_session and config_id:
|
|
domain = [
|
|
('state', 'in', ['opening_control', 'opened']),
|
|
('rescue', '=', False),
|
|
('config_id', '=', int(config_id)),
|
|
]
|
|
pos_session = request.env['pos.session'].sudo().search(domain, limit=1)
|
|
|
|
if not pos_session:
|
|
return werkzeug.utils.redirect('/web#action=point_of_sale.action_client_pos_menu')
|
|
# The POS only work in one company, so we enforce the one of the session in the context
|
|
session_info = request.env['ir.http'].session_info()
|
|
session_info['user_context']['allowed_company_ids'] = pos_session.company_id.ids
|
|
context = {
|
|
'session_info': session_info,
|
|
'login_number': pos_session.login(),
|
|
}
|
|
return request.render('point_of_sale.index', qcontext=context)
|
|
|
|
@http.route('/pos/ui/tests', type='http', auth="user")
|
|
def test_suite(self, mod=None, **kwargs):
|
|
domain = [
|
|
('state', '=', 'opened'),
|
|
('user_id', '=', request.session.uid),
|
|
('rescue', '=', False)
|
|
]
|
|
pos_session = request.env['pos.session'].sudo().search(domain, limit=1)
|
|
session_info = request.env['ir.http'].session_info()
|
|
session_info['user_context']['allowed_company_ids'] = pos_session.company_id.ids
|
|
context = {
|
|
'session_info': session_info,
|
|
}
|
|
return request.render('point_of_sale.qunit_suite', qcontext=context)
|
|
|
|
@http.route('/pos/sale_details_report', type='http', auth='user')
|
|
def print_sale_details(self, date_start=False, date_stop=False, **kw):
|
|
r = request.env['report.point_of_sale.report_saledetails']
|
|
pdf, _ = request.env.ref('point_of_sale.sale_details_report').with_context(date_start=date_start, date_stop=date_stop)._render_qweb_pdf(r)
|
|
pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf))]
|
|
return request.make_response(pdf, headers=pdfhttpheaders)
|
|
|
|
@http.route('/pos/load_onboarding_data', type='json', auth='user')
|
|
def load_onboarding_data(self):
|
|
convert.convert_file(request.env.cr, 'point_of_sale', 'data/point_of_sale_onboarding.xml', None, mode='init', kind='data')
|