-
Notifications
You must be signed in to change notification settings - Fork 102
[MIG] product_uoms_purchase: Migration to 19.0 #841
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?
[MIG] product_uoms_purchase: Migration to 19.0 #841
Conversation
bb0cb69 to
b2796ac
Compare
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 realiza la migración del módulo product_uoms_purchase de Odoo 18.0 a 19.0, simplificando significativamente la arquitectura del módulo al eliminar la dependencia del módulo product_uoms y adoptar un enfoque más directo basado en campos Many2many y la nueva API de Odoo 19 para control de UOMs permitidas en líneas de compra.
- Se elimina la dependencia de
product_uomsy se reemplaza la funcionalidad con campos directos enproduct.template - Se migra de un sistema basado en modelo intermedio (
product.uomscon flagpurchase_ok) a campos Many2many directos (uom_po_ids) con control boolean (only_po_packagings) - Se adapta la lógica de control de UOMs para usar el nuevo método
_compute_allowed_uom_idsde Odoo 19 en lugar de onchanges y constraints
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
product_uoms_purchase/__manifest__.py |
Actualiza versión a 19.0.1.0.0, elimina dependencia de product_uoms, comenta archivo de seguridad obsoleto y marca módulo como instalable |
product_uoms_purchase/models/__init__.py |
Elimina imports de modelos product_uoms y product_product que ya no existen |
product_uoms_purchase/models/product_template.py |
Reemplaza método compute _compute_uom_po_id por dos campos nuevos: uom_po_ids (Many2many) y only_po_packagings (Boolean) |
product_uoms_purchase/models/purchase_order_line.py |
Migra de sistema con onchange/constraints a implementación de _compute_allowed_uom_ids que extiende funcionalidad base de Odoo 19 |
product_uoms_purchase/models/product_uoms.py |
Archivo eliminado completamente - modelo intermedio ya no necesario |
product_uoms_purchase/models/product_product.py |
Archivo eliminado completamente - método get_product_uoms ya no necesario |
product_uoms_purchase/views/purchase_order_views.xml |
Archivo eliminado - la funcionalidad ahora se maneja a nivel de modelo con allowed_uom_ids |
product_uoms_purchase/views/product_template_views.xml |
Reemplaza herencia de vista de product_uoms por herencia directa de product, añade sección "Packaging" con campos uom_po_ids y only_po_packagings |
| product.display_name, | ||
| ) | ||
| ) | ||
| @api.depends("product_id.product_tmpl_id.only_po_packagings") |
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 decorador @api.depends está incompleto. La dependencia declarada es "product_id.product_tmpl_id.only_po_packagings", pero el método también accede a "product_id.seller_ids" y "product.uom_po_ids" (líneas 17 y 19). Deberías agregar estas dependencias al decorador para que el campo compute se recalcule correctamente cuando cambien esos valores relacionados.
| @api.depends("product_id.product_tmpl_id.only_po_packagings") | |
| @api.depends( | |
| "product_id.product_tmpl_id.only_po_packagings", | |
| "product_id.seller_ids.product_uom_id", | |
| "product_id.uom_po_ids", | |
| ) |
| "depends": [ | ||
| "product_uoms", | ||
| # TODO when migrate analyze if this depends are necessary or | ||
| # we do the part of the "stock.rule" in a bridge module | ||
| "purchase_stock", |
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.
Se eliminó la dependencia de "product_uoms" del manifest, pero la vista hereda de "product.product_template_only_form_view" en lugar de la referencia original que era "product_uoms.product_template_only_form_view" (línea 7). Esto es correcto si el módulo "product_uoms" ya no es necesario, pero debes verificar que esta nueva herencia es la correcta para Odoo 19 y que no quedan referencias rotas. Además, dado que se eliminaron varios modelos (product_uoms, product_product), necesitas un script de migración para limpiar los datos huérfanos de esos modelos eliminados en la base de datos.
| uom_po_ids = fields.Many2many( | ||
| "uom.uom", | ||
| "product_template_uom_po_rel", | ||
| "product_tmpl_id", | ||
| "uom_id", | ||
| string="Purchase Packagings", | ||
| help="Additional packagings for this product which can be used for purchase", | ||
| domain="[('id', '!=', uom_id)]", | ||
| ) | ||
|
|
||
| only_po_packagings = fields.Boolean( | ||
| default=False, | ||
| help="When enabled, only UoMs defined in product packagings will be available for selection in purchase orders.", | ||
| ) |
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.
Se están agregando dos campos nuevos almacenados (uom_po_ids y only_po_packagings) al modelo product.template, lo cual constituye un cambio estructural. Según las guías de migración, necesitas crear un script de migración en migrations/19.0.1.0.0/ (carpeta post) para:
- Poblar el campo
uom_po_idscon los valores existentes de las UOMs de compra que había en el módulo anterior (si hay datos a migrar) - Configurar el campo
only_po_packagingscon valores por defecto apropiados para productos existentes - Hacer el backfill en lotes si el modelo tiene muchos registros
El script debe ser idempotente y registrar logs claros de las operaciones realizadas.
| if product: | ||
| supplier_uoms = product.seller_ids.mapped("product_uom_id") | ||
| if product.product_tmpl_id.only_po_packagings: | ||
| line.allowed_uom_ids = product.uom_po_ids | supplier_uoms |
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.
En la línea 19, cuando only_po_packagings es True, se asigna directamente product.uom_po_ids | supplier_uoms, pero esto podría resultar en un conjunto vacío si no hay UOMs configuradas en uom_po_ids. Considera verificar si es necesario incluir al menos la UOM base del producto (product.uom_id o product.uom_po_id) para evitar que las líneas de compra queden sin opciones válidas de UOM. En la línea 21, para el caso contrario, estás combinando correctamente con allowed_uom_ids del super(), lo que sugiere que el caso de la línea 19 también debería considerar valores base.
| line.allowed_uom_ids = product.uom_po_ids | supplier_uoms | |
| uoms = product.uom_po_ids | supplier_uoms | |
| if not uoms: | |
| uoms = product.uom_po_id | product.uom_id | |
| line.allowed_uom_ids = uoms |
| <field | ||
| name="uom_po_ids" | ||
| widget="many2many_uom_tags" | ||
| options="{'no_create': True, 'edit_tags': True}" | ||
| groups="uom.group_uom" | ||
| force_save="1" | ||
| context="{'product_id': product_variant_id if product_variant_count == 1 else False, 'product_ids': product_variant_ids, 'show_variant_name': product_variant_count > 1}"/> |
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 campo uom_po_ids se presenta con el widget "many2many_uom_tags", pero la ayuda visible para el usuario ("Purchase Packagings") podría no ser clara sin más contexto. Considera si el string actual es suficientemente descriptivo para el usuario final, o si debería llamarse "Purchase UoMs" o algo más explícito. Además, verifica que el widget "many2many_uom_tags" esté disponible en Odoo 19 y funcione correctamente, ya que es un widget específico que puede haber cambiado entre versiones.
| <odoo> | ||
|
|
||
| <record id="product_template_only_form_view" model="ir.ui.view"> | ||
| <field name="name">product.sale.uom.form</field> |
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 name de la vista es "product.sale.uom.form", pero esta vista es para compras (purchase), no para ventas (sale). El nombre debería ser algo como "product.purchase.uom.form" o "product.po.uom.form" para reflejar correctamente su propósito y evitar confusión.
| <field name="name">product.sale.uom.form</field> | |
| <field name="name">product.purchase.uom.form</field> |
| "views/product_template_views.xml", | ||
| "views/purchase_order_views.xml", | ||
| "security/ir.model.access.csv", | ||
| # "security/ir.model.access.csv", |
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 archivo de seguridad está comentado pero todavía existe en el módulo. Este archivo ir.model.access.csv contiene permisos de acceso para el modelo product_uoms que ya no existe en esta migración (fue eliminado en los cambios). Deberías eliminar completamente este archivo del módulo y la referencia comentada del manifest, ya que no tiene utilidad alguna.
| # "security/ir.model.access.csv", |
b2796ac to
650ba29
Compare
650ba29 to
8d8c6ea
Compare

No description provided.