11 KiB
GitHub Copilot Instructions - Kidekoop Addons Custom
Project Overview
Este repositorio contiene addons personalizados y modificados de Odoo 18.0. El proyecto combina:
- OCB (Odoo Community Backports): Base de Odoo 18.0 community en
/ocb - Addons OCA: Módulos de la comunidad OCA de los que heredan nuestros addons, modificados para adaptarse a nuestras necesidades
- Addons Custom: Módulos desarrollados por este proyecto
Architecture & Stack
- Odoo Version: 18.0 (OCB)
- Python Version: 3.10+
- Framework: Odoo ORM
- Deployment: Docker Compose
- DB: PostgreSQL
- Languages: Python, XML, JavaScript, QWeb
Code Standards
Python Style
- Seguir OCA guidelines estrictamente
- Usar black para formateo (configurado en
pyproject.toml) - isort para ordenar imports (perfil black)
- flake8 para linting
- pylint con pylint-odoo para verificaciones específicas de Odoo
- Pre-commit hooks activos (ver
.pre-commit-config.yaml)
Odoo Conventions
- Model names: snake_case con punto (
product.price.category) - Class names: PascalCase (
ProductPriceCategory) - File names: snake_case (
product_price_category.py) - XML IDs: módulo.nombre_descriptivo (
product_price_category.view_form) - Manifest: Siempre
__manifest__.py, nunca__openerp__.py
XML/View Standards
- Indent: 4 espacios (no tabs)
- XPath: Usar
positionexplícito (before,after,inside,replace,attributes) - Groups: Referenciar grupos con módulo.xml_id (
sales_team.group_sale_manager) - Sequence: Usar
sequenceattribute para ordenar campos en vistas
Translation System
IMPORTANTE: El sistema de traducciones está funcionando correctamente. Seguir estas reglas:
-
Estructura de carpeta i18n/:
addon_name/ ├── i18n/ │ ├── es.po # Español (obligatorio) │ ├── eu.po # Euskera (obligatorio) │ └── addon_name.pot # Template (generado) -
NO usar
_()en definiciones de campos a nivel de módulo:# ❌ INCORRECTO - causa warnings from odoo import _ name = fields.Char(string=_("Name")) # ✅ CORRECTO - traducción se maneja por .po files name = fields.Char(string="Name") -
Usar
_()solo en métodos y código ejecutable:def action_confirm(self): message = _("Confirmed successfully") return {'warning': {'message': message}} -
Generar/actualizar traducciones:
# Exportar términos a traducir Pedir al usuario generar a través de UI, no sabemos el método correcto para exportar SÓLO las cadenas del addon sin incluir todo el sistema.
Usar sólo polib para trataer los archivos .po, msmerge corrompe los archivos.
5. **Formato de archivos .po**:
- Encoding: UTF-8
- Content-Type: text/plain; charset=UTF-8
- Language codes: `es`, `eu`, `ca`, `gl`, `pt`, `fr`, `it`
## Project Structure
addons-cm/ ├── .github/ # GitHub configs │ └── copilot-instructions.md # Este archivo ├── ocb/ # Odoo Community Backports (18.0) │ └── addons/ # Addons core de Odoo ├── oca_dependencies.txt # Dependencias OCA ├── requirements.txt # Dependencias Python ├── docker-compose.yml # Configuración Docker ├── Makefile # Comandos útiles │ ├── # === ADDONS OCA NO MODIFICADOS === ├── account_invoice_triple_discount/ # Triple descuento en facturas (OCA) ├── purchase_triple_discount/ # Triple descuento en compras (OCA) ├── product_origin/ # Origen del producto (OCA) ├── product_get_price_helper/ # Helper de precios (OCA) ├── product_main_seller/ # Proveedor principal (OCA) ├── product_price_category/ # Categorías de precio (OCA) │ ├── # === ADDONS CUSTOM === ├── account_invoice_triple_discount_readonly/ # Fix para triple descuento ├── product_price_category_supplier/ # Extensión categorías precio ├── product_sale_price_from_pricelist/ # Auto-cálculo precio venta └── website_sale_aplicoop/ # Sistema eskaera (compras grupo)
## Addon References
**Para arquitectura, detalles de implementación y uso específico de cada addon, consultar su `README.md` individual.**
### Addons OCA No Modificados
- [account_invoice_triple_discount](../account_invoice_triple_discount/README.rst)
- [purchase_triple_discount](../purchase_triple_discount/README.rst)
- [product_origin](../product_origin/README.rst)
- [product_get_price_helper](../product_get_price_helper/README.rst)
- [product_main_seller](../product_main_seller/README.rst)
- [product_price_category](../product_price_category/README.rst)
### Addons Custom Propios
- [account_invoice_triple_discount_readonly](../account_invoice_triple_discount_readonly/README.md) - Fix bug descuentos
- [product_price_category_supplier](../product_price_category_supplier/README.md) - Gestión categorías por proveedor
- [product_sale_price_from_pricelist](../product_sale_price_from_pricelist/README.md) - Auto-precio basado en compra
- [website_sale_aplicoop](../website_sale_aplicoop/README.md) - Sistema eskaera completo
## Development Workflow
### Local Development
```bash
# Iniciar entorno
docker-compose up -d
# Actualizar addon
docker-compose exec odoo odoo -d odoo -u addon_name --stop-after-init
# Ver logs
docker-compose logs -f odoo
# Ejecutar tests
docker-compose exec odoo odoo -d odoo --test-enable --stop-after-init -u addon_name
Quality Checks
# Ejecutar todos los checks
pre-commit run --all-files
# O usar Makefile
make lint # Solo linting
make format # Formatear código
make check-addon # Verificar addon específico
Testing
- Tests en
tests/de cada addon - Naming:
test_*.py - Herencia:
odoo.tests.common.TransactionCase - Ejecutar:
--test-enableflag
Common Patterns
Extending Models
from odoo import models, fields, api
class ResPartner(models.Model):
_inherit = 'res.partner'
custom_field = fields.Char(string="Custom Field")
@api.depends('field1', 'field2')
def _compute_custom(self):
for record in self:
record.custom_computed = record.field1 + record.field2
Creating Wizards (Transient Models)
class WizardModel(models.TransientModel):
_name = 'wizard.model.name'
_description = "Wizard Description"
def action_confirm(self):
# Business logic
return {'type': 'ir.actions.act_window_close'}
Bulk Updates
# Prefer SQL-level updates for performance
self.env['product.template'].search([
('default_supplier_id', '=', partner_id)
]).write({'price_category_id': category_id})
Notifications
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': _('Success'),
'message': _('Operation completed'),
'type': 'success', # or 'warning', 'danger', 'info'
'sticky': False,
}
}
Dependencies Management
OCA Dependencies (oca_dependencies.txt)
account-invoicing
product-attribute
purchase-workflow
sale-workflow
Python Dependencies (requirements.txt)
- Versiones específicas para evitar breaking changes
- Incluir herramientas de desarrollo (linters, etc)
Security & Access Rights
Grupos Comunes
base.group_user- Usuario internobase.group_system- Administradorsales_team.group_sale_manager- Manager de ventassales_team.group_sale_salesman- Vendedorpurchase.group_purchase_manager- Manager de compras
Security Files
<!-- security/ir.model.access.csv -->
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_model_user,model.name.user,model_model_name,base.group_user,1,1,1,0
Common Issues & Solutions
Translation Warnings
Problem: WARNING: _() called at import time at module...
Solution: Remove _() from field definitions, use only in methods
XPath Not Found
Problem: Element ... not found in parent view
Solution: Check view inheritance chain, verify XML IDs are correct
Discount Reset Issue
Problem: Multiple discounts being accumulated in discount1
Solution: Use account_invoice_triple_discount_readonly addon
Price Calculation
Problem: Prices not updating from pricelist
Solution: Use product_sale_price_from_pricelist with proper configuration
Testing Guidelines
Unit Tests
- Test business logic in isolation
- Mock external dependencies
- Use
TransactionCasefor DB tests
Integration Tests
- Test workflow end-to-end
- Verify computed fields
- Check access rights
UI Tests (Tours)
odoo.define("module.tour", function (require) {
"use strict";
var tour = require("web_tour.tour");
tour.register(
"tour_name",
{
test: true,
url: "/web",
},
[
// Tour steps
],
);
});
Debugging Tips
Enable Developer Mode
Settings > Activate Developer Mode
Check Logs
docker-compose logs -f odoo | grep ERROR
docker-compose logs -f odoo | grep addon_name
Python Debugger
import pdb; pdb.set_trace() # Set breakpoint
Performance Profiling
--log-level=debug_sql # Show SQL queries
Documentation Standards
README.md Structure
Cada addon debe tener un README.md con:
- Title & Summary: Qué hace el addon
- Features: Lista de funcionalidades
- Dependencies: Addons requeridos
- Installation: Comandos de instalación
- Configuration: Settings necesarios
- Usage: Flujo de trabajo típico
- Technical Details: Modelos, campos, métodos
- Translations: Estado de traducciones (si aplica)
Code Comments
- Docstrings en clases y métodos públicos
- Comentarios inline para lógica compleja
- TODOs con contexto completo
Version Control
Commit Messages
[TAG] module: Brief description
Longer explanation if needed
Tags: [ADD], [FIX], [IMP], [REF], [REM], [I18N], [DOC]
Branch Strategy
main- Production readydev- Developmentfeature/*- New featuresfix/*- Bug fixes
Performance Considerations
- Use
@api.dependscorrectamente para computed fields - Prefer
search()+write()sobre loops conwrite() - Use
create()con lista de vals para bulk creates - Indexes en campos frecuentemente buscados
- Avoid N+1 queries con
prefetch
Resources
- OCA Guidelines: https://github.com/OCA/odoo-community.org/blob/master/website/Contribution/CONTRIBUTING.rst
- Odoo Documentation: https://www.odoo.com/documentation/18.0/
- OCB Repository: https://github.com/OCA/OCB
- OCA Repositories: https://github.com/OCA/
Last Updated: 2026-02-12 Odoo Version: 18.0 Python Version: 3.10+