-
Notifications
You must be signed in to change notification settings - Fork 71
[IMP]stock_ux:new user rights #852
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: 19.0
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
Este PR agrega un nuevo grupo de seguridad "Usuario Básico de Inventario" (group_stock_user_basic) con el objetivo de proporcionar permisos similares a stock.group_stock_user pero sin permitir realizar ajustes de inventario directos sobre stock.quant.
Cambios clave:
- Nuevo grupo de seguridad con herencia de
stock.group_stock_user - Restricción de acceso a
stock.quantmedianteir.ruley CSV - Incremento de versión de 19.0.1.1.0 a 19.0.1.2.0
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.
| File | Description |
|---|---|
| stock_ux/security/stock_ux_security.xml | Agrega definición del grupo group_stock_user_basic y regla de acceso restrictiva para stock.quant |
| stock_ux/security/ir.model.access.csv | Agrega línea de control de acceso que deniega todos los permisos sobre stock.quant para el nuevo grupo |
| stock_ux/manifest.py | Incrementa versión del módulo de 1.1.0 a 1.2.0 (minor bump) |
| <!-- Regla de registro para quitar acceso a ajustes de inventario --> | ||
| <record id="stock_quant_rule_basic_user" model="ir.rule"> | ||
| <field name="name">Stock Quant: Usuario Básico de Inventario - Sin Acceso</field> | ||
| <field name="model_id" ref="stock.model_stock_quant"/> | ||
| <field name="groups" eval="[(4, ref('group_stock_user_basic'))]"/> | ||
| <field name="domain_force">[(0, '=', 1)]</field> | ||
| <field name="perm_read" eval="True"/> | ||
| <field name="perm_write" eval="False"/> | ||
| <field name="perm_create" eval="False"/> | ||
| <field name="perm_unlink" eval="False"/> | ||
| </record> | ||
|
|
Copilot
AI
Dec 30, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
La ir.rule tiene una contradicción lógica: establece perm_read="True" (permitir lectura) pero con un dominio [(0, '=', 1)] que filtra todos los registros (siempre falso).
Además, esta regla es redundante con el acceso definido en ir.model.access.csv línea 4, donde ya se deniegan todos los permisos (0,0,0,0).
Problema adicional: Como se explicó en el comentario del implied_ids, esta regla no funcionará como se espera porque el grupo hereda de stock.group_stock_user, que ya tiene acceso completo por ACL.
Recomendación:
Si se corrige la herencia del grupo, entonces:
- Eliminar esta
ir.rulecompletamente (es redundante con el CSV) - O bien, si se prefiere usar
ir.rule, cambiarperm_readaFalsepara mayor claridad, aunque el dominio[(0,'=',1)]ya niega el acceso de facto.
| <!-- Regla de registro para quitar acceso a ajustes de inventario --> | |
| <record id="stock_quant_rule_basic_user" model="ir.rule"> | |
| <field name="name">Stock Quant: Usuario Básico de Inventario - Sin Acceso</field> | |
| <field name="model_id" ref="stock.model_stock_quant"/> | |
| <field name="groups" eval="[(4, ref('group_stock_user_basic'))]"/> | |
| <field name="domain_force">[(0, '=', 1)]</field> | |
| <field name="perm_read" eval="True"/> | |
| <field name="perm_write" eval="False"/> | |
| <field name="perm_create" eval="False"/> | |
| <field name="perm_unlink" eval="False"/> | |
| </record> |
| id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink | ||
| access_stock_operation_wizard,access_stock_operation_wizard,model_stock_operation_wizard,base.group_user,1,1,1,1 | ||
| stock_ux.access_stock_picking_zpl_lines,access_stock_picking_zpl_lines,stock_ux.model_stock_picking_zpl_lines,base.group_user,1,1,1,1 | ||
| access_stock_quant_basic_user,Stock Quant - Usuario Básico,stock.model_stock_quant,stock_ux.group_stock_user_basic,0,0,0,0 |
Copilot
AI
Dec 30, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Esta línea de acceso (todos los permisos en 0) es redundante con la ir.rule definida en stock_ux_security.xml líneas 29-38.
En Odoo, cuando se quiere denegar acceso completo a un modelo para un grupo específico, es suficiente con una de estas dos aproximaciones:
- Opción 1 (recomendada): Solo la línea CSV con todos los permisos en 0
- Opción 2: Solo una
ir.rulecon dominio que filtra todos los registros
Tener ambas es redundante y puede generar confusión en el mantenimiento.
Recomendación:
Mantener solo esta línea CSV (más simple y directa) y eliminar la ir.rule de las líneas 29-38 del archivo XML.
| access_stock_quant_basic_user,Stock Quant - Usuario Básico,stock.model_stock_quant,stock_ux.group_stock_user_basic,0,0,0,0 |
| <record model="res.groups" id="group_stock_user_basic"> | ||
| <field name="name">Usuario Básico de Inventario</field> | ||
| <field name="privilege_id" ref="stock.res_groups_privilege_inventory"/> | ||
| <field name="comment">Este grupo tiene los mismos permisos que Usuario de Inventario pero sin poder realizar ajustes de inventario (stock.quant).</field> | ||
| <field name="implied_ids" eval="[(4, ref('stock.group_stock_user'))]"/> |
Copilot
AI
Dec 30, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
El código en stock_ux/models/stock_move_line.py líneas 85-91 realiza búsquedas en stock.quant dentro del método _check_quantity_available(), que es llamado por la constraint _check_manual_lines().
Si se asigna el grupo group_stock_user_basic a un usuario, y ese grupo efectivamente bloquea el acceso a stock.quant (después de corregir el problema de herencia), entonces cualquier operación que dispare la constraint fallará con un error de permisos de acceso cuando intente ejecutar self.env["stock.quant"].search(...).
Impacto operacional:
Los usuarios con este grupo no podrán:
- Editar cantidades en líneas de movimiento (campo
quantity) cuandoblock_manual_linesesté activo - Realizar operaciones de picking que validen disponibilidad de stock
Recomendaciones:
- Revisar si este grupo debe tener acceso de solo lectura a
stock.quant(en lugar de bloqueo total) para permitir estas validaciones - O bien, ajustar la lógica de la constraint para manejar la falta de permisos de forma elegante (ej. usando
sudo()para la consulta de validación) - Documentar claramente en el
commentdel grupo qué limitaciones operacionales tendrán los usuarios
| <field name="name">Usuario Básico de Inventario</field> | ||
| <field name="privilege_id" ref="stock.res_groups_privilege_inventory"/> | ||
| <field name="comment">Este grupo tiene los mismos permisos que Usuario de Inventario pero sin poder realizar ajustes de inventario (stock.quant).</field> | ||
| <field name="implied_ids" eval="[(4, ref('stock.group_stock_user'))]"/> |
Copilot
AI
Dec 30, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
El grupo hereda de stock.group_stock_user (mediante implied_ids), que ya otorga permisos completos sobre stock.quant a través de las ACLs del módulo base stock. Cuando un grupo hereda de otro, obtiene automáticamente todos sus permisos.
Luego se intenta restringir el acceso mediante una ir.rule, pero las reglas de registro (ir.rule) se evalúan DESPUÉS de las verificaciones de acceso base (ACL). Si el grupo padre ya tiene acceso completo por ACL, la regla restrictiva no lo bloqueará efectivamente.
Solución recomendada:
En lugar de heredar de stock.group_stock_user, el grupo debería:
- Heredar de grupos más básicos (como
base.group_user) - Replicar los accesos necesarios de
stock.group_stock_usermediante ACLs propias - Excluir explícitamente el acceso a
stock.quant
Alternativamente, eliminar el implied_ids y definir manualmente todos los permisos necesarios sin incluir stock.quant.
| <field name="implied_ids" eval="[(4, ref('stock.group_stock_user'))]"/> | |
| <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/> |

No description provided.