Los campos IntroducciĆ³n
Los
objetos pueden contener diferentes tipos de
campos. Esos
tipos se pueden dividir en tres categorĆas: los
tipos simples, tipos de relaciĆ³n y campos
funcionales. Los
tipos simples son enteros, reales, booleanos,
cadenas, etc ... ;
Los tipos de relaciĆ³n se utilizan para representar
relaciones entre objetos (one2one, one2many,
many2one). Campos
funcionales son campos especiales porque no se
almacenan en la base de datos pero calculan en
tiempo real dado otros campos de la vista.
AquĆ
estĆ” la cabecera del mĆ©todo de inicializaciĆ³n de
cualquier campo de la clase definida en Odoo (OpenERP) (como se puede ver en el server / bin /
OSV / fields.py):
Hay un
conjunto comĆŗn de parĆ”metros opcionales que estĆ”n
disponibles para la mayorĆa de los tipos de
campos:
change_default: | Ya sea o no el usuario puede definir valores por defecto en otros campos en funciĆ³n del valor de este campo. Estos valores por defecto deben ser definidos en la tabla ir.values. |
---|---|
help: | Una descripciĆ³n de cĆ³mo se debe utilizar el campo: mĆ”s y mĆ”s descriptivo que char . AparecerĆ” en la informaciĆ³n sobre herramientas cuando se pasa el ratĆ³n sobre el campo. |
ondelete: | CĆ³mo manejar las eliminaciones en un registro relacionado. Por default encontraremos el valor "ondelete". |
priority: | No se utiliza? |
readonly: | True si el usuario no puede editar este campo, de lo contrario False . |
required: | True si el campo debe tener un valor antes de que el objeto puede ser salvado, de lo contrario False . |
size: | El tamaƱo del campo en la base de datos: nĆŗmero de caracteres o dĆgitos. Para los campos de tipo Char. |
states: | Permite anular otros parĆ”metros para los estados especĆficos de este objeto. Acepta un diccionario con los nombres de los estados como claves y una lista de nombres / valores tuplas como los valores. Por ejemplo: states = {'done': [('readonly', True)]} |
char: | El nombre del campo como debe aparecer en una etiqueta o encabezado de la columna. Cadenas que contienen caracteres no ASCII deben utilizar objetos unicode de Python. Por ejemplo: 'test': fields.boolean (u'TestƩ ') |
translate: | True si el contenido de este campo debe ser traducido, de lo contrario False . |
TambiƩn hay
algunos parĆ”metros opcionales que son especĆficos
para algunos tipos de campos:
domain: |
RestricciĆ³n
de dominio en un campo relacional.
Valor
por defecto: [].
Ejemplo:
domain = [('campo', '=', valor)])
|
---|---|
invisible: |
Ocultar el
valor del campo en los formularios. Por
ejemplo, una contraseƱa.
|
on_change: |
El valor por
defecto para el on_change atributo
en la vista. Esto
abrirĆ” una funciĆ³n en el servidor cuando
los cambios en el campo en el cliente. Por
ejemplo, on_change
= "onchange_shop_id (shop_id)" .
|
related: |
Se utiliza
cuando un campo es una referencia a otra
tabla mediante su id. Este
es el nombre de la tabla para buscar el valor del campo. Por lo general se utiliza con los tipos de
campos relacionados y funciĆ³n.
|
selection: |
El
valor por defecto para la selecciĆ³n de
atributos en la vista. 1
significa bĆŗsqueda bĆ”sica y 2 medios de
bĆŗsqueda avanzada.
|
Tipo de Campos
Tipos bƔsicos
booleano: |
Un
booleano (true, false).
Sintaxis:
|
---|---|
integer: |
Un entero.
Sintaxis:
|
float: |
Un nĆŗmero
de punto flotante.
Sintaxis:
Nota
Los
dĆgitos parĆ”metro opcional define la
precisiĆ³n y la escala del nĆŗmero. La
escala es el nĆŗmero de dĆgitos despuĆ©s
del punto decimal, mientras que la
precisiĆ³n es el nĆŗmero total de
dĆgitos significativos en el nĆŗmero
(antes y despuƩs del punto decimal). Si
los dĆgitos parĆ”metro no estĆ”
presente, el nĆŗmero serĆ” un nĆŗmero de
punto flotante de doble precisiĆ³n. Advertencia:
estos nĆŗmeros en coma flotante son
inexactas (no cualquier valor puede
ser convertido a su representaciĆ³n
binaria) y esto puede dar lugar a
errores de redondeo. Siempre
se debe utilizar el parĆ”metro dĆgitos
para cantidades monetarias.
Ejemplo:
|
char: |
Una cadena
de longitud limitada. El
parƔmetro tamaƱo requerido determina su
tamaƱo.
Sintaxis:
Ejemplo:
|
text: |
Un campo
de texto sin lĆmite de longitud.
Sintaxis:
|
date: |
A la
fecha.
Sintaxis:
|
datetime: |
Permite
almacenar la fecha y la hora del dĆa en
el mismo campo.
Sintaxis:
|
binary: |
Una cadena
binaria
|
selection: |
Un campo
que permite al usuario hacer una
selecciĆ³n entre varios valores
predefinidos.
Sintaxis:
Nota
Formato
del parĆ”metro de selecciĆ³n: tupla de
tuplas de cadenas de la forma:
Nota
Usted
puede especificar la funciĆ³n que
devolverĆ” la tupla. Ejemplo
Ejemplo
El
uso de campos de relaciĆ³n many2one con la
selecciĆ³n . En
los campos de definiciones agregan:
Y
luego definir el _sel_func asĆ (pero
antes de las definiciones campos):
|
Tipos relacionales
one2one: |
Un campo
one2one expresa un uno: a: una relaciĆ³n
entre dos objetos. Se
ha quedado en desuso. Utilice
many2one lugar.
Sintaxis:
|
---|---|
many2one: |
Associates
este objeto a un objeto primario a
travƩs de este campo. Por
ejemplo, un empleado del Departamento
pertenece harĆa muchos a uno. es
decir, muchos empleados pertenecen a un
departamento
Sintaxis:
ParƔmetros
opcionales:
Ejemplo
|
one2many: |
TODO
Sintaxis:
Ejemplo
|
many2many: |
TODO
Sintaxis:
Ejemplo:
Para
que sea bidireccional (= crear un campo
en el otro objeto):
Ejemplo:
|
related: |
A veces es
necesario hacer referencia a la relaciĆ³n
de una relaciĆ³n. Por
ejemplo, supongamos que usted tiene
objetos: Ciudad -> Estado -> PaĆs,
y tiene que referirse al paĆs de una
ciudad, se puede definir un campo de la
siguiente manera en el objeto City:
|
Los campos funcionales
Un campo
funcional es un campo cuyo valor se calcula por
una funciĆ³n (en lugar de ser almacenado en la
base de datos).
ParƔmetros:
donde
- fnct es la funciĆ³n o el mĆ©todo que va a calcular el valor del campo. Debe de haber sido declarada antes de declarar el Ć”mbito funcional.
- fnct_inv es la funciĆ³n o mĆ©todo que le permitirĆ” escribir valores en ese campo.
- tipo es el nombre del tipo de campo devuelto por la funciĆ³n. Puede ser cualquier nombre de tipo de campo, excepto la funciĆ³n.
- fnct_search le permite definir el comportamiento de bĆŗsqueda en ese campo.
- method si el campo se calcula mediante un mĆ©todo (de un objeto) o una funciĆ³n global
- almacenar Si desea almacenar campo en la base de datos o no. El valor predeterminado es False.
- multi es un nombre de grupo. Todos los campos con el mismo varios parĆ”metros se calculan en una sola llamada de funciĆ³n.
fnct parƔmetro
Si el method es
cierto que la firma del mƩtodo debe ser:
de lo
contrario (si se trata de una funciĆ³n global),
su firma debe ser:
De
cualquier manera, debe devolver un diccionario
de valores de la forma {id'_1_
': value'_1_', id'_2_ ': value'_2_', ...}.
Los
valores del diccionario devuelto deben ser del
tipo especificado por el argumento de tipo en
la declaraciĆ³n del campo.
Si multi se ha
establecido, field_name se
sustituye por field_names : una
lista de los nombres de los campos que deben
ser calculados. Cada
valor en el diccionario devuelto es tambiƩn un
diccionario de nombre del campo de valor. Por
ejemplo, si los campos "Nombre" y "edad" estƔn
basados en la vital_statistics funciĆ³n,
el valor de retorno de vital_statistics podrĆa
tener este aspecto cuando ids es [1,
2, 5] :
parƔmetro fnct_inv
Si el mƩtodo es
cierto, la firma del mƩtodo debe ser:
de lo
contrario (si se trata de una funciĆ³n global),
que debe ser:
parƔmetro fnct_search
Si el
method es True, la firma del mƩtodo debe
ser:
de lo
contrario (si se trata de una funciĆ³n global),
que debe ser:
El valor
de retorno es una lista que contiene las
tuplas de 3 partes que se utilizan en funciĆ³n
de la bĆŗsqueda:
obj es el
mismo que 1
mismo , y el nombre recibe
el nombre de campo. args es una
lista de tuplas 3-parte que contiene criterios
de bĆŗsqueda para este campo, a pesar de la
funciĆ³n de bĆŗsqueda puede activarse por
separado para cada tupla.
Ejemplo
Supongamos
que creamos un objeto de contrato, que es:
Si
queremos aƱadir un campo que recupera la
funciĆ³n de un empleado por mirar de su
contrato actual, se utiliza un campo
funcional. El
hr_employee objeto se hereda de esta manera:
Nota
tres
puntos
- tipe = 'many2one' se debe a que el campo de la funciĆ³n debe crear un campo many2one; funciĆ³n se declara como many2one en hr_contract tambiĆ©n.
- obj = "res.partner.function" se utiliza para indicar que el objeto que se utilizarĆ” para el campo many2one es res.partner.function.
- Llamamos a nuestro mĆ©todo _get_cur_function_id porque su funciĆ³n es devolver un diccionario cuyas claves son identificadores de los empleados, y cuyos valores correspondientes son los identificadores de la funciĆ³n de esos empleados. El cĆ³digo de este mĆ©todo es:
El
identificador de la funciĆ³n se recupera
mediante una consulta SQL. Tenga
en cuenta que si la consulta no devuelve
ningĆŗn resultado, el valor de sql_res
['id_funciĆ³n'] serĆ” Ninguno. Nos
forzamos el valor False en este caso, ya que
el valor XML: RPC (comunicaciĆ³n entre el
servidor y el cliente) no permite transmitir
este valor.
ParƔmetro Store
Se
calcularĆ” el campo y almacenar el resultado en
la tabla. El
campo se vuelve a calcular cuando ciertos
campos se cambian en otros objetos. Se
utiliza la siguiente sintaxis:
Se
llamarĆ” a la funciĆ³n nombre_funcion cuando los
cambios se escriben en los campos en la lista
['campo1', 'campo2'] en 'object_name' objeto.La
funciĆ³n debe tener la siguiente firma:
Cuando identificadores serƔn
los identificadores de registros de la tabla
del otro objeto que han cambiado los valores
en los campos observados.La
funciĆ³n debe devolver una lista de los
identificadores de los registros de su propia
tabla que debe tener el campo vuelve a
calcular. Dicha
lista se enviarƔ como un parƔmetro para la
funciĆ³n principal del campo.
He aquĆ
un ejemplo del mĆ³dulo de afiliaciĆ³n:
Campos Property (Propiedad)
- Declarar una propiedad
Una
propiedad es un campo especial: fields.property.
Entonces
usted tiene que crear el valor por defecto en un
archivo XML para esta propiedad.:
Si el
valor por defecto apunta a un recurso de otro
mĆ³dulo, puede usar la funciĆ³n de Ć”rbitro de
esta manera:
<field
name="value"
eval="'product.pricelist,'+str(ref('module.data_id'))"/>
Property en Vistas Form.
Para
agregar propiedades en las formas, sĆ³lo hay que
poner la etiqueta <properties/> en su
formulario. Esto
agregarƔ automƔticamente todos los campos de
propiedades que estƔn relacionados con este
objeto. El
sistema agregarĆ” propiedades en funciĆ³n de sus
derechos. (Algunas
personas serƔn capaces de cambiar una propiedad
especĆfica, otros no).
Las
propiedades se muestran en la secciĆ³n,
dependiendo del atributo nombre_grupo. (Se
representa en el cliente como una etiqueta
separador).
¿CĆ³mo
funciona esto?
La clase
fields.property hereda de fields.function y
reemplaza el mƩtodo de lectura y escritura. El
tipo de este campo es many2one, por lo que en la
forma de una propiedad se representa como una
funciĆ³n many2one.
Pero el
valor de una propiedad se almacena en la clase
ir.property / table como un registro completo. El
valor almacenado es un campo de referencia de
tipo (no many2one), ya que cada establecimiento
puede apuntar a un objeto diferente. Si
modifica los valores de las propiedades (en el
menĆŗ de administraciĆ³n), se representan como un
campo de referencia de tipo.
Cuando se
lee una propiedad, el programa le da la
propiedad asociado con la instancia de objeto
que estĆ” leyendo. Si
este objeto no tiene valor, el sistema le darĆ”
la propiedad predeterminada.
La
definiciĆ³n de una propiedad se almacena en la
clase ir.model.fields como cualquier otro campo. En
la definiciĆ³n de la propiedad, puede agregar
grupos que tienen permiso para cambiar a la
propiedad.
UtilizaciĆ³n
de las propiedades o campos normales
Si desea
aƱadir una nueva caracterĆstica, tendrĆ” que
optar por aplicar como una propiedad o terreno
normal. Utilice
un campo normal cuando se hereda de un objeto y
quiere extender este objeto. Utilice
una propiedad cuando la nueva funciĆ³n no estĆ”
relacionada con el objeto, sino a un concepto
externo.
AquĆ hay
algunos consejos para ayudarle a elegir entre un
campo normal o una propiedad:
Campos
normales ampliar el objeto, la adiciĆ³n de mĆ”s
caracterĆsticas o datos.
Una
propiedad es un concepto que se adjunta a un
objeto y tienen caracterĆsticas especiales:
- Valor diferente para la misma propiedad en funciĆ³n de la empresa
- La gestiĆ³n de derechos por campo
- Es un vĆnculo entre los recursos (many2one)
Ejemplo
1: Cuentas por cobrar
La "Cuenta
por cobrar" por defecto de pareja se implementa
como una propiedad porque:
- Este es un concepto relacionado con la tabla de cuenta y no a la pareja, por lo que es una propiedad de cuenta de que es visible en una forma pareja. Derechos tienen que ser manejados en este campo para los contables, estos no son los mismos derechos que se aplican a los objetos asociados. AsĆ que usted tiene derechos especĆficos sĆ³lo para este campo de forma pareja: sĆ³lo los contadores pueden cambiar la cuenta por cobrar de un socio.
- Este es un campo multi-empresa: la misma pareja puede tener diferentes valores de cuentas por cobrar en funciĆ³n de la empresa que pertenece el usuario. En un sistema multi-empresa, hay una carta cuenta por la empresa. La cuenta por cobrar de una pareja depende de la empresa que realizĆ³ el pedido de venta.
- La cuenta por cobrar por defecto es el mismo para todos los socios y se configura desde el menĆŗ general de la propiedad (en la administraciĆ³n).
Nota
Una cosa
interesante es que las propiedades evitan
cĆ³digo "spaghetti". El
mĆ³dulo cuenta depende del mĆ³dulo pareja
(base). Pero
se puede instalar el mĆ³dulo pareja (base) sin
el mĆ³dulo de contabilidad. Si
agrega un campo que apunta a una cuenta en el
objeto de pareja, ambos objetos dependerƔn de
los demƔs. Es
mucho mĆ”s difĆcil de mantener y cĆ³digo (por
ejemplo, tratar de eliminar una tabla cuando
ambas tablas estƔn apuntando a los demƔs.)
Ejemplo
2: Tiempos de productos
El mĆ³dulo
de caducidad del producto implementa todas las
demoras relacionadas con los productos: Fecha de
retiro, usetime producto, ... Este
mĆ³dulo es muy Ćŗtil para las industrias de
alimentos.
En este
mĆ³dulo se hereda del objeto product.product y
aƱade nuevos campos a la misma:
Este
mĆ³dulo agrega campos simples al objeto
product.product. No
usamos las propiedades debido a que:
- Extendemos un producto, el campo life_time es un concepto relacionado con un producto, no a otro objeto.
- No necesitamos una gestiĆ³n correcta por campo, los diferentes retardos son gestionados por las mismas personas que manejan todos los productos.
GermĆ”n, cuidadĆn al traducir de forma automĆ”tica!!
ResponderBorrarComo pongas "cataratas" en lugar de "cascade" al definir un campo, ya verƔs que tortazo.
ParƔmetro "tienda", otra mƔs. Es "store" y punto.
Los campos de tipo propiedad no existen, son de tipo "property".
En fin, hay que darle un repaso :-)
Un saludo,
Juan