Notaciones Polacas y Dominios en Odoo

Odoo utiliza la notación polaca para los filtros de dominio.

Dominios

Un dominio es una lista de criterios, cada criterio es un triplete (ya sea una lista o una tupla) de (nombre_campo, operador, valor) donde:

nombre_campo (str)
un nombre de campo del modelo actual, o una relación transversal a través de Many2one usando notación de puntos, p. 'street' o 'partner_id.country'

operador (str)

- Un operador de comparación entre el campo y el valor del criterio.
- Los operadores válidos son =,! =,>,> =, <, <=, Like, ilike, in, not in,  child_of, parent_left, parent_right

valor

- Tipo de variable, debe ser comparable (a través del operador) al campo nombrado
- Valor válido para comparar con los valores de field_name, según su tipo

Los criterios de dominio se pueden combinar utilizando operadores lógicos en forma de prefijo:
'&':AND lógico , operación predeterminada para combinar criterios que se siguen uno al otro.
'|': OR lógico
'!': NOT lógico

Consejo: Principalmente para negar combinaciones de criterios, los criterios individuales generalmente tienen una forma negativa 
(por ejemplo, = ->! =, <->> =) que es más simple que negar lo positivo.

Ejemplos

Para buscar socios llamados ABC, de México o Alemania, cuyo idioma no es el inglés:

[('name','=','ABC'),

('language.code','!=','en_US'),

'|',('country_id.code','=','mx'),

('country_id.code','=','de')]

Este dominio es interpretado como:

(name es 'ABC')

Y (language NO es inglés)

Y (country es México O Alemania)

Cómo escribir diferentes filtros de dominio

1- Condición simple en la programación Odoo:

si campo1 = 10

será escrito en odoo así:

domain = [('campo1', '=', 10)] # donde campo1 debe ser un campo en el modelo y 10 será el valor.

O

domain = [('campo1', '=', campo2)] # donde campo1 y campo2 deben ser los campos en el modelo.

 

1.1 - Condición AND

si campo1 = 5 y campo2 = 10

En el filtro de dominio Odoo, se escribirá como:

domain = [('campo1', '=', 5), ('campo2', '=', 10)]# donde campo1 y campo2 deben ser un campo en el modelo y 10 y 5 serán el valor.

O

domain = [('campo1', '=', campo3), ('campo2', '=', campo3)] # donde campo1, campo2 y campo3 deben ser los campos en el modelo.

Tenga en cuenta que si no especifica ninguna condición al principio, se aplicará la condición AND.

1.2 - Condición OR

si campo1 = 5 o campo2 = 10

En el filtro de dominio Odoo, se escribirá como:

domain = ['|', ('campo1', '=', 5), ('campo2', '=', 10)]

O

domain = ['|', ('campo1', '=', campo3), ('campo1', '=', campo3)]

2 - Condición compleja en la programación Odoo

2.1- Condición simple:

si campo1 = 5 o (campo2! = 10 y campo3 = 12)

En el filtro de dominio Odoo, se escribirá como:

domain = ['|', ('campo1', '=', 5), ('&', ('campo2', '!=', 10), ('campo3','=',12) )]

2.2- Condición compleja:

Como sabemos, Odoo utiliza la notación polaca para los filtros de dominio.
Si tenemos una condición como esa:( A OR B) AND ( C OR D OR E)
debe convertirse a la notación polaca como AND OR A B OR OR C D E De la siguiente manera:

Deberíamos comenzar por el carácter más a la derecha, es decir, el carácter ")".

InputPrefix_StackStack
   
)Empty)
EE)
ORE) OR
DED) OR
ORED) OR OR
CEDC) OR OR
(EDC OR OREmpty
ANDEDC OR ORAND
)EDC OR ORAND )
BEDC OR OR BAND )
OREDC OR OR BAND ) OR
AEDC OR OR B AAND ) OR
(EDC OR OR B A ORAND
EmptyEDC OR OR B A OR ANDEmpty

Ahora invirtiendo el resultado final en prefix_stack obtendremos

AND OR A B OR OR CDE    ## Como se espera

También puede usar el operador "in" en lugar de escribir tres tuplas separadas con el operador OR como

['&', ('field2', 'in', ['A', 'B']), ('state', 'in', ['open', 'closed', 'draft'])]

Y para verificar los diversos usos de los filtros de dominio en la lista de acciones de Configuración -> Acciones -> Acciones de ventana (Settings > Actions > Window Actions) (el modo desarrollador debe estar activado)

La manera más simple:

(1) Comience con el operador más externo y muévalo al inicio de la expresión.
"(Un operador B)" se convierte en "operador (A B)"
(2) Repita el paso 1 para cada expresión secundaria con un operador para mover.
"A (operador B C)" se convierte en "operador A (operador B C)" y luego "operador A (operador B C)"
(3) Retire todos los soportes
“Operador A (operador B C)” se convierte en “operador A operador B C”
SO para nuestro ejemplo: (A OR B) Y (C OR D OR E) lo convertiremos así:
- Según el paso (1) la expresión será:
Y (A O B) (C O D O E)
- Según el paso (2) la expresión será:
Lado izquierdo: Y (O A B) (C O D O E)
Lado exterior derecho: Y (O A B) (O C (D O E))
Lado interno derecho: Y (O A B) (O C (O D E))
- Según el paso (3) la expresión será (eliminar corchetes):
AND o A B o C o D E
- Según la sintaxis del dominio del abridor, este resultado se escribiría como:
[‘&’, ’|’, (A), (B), ’|’, (C), ‘|’, (D), (E)]
Nota: OpenERP usa la notación de pulido (prefijo), y también podemos usar la notación de pulido inverso (postfix) para escribir filtros de dominio.
Para más información: haga clic aquí
Y solo como ejemplo:
La expresión infija "(3 + 5) * (7 - 2)" se puede escribir así en RPN: 3 5 + 7 2 - *

Nota: La notación invertida es exactamente la misma, pero le permite resolver sin tener que ir y venir.

Uso de doodba para desarrollo de aplicaciones en Odoo