feat(fusion_plating_shopfloor): fpRpc wrapper + env_for_tablet_tech helper (P6.3.1)
Client-side fpRpc() is a drop-in for rpc() that automatically injects tablet_tech_id from the tech_store into every action call. Read-only endpoints can keep using plain rpc(). Server-side env_for_tablet_tech(env, tablet_tech_id) returns an env scoped via with_user() when the id is a valid active user; otherwise returns the original env unchanged. Controllers call this at the top of action methods so all subsequent writes carry the right uid. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2026 Nexa Systems Inc.
|
||||
# License OPL-1 (Odoo Proprietary License v1.0)
|
||||
"""Helper for audit-credit propagation (Phase 6.3 tablet redesign).
|
||||
|
||||
Controllers that accept an optional `tablet_tech_id` kwarg use this
|
||||
helper to switch their `env` to the tech-of-record before performing
|
||||
writes. The result: chatter posts + create_uid/write_uid carry the
|
||||
unlocked tech's identity, not the tablet's persistent session user.
|
||||
"""
|
||||
import logging
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def env_for_tablet_tech(env, tablet_tech_id):
|
||||
"""Return an env scoped to `tablet_tech_id` if it's a valid user;
|
||||
otherwise return the original env unchanged.
|
||||
|
||||
Validation: the user must exist and be active. We deliberately do
|
||||
NOT cross-check that they actually unlocked recently — the OWL
|
||||
component is the source of truth for "who's at the tablet right
|
||||
now", and the only path that produces a tablet_tech_id is a
|
||||
successful /fp/tablet/unlock followed by an active session in the
|
||||
OWL tech_store.
|
||||
"""
|
||||
if not tablet_tech_id:
|
||||
return env
|
||||
try:
|
||||
tech_id = int(tablet_tech_id)
|
||||
except (TypeError, ValueError):
|
||||
return env
|
||||
User = env['res.users'].sudo()
|
||||
tech = User.browse(tech_id)
|
||||
if not tech.exists() or not tech.active:
|
||||
_logger.warning(
|
||||
"tablet_tech_id %s invalid (not found or inactive); "
|
||||
"falling back to session uid %s",
|
||||
tablet_tech_id, env.uid,
|
||||
)
|
||||
return env
|
||||
return env(user=tech_id)
|
||||
Reference in New Issue
Block a user