Académique Documents
Professionnel Documents
Culture Documents
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).
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 ()
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
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.
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
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:
Tipo de Campos
Tipos bsicos
boolean:
integer:
Un entero.
Sintaxis:
fields.integer ('Nombre de campo' [, Parmetros Opcional]),
float:
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:
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:
date:
Una cita.
Sintaxis:
fields.date ('Nombre de campo' [, Parmetros opcionales]),
datetime:
binary:
selection:
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
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),
...,
fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html
Tipos relacionales
one2one:
many2one:
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'),
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:
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
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):
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]:
{
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 ()
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
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)}
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 )
}),
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
Nota
fuente:http://openerp-server.readthedocs.org/en/latest/03_module_dev_02.html
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