Vous êtes sur la page 1sur 20

Objetos, campos y mtodos

Objetos OpenERP
Todos los elementos de datos del ERP son accesibles a travs de "objetos". Como
ejemplo, hay un objeto res.partner para acceder a los datos relativos a los socios, un
objeto account.invoice para los datos relativos al facturas, etc ...
Tenga en cuenta que hay un objeto para cada tipo de recurso y no un objeto por recurso.
Tenemos as un objeto res.partner para gestionar todos los socios y no un res.partner
objeto por socio. Si hablamos en trminos "orientado a objetos", tambin podramos
decir que hay un objeto por nivel.
Las consecuencias directas es que todos los mtodos de los objetos tienen un parmetro
comn: el parmetro "ids". Esto especifica en el que se deben aplicar el mtodo de los
recursos. Precisamente, este parmetro contiene una lista de identificadores de recursos
sobre los que se debe aplicar el mtodo.
Por ejemplo, si tenemos dos socios con los identificadores de 1 y 5, y queremos llamar al
mtodo "send_email" de res_partner, vamos a escribir algo como:
res_partner.send_email (..., [1, 5], ...)

En la siguiente seccin, veremos cmo definir un nuevo objeto. Entonces, vamos a ver los
diferentes mtodos de hacer esto.
Para los desarrolladores:
OpenERP "objetos" se suele denominar clases en la programacin orientada a
objetos.
Un OpenERP "recurso", por lo general, se llama a un objeto en la programacin
OO, instancia de una clase.
Es un poco confuso cuando se intenta programar dentro de OpenERP, porque el lenguaje
utilizado es Python y Python es un lenguaje totalmente orientado a objetos, y tiene
objetos e instancias ...
Por suerte, un "resource" OpenERP se puede convertir por arte de magia en un bonito
objeto Python utilizando el mtodo de la clase "browse" (mtodo de objeto OpenERP).

El ORM - mapeo objeto-relacional - Modelos


El ORM, acrnimo de Object-Relational Mapping, es una parte central de OpenERP.
En OpenERP, el modelo de datos se describe y se manipula a travs de clases de Python y
de sus objetos. Es el trabajo ORM para establecer un puente - la forma ms transparente
posible para el desarrollador - entre Python y la base de datos relacional subyacente
(PostgreSQL), que proporcionar la persistencia que necesitamos para nuestros objetos.

Atributos OpenERP Objeto


fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

Objetos Introduccin
Para definir un nuevo objeto, debe definir una nueva clase Python para despus
instanciarlo. Esta clase debe heredar de la clase OSV en el mdulo osv.

Objeto definicin
La primera lnea de la definicin del objeto siempre ser de la forma:
clase name_of_the_object (OSV.osv:)
_name = 'name.of.the.object'
_columns = {...}
...
name_of_the_object ()

Un objeto se define declarando algunos campos con nombres predefinidos en la clase.


Dos de ellos estn obligados (_name y _columns), el resto son opcionales. Los campos
predefinidos son:

Campos predefinidos
_auto
Determina si una tabla de PostgreSQL correspondiente se debe generarse
automticamente del objeto. La configuracin _auto = 'False' puede ser til en caso de
objetos OpenERP generados a partir de vistas de PostgreSQL.
_columns (requerido)
Los campos de objeto. Ver seccin Fields para ms detalles.
_constraints
Las restricciones sobre el objeto. Vea la seccin de limitaciones para ms detalles.
_sql_constraints
La restriccin de SQL en el objeto. Vea la seccin de limitaciones de SQL para obtener
ms detalles.
_defaults
Los valores predeterminados para algunos de los campos del objeto. Vea la seccin de
valor por defecto para los detalles.
_inherit
El nombre del objeto osv que el objeto actual hereda. Vea la seccin de objetos de
herencia (primera forma) para ms detalles.

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

_inherits
La lista de objetos osv el objeto hereda de. Esta lista se debe dar en un diccionario python
de la forma: {'name_of_the_parent_object': 'name_of_the_field', ...}. Vea la seccin de
objetos de herencia (segunda forma) para ms detalles. Valor por defecto: {}.
_log_access
Determina los permisos del recurso al iniciar sesin. Si es verdad, cuatro campos se
crearn en la tabla de SQL: create_uid, create_date, write_uid, write_date. Esos campos
representan, respectivamente, el ID del usuario que cre el registro, la fecha de creacin
del registro, el identificador del usuario que modific por ltima vez el registro y la fecha
de la ltima modificacin. Estos datos pueden obtenerse utilizando el mtodo
perm_read.
_name (requerido)
Nombre del objeto. Valor predeterminado: Ninguno.
_order
Nombre de los campos utilizados para ordenar los resultados de los mtodos bsqueda y
lectura.
Valor por defecto: 'id'.
Ejemplos:
_order = "name"
_order = "date_order desc"

_rec_name
Nombre del campo en el que el nombre de cada recurso se almacena. Valor por defecto:
"name". Nota: por defecto, el mtodo name_get simplemente devuelve el contenido de
este campo.
_sequence
Nombre de la secuencia SQL que gestiona los identificadores para este objeto. Valor
predeterminado: Ninguno.
_sql
Cdigo SQL ejecutado sobre la creacin del objeto (slo si _auto es verdadera). Significa
que este cdigo es ejecutado despus de crear la tabla.
_table
Nombre de la tabla de SQL. Valor por defecto: el valor del campo _name anterior con los
puntos reemplazada por guiones bajos (_) (.).

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

Herencia de Objetos - _inherit


Introduccin
Los objetos pueden ser heredados de mdulos comunes o de mdulos especficos. Se
utiliza para heredar un objeto para agregar y/o modificar algunos campos.
Se realiza con:
_inherit = 'object.name'

Extensin de un objeto
Hay dos formas posibles de hacer este tipo de herencia. Ambas formas dan como
resultado una nueva clase de datos, que tiene campos de padres y mtodos, as como
campos adicionales y comportamiento propio, pero difieren en resultados diferentes del
programa al ser ejecutados.
Mientras Ejemplo 1 crea una nueva subclase "custom_material" que pueden ser
"heredada" o "usada" por cualquier vista o un rbol que se ocupa de "network.material",
ste no ser el caso para el Ejemplo 2.
Esto se debe a la tabla (other.material) la nueva subclase est operando en, que nunca
ser reconocido por las opiniones anteriores "network.material" o rboles.
Ejemplo 1:
class custom_material(osv.osv):
_name = 'network.material'
_inherit = 'network.material'
_columns = {
'manuf_warranty': fields.boolean('Manufacturer warranty?'),
}
_defaults = {
'manuf_warranty': lambda *a: False,
}
custom_material()

aviso
_name == _inherit
En este ejemplo, el 'custom_material' aadir un nuevo campo 'manuf_warranty' al
objeto 'network.material'. Nuevas instancias de esta clase sern visibles por los puntos de
vista o rboles que operan en la mesa superclases 'network.material'.
Este inheritancy se suele llamar "la herencia de clases" en el diseo orientado a objetos.
El nio hereda de datos (campos) y el comportamiento (funciones) de su padre.

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

Ejemplo 2:
class other_material(osv.osv):
_name = 'other.material'
_inherit = 'network.material'
_columns = {
'manuf_warranty': fields.boolean('Manufacturer warranty?'),
}
_defaults = {
'manuf_warranty': lambda *a: False,
}
other_material()

aviso
_name != _inherit
En este ejemplo, el 'other_material' llevar a cabo todos los campos especificados por
'network.material' y, adems, llevar a cabo un nuevo campo 'manuf_warranty'. Todos
los campos sern parte de la tabla 'other.material'. Nuevos casos de esta clase, por lo
tanto nunca han visto por opiniones o rboles que operan en la mesa superclases
'network.material'.
Este tipo de inheritancy se conoce como "herencia de prototipos" (por ejemplo
Javascript), debido a que las subclases de "copias" de nueva creacin todos los campos de
la superclase especificado (prototipo). El hijo hereda de los datos (campos) y el
comportamiento (funciones) de su padre.

La herencia selectiva de objetos - _inherits


Sintaxis::
tiny_object clase (osv.osv)
_name = 'tiny.object'
_table = 'tiny_object'
_inherits = {
'tiny.object_a': 'object_a_id',
'tiny.object_b': 'object_b_id',
...,
'tiny.object_n': 'object_n_id'
}
(...)

El objeto 'tiny.object' hereda de todas las columnas y todos los mtodos de los n objetos
'tiny.object_a', ..., 'tiny.object_n'.
Para heredar de varias tablas, la tcnica consiste en aadir una columna a la tiny_object
tabla por objeto heredado. En esta columna se almacenar una clave externa (un id de
otra tabla). Los valores 'object_a_id' 'object_b_id' ... 'object_n_id' son de tipo cadena y
determinar el ttulo de las columnas en las que las claves externas de 'tiny.object_a', ...,
'tiny.object_n' se almacenan.
Este mecanismo de herencia se suele llamar "la herencia ejemplo" o "la herencia de
valor". Un recurso (ejemplo) tiene los valores de sus padres.

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

Los campos Introduccin


Los objetos pueden contener diferentes tipos de campos. Esos tipos se pueden dividir en
tres categoras: tipos simples, tipos de relaciones y campos funcionales. Los tipos simples
son enteros, flotadores, booleanos, cadenas, etc ...; Los tipos de relacin 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 mtodo de inicializacin de la clase cualquier campo definido en
OpenERP hereda (como se puede ver en el server / bin / osv / fields.py):
def __init __ (self, cadena = "desconocido", requerido = False, readonly = False,
domain = Ninguno, context = "", afirma = Ninguno, priority = 0, change_default
= False, size = Ninguno,
onDelete = "conjunto vaco", traducir = False, seleccione = False, ** args):

Hay un conjunto comn de parmetros opcionales que estn disponibles para la mayora
de los tipos de campo:
change_default: Sea o no el usuario puede definir valores por defecto en otros campos,
dependiendo del valor de este campo. Esos valores por defecto deben ser
definidos en la tabla ir.values.
help:
Una descripcin de cmo el campo se debe utilizar: mucho ms descriptivo
que cadena. Aparecer en una informacin sobre herramientas cuando el
ratn pasa sobre el campo.
ondelete:
Cmo manejar deleciones en un registro relacionado. Los valores permitidos
son: 'restringir', 'no accin', 'cascada', 'conjunto vaco "y" predeterminado ".
priority:
No utilizado?
readonly:
Verdadero si el usuario no puede editar este campo, de lo contrario False.
sequired:
Verdadero si este campo debe tener un valor antes de que el objeto puede ser
salvado, de lo contrario False.
size:
El tamao del campo en la base de datos: caracteres numricos o dgitos.
establece lo
Le permite anular otros parmetros para estados especficos de este objeto.
siguiente:
Acepta un diccionario con los nombres de estado como llaves y una lista de
tuplas de nombre / valor como los valores. Por ejemplo: estados =
{'publicado': [('slo lectura', True)]}
cuerda:
El nombre del campo como debe aparecer en un encabezado de etiqueta o
columna. Cuerdas que contienen caracteres no ASCII deben utilizar objetos
Unicode Python. Por ejemplo: 'probado': fields.boolean (u'Test ')
translate:
Verdadero si el contenido de este campo debe ser traducido, de lo contrario
False.
Tambin hay algunos parmetros opcionales que son especficos para algunos tipos de
campos:
context:
Definir el valor de una variable visible en el contexto de la vista o una
funcin en el cambio. Se utiliza en la bsqueda de la tabla secundaria
one2many relacin?
domain:
Restriccin de dominio en un campo relacional.
Valor por defecto: [].
Ejemplo: domain = [('campo', '=', valor)])
invisible: Ocultar el valor del campo en formas. Por ejemplo, una contrasea.
on_change: El valor por defecto para el on_change atributo en la vista. Esto abrir
una funcin en el servidor cuando el campo cambia en el cliente. Por

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

relation:
selected:

ejemplo, on_change = "onchange_shop_id (shop_id)".


Se utiliza cuando un campo es una referencia de Identificacin a otra
mesa. Este es el nombre de la tabla a mirar en. Lo ms comn es utilizar
con tipos de campos relacionados y funcin.
El valor por defecto para el selecto atributo en la vista. 1 significa
bsqueda bsica y 2 significa bsqueda avanzada.

Tipo de Campos
Tipos bsicos
boolean:

Un booleano (verdadero, falso).


Sintaxis:
fields.boolean ('Nombre de campo' [, Parmetros Opcional]),

integer:

Un entero.
Sintaxis:
fields.integer ('Nombre de campo' [, Parmetros Opcional]),

float:

Un nmero de coma flotante.


Sintaxis:
fields.float ('Nombre de campo' [, Parmetros Opcional]),

Nota
Los dgitos de los parmetros opcionales define la precisin y escala del
nmero. La escala es el nmero de dgitos despus del punto mientras que la
precisin decimal es el nmero total de dgitos significativos en el nmero
(antes y despus del punto decimal). Si los dgitos parmetro no est presente,
el nmero ser un nmero de coma flotante de doble precisin. Advertencia:
estos nmeros de punto flotante son inexactas (no cualquier valor puede
convertirse a su representacin binaria) y esto puede dar lugar a errores de
redondeo. Siempre se debe utilizar el parmetro dgitos para importes
monetarios.
Ejemplo:
'tasa': fields.float (
'Relativa tasa de cambio ",
dgitos = (12,6) [,
Parmetros opcionales]),

char:

Una cadena de longitud limitada. El parmetro tamao requerido

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

determina su tamao.
Sintaxis:
fields.char (
'Nombre del campo',
size = n [,
Parmetros opcionales]), #, donde '' n '' es un nmero entero.

Ejemplo:
'ciudad': fields.char ('Nombre de la ciudad ", tamao = 30, requerida =
True),

text:

Un campo de texto sin lmite de longitud.


Sintaxis:
fields.text ('Nombre de campo' [, Parmetros Opcional]),

date:

Una cita.
Sintaxis:
fields.date ('Nombre de campo' [, Parmetros opcionales]),

datetime:

Permite almacenar una fecha y el momento del da en el mismo campo.


Sintaxis:
fields.datetime ('Nombre de campo' [, Parmetros opcionales]),

binary:
selection:

Una cadena binaria


Un campo que permite al usuario hacer una seleccin entre varios valores
predefinidos.
Sintaxis:
fields.selection ((('n', 'no confirmada'), ('c', 'Confirmado')),
'Nombre del campo' [, Parmetros Opcional]),

Nota
Formato del parmetro de seleccin: tupla de tuplas de cadenas de la forma:
(('Key_or_value', 'string_to_display'), ...)

Nota

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

Puede especificar una funcin que devolver la tupla. Ejemplo


def _get_selection (auto, cursor, user_id, contexto = None):
retorno
(('Choice1', 'Esta es la opcin 1'),
('eleccin2', 'Esta es la opcin 2'))
_columns =
{'sel': campos. seleccin
(_get_selection,
'Qu
quieres?')}

Ejemplo
Campos de relacin Uso many2one con la seleccin. En los campos de
las definiciones agregan:
...,
'my_field': fields.many2one (
'mymodule.relation.model',
'Ttulo',
seleccin = _sel_func),
...,

Y luego definir el _sel_func as (pero antes de las definiciones de los


campos):
def _sel_func ( self , cr , uid , context = None ):
obj = self . pool . get ( 'mymodule.relation.model' )
ids = obj . search ( cr , uid , [])
res = obj . read ( cr , uid , ids , [ 'name' , 'id' ], context )
res = [( r [ 'id' ], r [ 'name' ]) for r in res ]
return res

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

Tipos relacionales
one2one:

Un campo one2one expresa una: a: un relacin entre dos objetos. Se


est en desuso. Utilice many2one lugar.
Sintaxis:
campos. one2one ('other.object.name', 'Nombre del campo')

many2one:

Associates este objeto a un objeto padre a travs de este campo. Por


ejemplo Departamento un Empleado pertenece hara Muchos a uno. es
decir Muchos empleados pertenecern a un Departamento
Sintaxis:
fields.many2one (
'other.object.name',
'Nombre del campo',
parmetros opcionales)

Parmetros opcionales:
ondelete: Qu debe suceder cuando el recurso puntos este
campo para se elimina.
Valor predefinido: "cascada", "conjunto vaco",
"restringir", "no accin", "conjunto predeterminado"
Valor por defecto: "null set"
requerido: True
readonly: True
seleccione: True - (crea un ndice en el campo de clave externa)
Ejemplo
"comercial": fields.many2one (
'res.users',
'Comercial',
ondelete = "en cascada"),

one2many:

HACER
Sintaxis:
fields.one2many (
'other.object.name',
'El campo Identificacin relacin',
'Nombre del campo',
parmetro opcional)

Parmetros opcionales:
invisible: Verdadero / Falso

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

afirma:?
readonly: Verdadero / Falso

Ejemplo
'direccin': fields.one2many (
'res.partner.address',
'identificacin del socio',
"Contactos"),

Many2Many: HACER
Sintaxis:
campos. Many2Many ('other.object.name',
'objeto relacin',
'actual.object.id',
'other.object.id',
'Nombre de campo')

Dnde:
other.object.name es el otro objeto que pertenece a la relacin
relacin de objeto es la tabla que hace el enlace
actual.object.id y other.object.id son los nombres de los campos
de los utilizados en la tabla de relacin
Ejemplo:
'category_ids':
fields.many2many (
'res.partner.category',
'res_partner_category_rel',
'identificacin del socio',
'category_id',
'Categoras'),

Para que sea bidireccional (= crear un campo en el otro objeto):


class other_object_name2 ( osv . osv ):
_inherit = 'other.object.name'
_columns = {
'other_fields' : fields . many2many (
'actual.object.name' ,
'relation objeto ','
actual.object.id ','
other.object.id ','
Otro Nombre de campo
'),}
other_object_name2 ()

Ejemplo:
class res_partner_category2 ( osv . osv ):
_inherit = 'res.partner.category'

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

_columns = {
'partner_ids' : fields . many2many (
'res.partner' ,
'res_partner_category_rel' ,
'category_id' ,
'partner_id' ,
'Partners' ),
}
res_partner_category2 ()

related:

A veces es necesario hacer referencia a la relacin de una relacin. Por


ejemplo, supongamos que usted tiene objetos: Ciudad -> Estado -> Pas,
y lo que necesita para hacer referencia al pas de una ciudad, se puede
definir un campo como a continuacin en el objeto Ciudad:
'country_id': fields.related (
'state_id',
'country_id',
type = "many2one",
relacin = "res.country",
cadena = "Pas",
store = False)

Dnde:
El primer conjunto de parmetros son la cadena de campos de
referencia a seguir, con el campo deseado al final.
tipo es el tipo de campo que se desee.
Utilice relacin si el campo deseado sigue siendo una especie de
referencia. Relacin es la tabla para buscar esa referencia en.

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

Los campos funcionales


Un campo funcional es un campo cuyo valor se calcula mediante una funcin (en lugar de
ser almacenado en la base de datos).
Parmetros:
fnct, arg = Ninguno, fnct_inv = Ninguno, fnct_inv_arg = Ninguno, type = "float",
fnct_search = Ninguno, obj = Ninguno, method = False, almacenar = False, multi =
False

dnde
fnct es la funcin o el mtodo que va a calcular el valor del campo. Debe de haber
sido declarado antes de declarar el mbito funcional.
fnct_inv es la funcin o mtodo que permitir a los valores de escritura en ese
campo.
tipo es el nombre del tipo de campo devuelto por la funcin. Puede ser cualquier
nombre de tipo de campo, excepto la funcin.
fnct_search le permite definir el comportamiento de bsqueda en ese campo.
mtodo si el campo es calculada por un mtodo (de un objeto) o una funcin
global
almacenar Si desea almacenar campo en la base de datos o no. El valor
predeterminado es False.
mltiples es un nombre de grupo. Todos los campos con el mismo mltiples
parmetros se calcularn en una sola llamada de funcin.

parmetro fnct
Si el mtodo es cierto que la firma del mtodo debe ser:
def fnct (self, cr, uid, ids, field_name, arg, contexto):

de lo contrario (si se trata de una funcin global), su firma debe ser:


def fnct (cr, mesa, identificadores, field_name, arg, contexto):

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

De cualquier manera, debe devolver un diccionario de los valores de la forma {id'_1_ ':
value'_1_', id'_2_ ': value'_2 _', ...}.
Los valores del diccionario regresado deben ser del tipo especificado por el tipo de
argumento en la declaracin de campo.
Si mltiples se establece, entonces 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 tambin un diccionario de nombre de campo de valor. Por ejemplo, si los
campos "Nombre" y "edad"estn basados en la vital_statistics funcin, entonces el valor
de retorno de vital_statistics podra tener este aspecto cuando ids es [1, 2, 5]:
{

1: {'nombre': 'Bob', "edad": 23},


2: {"nombre": "Sally," edad ", 19},
5: {'nombre': 'Ed', "edad": 62}

parmetro fnct_inv
Si el mtodo es cierto, la firma del mtodo debe ser:
def fnct (self, cr, uid, ids, field_name, FIELD_VALUE, arg, contexto):

en caso contrario (si se trata de una funcin global), que debe ser:
def fnct (cr, mesa, identificadores, field_name, FIELD_VALUE, arg, contexto):

parmetro fnct_search
Si el mtodo es cierto, la firma del mtodo debe ser:
fnct def (self, cr, uid, obj, nombre, args, contexto):

en caso contrario (si se trata de una funcin global), que debe ser:
def fnct (cr, uid, obj, nombre, args, contexto):

El valor de retorno es una lista que contiene 3 partes tuplas que se utilizan en funcin de
bsqueda:
volver [('id', 'en', [1, 3, 5])]

obj es igual que uno mismo, y nombre recibe el nombre del campo. args es una lista de
tuplas de 3 partes que contienen criterios de bsqueda para este campo, aunque la
funcin de bsqueda puede ser llamado por separado para cada tupla.

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

Ejemplo
Supongamos que creamos un objeto de contrato que es:
class hr_contract ( osv . osv ):
_name = 'hr.contract'
_description = 'Contract'
_columns = {
'name' : fields . char ( 'Contract Name' , size = 30 , required = True ),
'employee_id' : fields . many2one ( 'hr.employee' , 'Employee' , required = True ),
'function' : fields . many2one ( 'res.partner.function' , 'Function' ),
}
hr_contract ()

Si queremos aadir un campo que recupera la funcin de un empleado por mirar de su


actual contrato, utilizamos un campo funcional. El hr_employee objeto se hereda de esta
manera:
class hr_employee ( osv . osv ):
_name = "hr.employee"
_description = "Employee"
_inherit = "hr.employee"
_columns = {
'contract_ids' : fields . one2many ( 'hr.contract' , 'employee_id' , 'Contracts' ),
'function' : fields . function (
_get_cur_function_id ,
type = 'many2one' ,
obj = "res.partner.function" ,
method = True ,
string = 'Contract Funcin
'),}
hr_employee ()

Nota
tres puntos
escriba = 'many2one' se debe a que el campo de funcin debe crear un campo
many2one; funcin se declara como un many2one en hr_contract tambin.
obj = "res.partner.function" se utiliza para especificar que el objeto que se utilizar
para el campo many2one es res.partner.function.
Llamamos a nuestro mtodo _get_cur_function_id porque su papel es el de devolver
un diccionario cuyas claves son identificadores de los empleados, y cuyos valores
correspondientes son los identificadores de la funcin de esos empleados. El cdigo de este
mtodo es:
def _get_cur_function_id (auto, cr, uid, identificadores, field_name, arg, contexto):
para i en identificadores:
#get el id de la funcin actual del empleado de identificador "i"
sql_req = ""

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

"SELECT f.id AS id_funcin


DESDE hr_contract c
LEFT JOIN res_partner_function f ON (f.id = c.function)
DONDE
(c.employee_id =% d)
"" "% (i,)
cr. ejecutar (sql_req)
sql_res = cr. dictfetchone ()
si sql_res: #El empleado tiene un contrato asociados
res [i] = sql_res ['id_funcin']
otra cosa:
#res [i] se deben establecer en falso y no a ninguno a causa de XML: RPC
# "no pueden reunir Nada menos que allow_none es habilitados
"res [i] = False
retorno res

El id de la funcin se recupera mediante una consulta SQL. Tenga en cuenta que si la


consulta no devuelve ningn resultado, el valor de sql_res ['id_funcin'] ser Ninguno.
Nos forzamos el valor False en este caso porque el valor XML: RPC (comunicacin entre
el servidor y el cliente) no permite transmitir este valor.

almacenar Parmetro
Se calcular el campo y almacenar el resultado en la tabla. El campo se volver a calcular
cuando ciertos campos se cambian en otros objetos. Se utiliza la siguiente sintaxis:
store =
{'object_name':
(function_name,
['field_name1', 'field_name2'],
prioridad)}

Se llamar a la funcin function_name cuando los cambios se escriben en los campos en


la lista ["campo1", "campo2 '] en el objeto' object_name '. La funcin debe tener la
siguiente firma:
function_name def (self, cr, uid, ids, context = None):

Dnde identificadores sern los identificadores de los registros en la mesa del otro objeto
que han cambiado los valores en los campos observados. La funcin debe devolver una
lista de identificadores de registros en su propia mesa que debe tener el campo vuelve a
calcular.Dicha lista se enviar como un parmetro para la funcin principal del campo.
He aqu un ejemplo del mdulo de la membresa:
'membership_state':
campos. funcin
(_membership_state,
mtodo = Verdadero,
cadena = 'Composicin actual state' ,

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

type = 'selection' ,
selection = STATE ,
store = {
'account.invoice' : ( _get_invoice_partner , [ 'state' ], 10 ),
'membership.membership_line' : ( _get_partner_id ,[ 'state' ], 10 ),
'res.partner' : (
lambda self , cr , uid , ids , c = {}: ids ,
[ 'free_member' ],
10 )
}),

Los campos Propiedad


Declarar una propiedad
Una propiedad es un campo especial: fields.property.
class res_partner ( osv . osv ):
_name = "res.partner"
_inherit = "res.partner"
_columns = {
'property_product_pricelist' :
fields . property (
'product.pricelist' ,
type = 'many2one' ,
relation = 'product.pricelist' ,
string = "Sale Lista de precios ",
mtodo = Verdadero,
nombre_grupo =" Lista de precios Propiedades
"),}

Entonces usted tiene que crear el valor por defecto en un archivo .XML para esta
propiedad:
<record model= "ir.property" id= "property_product_pricelist" >
<field name= "name" > property_product_pricelist </field>
<field name= "fields_id" search= "[('model','=','res.partner'),
('name','=','property_product_pricelist')]" />
<field name= "value" eval= "'product.pricelist,'+str(list0)" />
</record>

Consejo
si el valor por defecto apunta a un recurso de otro mdulo, puede utilizar la funcin ref as:
<nombre del campo = "valor" eval = "'product.pricelist,' + str (ref ('module.data_id'))" />
Poner propiedades en formas
Para agregar propiedades en formas, slo hay que poner la <propiedades /> en su
formulario. Esto agregar automticamente todos los campos de propiedades que estn
relacionados con este objeto. El sistema agregar propiedades en funcin de sus

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

derechos. (algunas personas sern capaces de cambiar una propiedad


especfica, otros no).
Las propiedades se muestran por seccin, dependiendo del atributo nombre_grupo. (Se
hizo en el cliente como una etiqueta separador).
Cmo funciona esto ?
La clase fields.property hereda de fields.function y reemplaza el mtodo de lectura y
escritura. El tipo de este campo es many2one, por lo que en la forma de una propiedad se
representa como una funcin many2one.
Pero el valor de una propiedad se almacena en el ir.property clase / tabla como un
registro completo. El valor almacenado es un campo de referencia de tipo (no many2one)
porque cada propiedad puede apuntar a un objeto diferente. Si modifica valores de las
propiedades (en el men de administracin), stas se representan como un campo de
referencia del tipo.
Cuando lees una propiedad, el programa le da la propiedad adjunta a la instancia de
objeto que est leyendo. Si este objeto no tiene valor, el sistema le dar la propiedad
predeterminada.
La definicin de una propiedad se almacena en la clase ir.model.fields como cualquier
otro campo. En la definicin de la propiedad, puede agregar grupos que tienen permiso
para cambiar a la propiedad.
El uso de propiedades o campos normales
Cuando usted quiere agregar una nueva funcin, usted tendr que elegir para poner en
prctica como una propiedad o como campo normal.Utilice un campo normal cuando se
hereda de un objeto y desea extender este objeto. Utilice una propiedad cuando la nueva
caracterstica 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 extienden el objeto, aadiendo ms caractersticas o datos.
Una propiedad es un concepto que se adjunta a un objeto y tienen caractersticas
especiales:

Valor diferente para la misma propiedad dependiendo de la compaa


Gestin de derechos por campo
Es un vnculo entre los recursos (many2one)

Ejemplo 1: Cuenta por Cobrar


El valor por defecto "Cuenta por Cobrar" un socio especfico se ejecuta 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 cuenta que es visible en una forma pareja. Derechos tienen que ser
gestionados en estos campos para los contadores, estos no son los mismos derechos que
se aplican a los objetos asociados. As que usted tiene derechos especficos slo para este
campo de forma pareja: slo 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 la cuenta por cobrar en funcin de la empresa que pertenece el usuario. En un sistema
multi-empresa, hay una tabla de cuenta por cada empresa. La cuenta por cobrar de la
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
en el men propiedad general (en la administracin).

Nota

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

Una cosa interesante es que las propiedades evitan cdigo "spaghetti". El


mdulo cuenta depende de la (base) Mdulo de pareja. Pero usted puede instalar el socio
(base) del mdulo sin el mdulo de contabilidad. Si agrega un campo que apunta a una
cuenta en el objeto de pareja, ambos objetos dependern de uno al otro. Es mucho ms difcil
de mantener y cdigo (por ejemplo, tratar de eliminar una tabla cuando ambas tablas estn
apuntando a los dems.)
Ejemplo 2: El producto tiempos
El mdulo de caducidad del producto implementa todas las demoras relacionadas con los
productos: fecha de retirada, usetime producto, ... Este mdulo es muy til para las
industrias de alimentos.
Este mdulo hereda del objeto product.product y aade nuevos campos a la misma:
clase product_product (OSV. OSV):
_inherit = 'product.product'
_name = 'product.product'
_columns = {
'life_time': campos. entero ('tiempo de vida del producto'),
'use_time': campos. entero ('usetime producto'),
'removal_time': campos. entero ('tiempo de eliminacin del producto'),
'alert_time': campos. entero ('Producto tiempo de
alerta'),}
product_product ()

Este mdulo aade campos simples al objeto product.product. No hicimos uso de


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 gestin correcta por campo, los diferentes retardos son
gestionados por las mismas personas que manejan todos los productos.

Mtodos ORM
Mantener el contexto en mtodos ORM
En OpenObject, el contexto tiene datos muy importantes, tales como el idioma en que un
documento debe ser escrito, si las necesidades sobre el terreno la funcin de actualizar o
no, etc.
Cuando se llama a un mtodo de ORM, es probable que ya tenga un contexto - por
ejemplo, el marco le proporcionar una como un parmetro de casi todos los mtodos. Si
usted tiene un contexto, es muy importante que siempre pasa a travs de cada mtodo de
llamar.
Esta regla tambin se aplica a la escritura de mtodos ORM. Usted debe esperar recibir
un contexto como parmetro, y siempre pasar a travs de cualquier otro mtodo de
llamar ..

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html

Vous aimerez peut-être aussi