Nueva Notacion para Domain

Revisando el codigo, me encontre con algomuy interesante sobre las expresiones y nuevas notaciones aceptadas en openobject, en especial con los dominios.

La notacion anterior era (aun soportada) una tupla con 3 elementos:

un campo, un operador, un valor.

Ahora usan la notacion con el operador como prefijo[1], entonces los operadores soportados son AND, OR y NOT (&, |, !), con aridad 2 los primeros y aridad 1 el NOT (se aplica AND por defecto).

Entonces como seria lo nuevo?

['&', ('active', '=', True), ('value', '!=', 'foo')]
['|', ('active', '=', True), ('state', 'in', ['open', 'draft'])
['&', ('active', '=', True), '|', '!', ('state', '=', 'closed'), ('state', '=', 'draft')]
['|', '|', ('state', '=', 'open'), ('state', '=', 'closed'), ('state', '=', 'draft')]
['!', '&', '!', ('id', 'in', [42, 666]), ('active', '=', False)]

Talves el ejemplo con su traduccion en SQL para aclarar su funcionamiento:

[('foo', '=', 'bar')]
foo = 'bar'

[('id', 'in', [1,2,3])]
id in (1, 2, 3)

[('field', '=', 'value'), ('field', '<>', 42)]
( field = 'value' AND field <> 42 )

[('&', ('field', '<', 'value'), ('field', '>', 'value'))]
( field < 'value' AND field > 'value' )

[('|', ('field', '=', 'value'), ('field', '=', 'value'))]
( field = 'value' OR field = 'value' )

[('&', ('field1', '=', 'value'), ('field2', '=', 'value'), ('|', ('field3', '<>', 'value'), ('field4', '=', 'value')))]
( field1 = 'value' AND field2 = 'value' AND ( field3 <> 'value' OR field4 = 'value' ) )

[('&', ('|', ('a', '=', 1), ('b', '=', 2)), ('|', ('c', '=', 3), ('d', '=', 4)))]
( ( a = 1 OR b = 2 ) AND ( c = 3 OR d = 4 ) )

[('|', (('a', '=', 1), ('b', '=', 2)), (('c', '=', 3), ('d', '=', 4)))]
( ( a = 1 AND b = 2 ) OR ( c = 3 AND d = 4 ) )

Espero les sea de mucha utilidad.

Tomado de: http://christophe-simonis-at-tiny.blogspot.com/2008/08/new-new-domain-notation.html

[1]http://en.wikipedia.org/wiki/Polish_notation

3 comentarios en “Nueva Notacion para Domain

  1. Liebana dijo:

    Hola Cristian,

    Relacionado con las notaciones de los dominos, tenemos un problema sobre el cual te estariamos eternamente agradecido si nos pudieras ayudar.

    La cosa está explicada mejor aqui http://www.openobject.com/forum/viewtopic.php?p=35782#35782 , queremos que a la hora de realizar un pedido tanto te compra como de venta, al pulsar sobre “nuevo producto” a añadir, unicamente nos aparezcan los productos del determinado partner que hemos elegido para ese pedido.

    Es decir, definimos en la pestaña “Proveedores” de los productos, los proveedores que corresponden a cada producto y luego queremos que al elegir el proveedore en el formulario de pedido, nos aparezcan únicamente sus productos.

    Para ello, y siguiendo el hilo del foro, definimos

    domain=”[(‘seller_ids’,’=’,parent.partner_id)]” ,

    lo que funciona en la versión 4.2 pero no en la 5, devolviendonos el error que hemos señalado en el foro “TypeError: ‘int’ object is not iterable “.

    Si nos pudieras echar una mano, estaríamos eternamente agradecidos.

    Un saludo y felicidades por tu blog!

    • Lo que sucede es que esta tratando de usar el partner_id (que es un entero), como una lista, si revisas el post tienes una respuesta que resolvera tu problema.

      Avisame que sucede :-)

      • Liebana dijo:

        Hola,

        Na, sigue sin funcionar. Lo que decían en la respuesta del post, efectivamente transformaba en una lista “partner_id”, pero no devolvía ningún valor porque “seller_ids” (el primer campo con el que comparamos) es el id de la tabla “product_supplierinfo” pero lo que realmente necesitas es el campo “name” de esta tabla para comparar con partner_id…

        Conclusión, que para algo aparentemente sencillo, seguimos igual :(

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s