feat(shopfloor): post-migrate hook for kiosk password init
Generates a random kiosk password on first deploy, stores in ir.config_parameter for sysadmin retrieval. Idempotent — re-runs on subsequent -u leave the password alone. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,55 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""Tablet PIN session redesign — generate kiosk password on first deploy.
|
||||||
|
|
||||||
|
Runs on every -u (post_init_hook only fires on fresh install per
|
||||||
|
CLAUDE.md rule 13d). Idempotent: only writes the password if the
|
||||||
|
ir.config_parameter key is absent.
|
||||||
|
|
||||||
|
After this hook runs, retrieve the kiosk password via:
|
||||||
|
odoo-shell -d admin -c "print(env['ir.config_parameter'].sudo().get_param(
|
||||||
|
'fp.tablet.kiosk_password'))"
|
||||||
|
|
||||||
|
Then sysadmin enters that password ONCE in the tablet browser to log
|
||||||
|
the kiosk session in. Browser cookie persists per the configured
|
||||||
|
session_db.session_lifetime.
|
||||||
|
"""
|
||||||
|
import logging
|
||||||
|
import secrets
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def migrate(cr, version):
|
||||||
|
from odoo import api, SUPERUSER_ID
|
||||||
|
env = api.Environment(cr, SUPERUSER_ID, {})
|
||||||
|
|
||||||
|
ICP = env['ir.config_parameter'].sudo()
|
||||||
|
KEY = 'fp.tablet.kiosk_password'
|
||||||
|
|
||||||
|
existing = ICP.get_param(KEY)
|
||||||
|
if existing:
|
||||||
|
_logger.info(
|
||||||
|
'fp.tablet.kiosk_password already set; leaving it alone (idempotent)'
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
new_pwd = secrets.token_urlsafe(32)
|
||||||
|
ICP.set_param(KEY, new_pwd)
|
||||||
|
_logger.info(
|
||||||
|
'fp.tablet.kiosk_password generated; retrieve via odoo-shell '
|
||||||
|
"env['ir.config_parameter'].sudo().get_param('%s')",
|
||||||
|
KEY,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Also write the password onto the user so they can log in via /web/login.
|
||||||
|
user = env.ref(
|
||||||
|
'fusion_plating_shopfloor.user_fp_tablet_kiosk',
|
||||||
|
raise_if_not_found=False,
|
||||||
|
)
|
||||||
|
if user:
|
||||||
|
user.password = new_pwd
|
||||||
|
_logger.info('fp_tablet_kiosk user password set to generated value')
|
||||||
|
else:
|
||||||
|
_logger.warning(
|
||||||
|
'fp_tablet_kiosk user not found via xmlid; password not applied to user record'
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user