Skip to content

Commit 24c6286

Browse files
committed
refactor
1 parent 6e00952 commit 24c6286

16 files changed

Lines changed: 643 additions & 38 deletions

base_company_dependant/models/__init__.py

Lines changed: 0 additions & 2 deletions
This file was deleted.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ Arquitectura técnica
9090
Backend
9191
-------
9292

93-
``base.company.dependant`` (``models.AbstractModel``):
93+
``base.company.dependent`` (``models.AbstractModel``):
9494

9595
* ``get_company_dependent_values(res_model, res_id, field_name)``
9696
→ valores crudos por compañía (para el modal).
@@ -115,7 +115,7 @@ Instalación
115115
.. code-block:: bash
116116
117117
# Instalar desde la interfaz de Odoo o con:
118-
odoo-bin -d <db> -u base_company_dependant
118+
odoo-bin -d <db> -u base_company_dependent
119119
120120
Dependencias
121121
============
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
"depends": ["base", "web"],
3434
"assets": {
3535
"web.assets_backend": [
36-
"base_company_dependant/static/src/**/*",
36+
"base_company_dependent/static/src/**/*",
3737
],
3838
},
3939
"data": [],

base_company_dependent/i18n/es.po

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# Translation of Odoo Server.
2+
# This file contains the translation of the following modules:
3+
# * base_company_dependent
4+
#
5+
msgid ""
6+
msgstr ""
7+
"Project-Id-Version: Odoo Server 19.0+e\n"
8+
"Report-Msgid-Bugs-To: \n"
9+
"POT-Creation-Date: 2026-03-11 00:00+0000\n"
10+
"PO-Revision-Date: 2026-03-11 00:00+0000\n"
11+
"Last-Translator: \n"
12+
"Language-Team: Spanish\n"
13+
"Language: es\n"
14+
"MIME-Version: 1.0\n"
15+
"Content-Type: text/plain; charset=UTF-8\n"
16+
"Content-Transfer-Encoding: \n"
17+
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? "
18+
"1 : 2;\n"
19+
20+
#. module: base_company_dependent
21+
#: model:ir.model,name:base_company_dependent.model_base_company_dependent
22+
msgid "Helpers para campos company_dependent"
23+
msgstr "Helpers para campos company_dependent"
24+
25+
#. module: base_company_dependent
26+
#: model:ir.model,name:base_company_dependent.model_base
27+
msgid "Base"
28+
msgstr "Base"
29+
30+
#. module: base_company_dependent
31+
#. odoo-javascript
32+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
33+
msgid "Company Values: %s"
34+
msgstr "Valores por compañía: %s"
35+
36+
#. module: base_company_dependent
37+
#. odoo-javascript
38+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
39+
msgid "No value (explicitly False)"
40+
msgstr "Sin valor (explícitamente Falso)"
41+
42+
#. module: base_company_dependent
43+
#. odoo-javascript
44+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
45+
msgid "Restore to default value (removes the JSON key)"
46+
msgstr "Restaurar al valor por defecto (elimina la clave del JSON)"
47+
48+
#. module: base_company_dependent
49+
#. odoo-javascript
50+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
51+
msgid "Specific"
52+
msgstr "Específico"
53+
54+
#. module: base_company_dependent
55+
#. odoo-javascript
56+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
57+
msgid "Default"
58+
msgstr "Por defecto"
59+
60+
#. module: base_company_dependent
61+
#. odoo-javascript
62+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
63+
msgid "Loading company values..."
64+
msgstr "Cargando valores por compañía..."
65+
66+
#. module: base_company_dependent
67+
#. odoo-javascript
68+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
69+
msgid "Reset "
70+
msgstr "Restablecer "
71+
72+
#. module: base_company_dependent
73+
#. odoo-javascript
74+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
75+
msgid "removes the set value and restores to the global default value."
76+
msgstr "elimina el valor configurado y restaura al valor por defecto global."
77+
78+
#. module: base_company_dependent
79+
#. odoo-javascript
80+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
81+
msgid "Company"
82+
msgstr "Compañía"
83+
84+
#. module: base_company_dependent
85+
#. odoo-javascript
86+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
87+
msgid "Value"
88+
msgstr "Valor"
89+
90+
#. module: base_company_dependent
91+
#. odoo-javascript
92+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
93+
msgid "Status"
94+
msgstr "Estado"
95+
96+
#. module: base_company_dependent
97+
#. odoo-javascript
98+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
99+
msgid "Save"
100+
msgstr "Guardar"
101+
102+
#. module: base_company_dependent
103+
#. odoo-javascript
104+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
105+
msgid "Discard"
106+
msgstr "Descartar"
107+
108+
#. module: base_company_dependent
109+
#. odoo-javascript
110+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
111+
msgid ""
112+
"The field '%s' is required and cannot be empty. The previous value has been "
113+
"restored."
114+
msgstr ""
115+
"El campo '%s' es obligatorio y no puede estar vacío. Se restauró el valor "
116+
"anterior."
117+
118+
#. module: base_company_dependent
119+
#. odoo-javascript
120+
#: code:addons/base_company_dependent/static/src/company_dependent_dialog.js:0
121+
msgid "Values saved successfully."
122+
msgstr "Valores guardados correctamente."
123+
124+
#. module: base_company_dependent
125+
#. odoo-javascript
126+
#: code:addons/base_company_dependent/static/src/company_dependent_button.js:0
127+
msgid "Loading company information…"
128+
msgstr "Cargando información de compañía…"
129+
130+
#. module: base_company_dependent
131+
#. odoo-javascript
132+
#: code:addons/base_company_dependent/static/src/company_dependent_button.js:0
133+
msgid "Specific value for this company. Click to manage."
134+
msgstr "Valor específico para esta compañía. Haga clic para gestionar."
135+
136+
#. module: base_company_dependent
137+
#. odoo-javascript
138+
#: code:addons/base_company_dependent/static/src/company_dependent_button.js:0
139+
msgid "Default value (fallback). Click to manage."
140+
msgstr "Valor por defecto (heredado). Haga clic para gestionar."
141+
142+
#. module: base_company_dependent
143+
#: model_terms:ir.ui.view,arch_db:base_company_dependent.CompanyDependentDialog
144+
msgid "Reset"
145+
msgstr "Resetear"
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from . import ir_ui_view
2+
from . import base_company_dependent

base_company_dependant/models/base_company_dependant.py renamed to base_company_dependent/models/base_company_dependent.py

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,18 @@
2828
_logger = logging.getLogger(__name__)
2929

3030

31-
class BaseCompanyDependant(models.AbstractModel):
31+
class BaseCompanyDependent(models.AbstractModel):
3232
"""Proporciona métodos de backend para leer y escribir campos
3333
company_dependent accediendo directamente a la columna JSONB,
3434
sin pasar por la resolución del ORM (que devuelve el valor ya
3535
resuelto para la compañía activa).
3636
3737
Se expone como AbstractModel para poder extenderse en otros módulos,
3838
pero los métodos @api.model se pueden invocar directamente via RPC
39-
desde el frontend usando ``env['base.company.dependant'].call(...)``.
39+
desde el frontend usando ``env['base.company.dependent'].call(...)``.
4040
"""
4141

42-
_name = "base.company.dependant"
42+
_name = "base.company.dependent"
4343
_description = "Helpers para campos company_dependent"
4444

4545
# ------------------------------------------------------------------
@@ -279,21 +279,41 @@ def set_company_dependent_values(self, res_model, res_id, field_name, values_dic
279279

280280
record = model_obj.browse(res_id)
281281

282+
# Sanitize corrupted JSONB: replace boolean `false` with `null` so the
283+
# ORM can read the field without a PostgreSQL cast error (Many2one
284+
# columns expect integer or null, not boolean).
285+
if field.type == "many2one":
286+
raw_json = self._get_raw_json(model_obj._table, field_name, res_id)
287+
sanitized = {k: (None if v is False else v) for k, v in raw_json.items()}
288+
if sanitized != raw_json:
289+
self._write_raw_json(model_obj._table, field_name, res_id, sanitized)
290+
record.invalidate_recordset([field_name])
291+
282292
for company_id_str, value in values_dict.items():
283293
company_id = int(company_id_str)
284294
company = self.env["res.company"].browse(company_id)
285295
record_with_company = record.with_company(company)
286296

287297
if value == "RESET":
288-
# RESET: escribimos el valor de fallback via ORM.
289-
# La query UPDATE del ORM para company_dependent hace:
290-
# JOIN fallbacks ON d.key = f.key AND d.value != f.value
291-
# Con lo cual descarta la clave cuando value == fallback, logrando
292-
# exactamente el efecto de "eliminar la clave del JSON".
293-
# A diferencia del raw SQL, este camino dispara recomputes y hooks.
298+
# RESET: eliminar la clave de la compañía del JSONB para que
299+
# el campo vuelva al fallback global (ir.default / COALESCE).
300+
#
301+
# Intentamos primero la vía ORM: escribir el valor de fallback
302+
# hace que el UPDATE del ORM descarte la clave cuando
303+
# value == fallback. Pero si el fallback es False y el valor
304+
# almacenado también es False (o null), el ORM no ejecuta
305+
# UPDATE porque no detecta cambios. En ese caso eliminamos
306+
# la clave directamente del JSONB.
294307
fallback_rec = field.get_company_dependent_fallback(record_with_company)
295308
write_val = field.convert_to_write(fallback_rec, record_with_company)
296309
record_with_company.write({field_name: write_val})
310+
311+
# Verificar si la clave sigue en el JSONB (el ORM no la eliminó).
312+
raw_json = self._get_raw_json(model_obj._table, field_name, res_id)
313+
if str(company_id) in raw_json:
314+
del raw_json[str(company_id)]
315+
self._write_raw_json(model_obj._table, field_name, res_id, raw_json)
316+
record.invalidate_recordset([field_name])
297317
else:
298318
# Valor explícito (ID o False): usamos el ORM con with_company
299319
# para que check_company, ondelete y demás validaciones se apliquen.
@@ -309,7 +329,7 @@ def set_company_dependent_values(self, res_model, res_id, field_name, values_dic
309329
write_column = field.convert_to_column(value, record_with_company)
310330
if write_column == fallback_column:
311331
raw_json = self._get_raw_json(model_obj._table, field_name, res_id)
312-
raw_json[str(company_id)] = value # False → null en JSON
332+
raw_json[str(company_id)] = write_column # None → null en JSON
313333
self._write_raw_json(model_obj._table, field_name, res_id, raw_json)
314334
record.invalidate_recordset([field_name])
315335

File renamed without changes.

base_company_dependant/static/src/company_dependent.css renamed to base_company_dependent/static/src/company_dependent.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Estilos para el módulo base_company_dependant.
2+
* Estilos para el módulo base_company_dependent.
33
*
44
* .o_cd_m2o_wrapper : wrapper del campo Many2One extendido.
55
* .o_cd_fallback : activa el estilo «muted» cuando el valor es el fallback global.

base_company_dependant/static/src/company_dependent_button.js renamed to base_company_dependent/static/src/company_dependent_button.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { CompanyDependentDialog } from "./company_dependent_dialog";
2020
* (el padre recarga el record y refresca cdState).
2121
*/
2222
export class CompanyDependentButton extends Component {
23-
static template = "base_company_dependant.CompanyDependentButton";
23+
static template = "base_company_dependent.CompanyDependentButton";
2424
static props = {
2525
fieldName: { type: String },
2626
fieldString: { type: String },

0 commit comments

Comments
 (0)