Está en la página 1de 65

TING!

DESARROLLO DE MDULOS
ting! Tecnologas Inteligentes de Software S.L.

FORMACIN TCNICA MADRID 19-23 JULIO 2010

JULIO 2010

V2.0

ndice
i. ii. a. b. c. iii. iv. a. b. c. v. a. b. c. d. e. f. vi. vii. viii. INTRODUCCIN ESTRUCTURA DE UN MDULO ESTUDIO COMPLETO DE UN MDULO EXISTENTE DESCRIPCIN DE MDULOS BSICOS: BASE, SALE, PRODUCT, STOCK, PROJECT HERENCIA MAPEADOR ORM OBJETOS, CAMPOS
Y MTODOS

DEFINICIN DE OBJETOS CAMPOS SIMPLES, FUNCIONALES, RELACIONALES, PROPIEDADES, PREDEFINIDOS Y ESPECIALES RESTRICCIONES VISTAS Y EVENTOS ELEMENTOS DE LAS VISTAS: FIELD, BUTTON, SEPARATOR, LABEL, ... ATRIBUTOS DE LOS ELEMENTOS: READONLY, VISIBLE, NOLABEL, ... AGRUPACIN DE ELEMENTOS: GROUP, NOTEBOOK, PAGE, ... ACCIONES, DOMINIOS MENS ATAJOS ENTRE OBJETOS MENUS Y ACCIONES SEGURIDAD DE OBJETOS EJERCICIO PRCTICO

Introduccin
Una vez instalado, OpenERP tiene una estructura modular permitiendo
aadir mdulos segn vaya siendo necesario. El uso de los mdulos es la manera de ampliar la funcionalidad OpenERP. La instalacin por defecto de OpenERP se compone de un ncleo y varios mdulos dependiendo del tipo de instalacin entre los cuales podemos distinguir:
base: el mdulo bsico compuesto por ir.property, res.company, res.request, res.currency, res.user, res.partner este mdulo siempre es instalado. crm: gestin de la relacin con los Clientes / Proveedores. sale: gestin de ventas. mrp: fabricacin y planificacin de recursos. .

Los nuevos mdulos pueden programarse fcilmente y requieren un poco de prctica en XML y Python.

Estructura de un mdulo

Contenido de un mdulo: (addons/nombre_de_modulo)


__terp__.py Objetos:
nombre_de_modulo.py, y posiblemente otros __init__.py

subdirectorio security/
ir_model_access.csv (permisos sobre objetos) modelo_security.xml (creacin de grupos y acceso a opciones de men)

Archivos XML:
nombre_de_modulo_view.xml nombre_de_modulo_workflow.xml (opcional) nombre_de_modulo_report.xml (opcional) nombre_de_modulo_wizard.xml (opcional) nombre_de_modulo_data.xml (opcional) nombre_de_modulo_demo.xml (opcional) posiblemente otros ficheros XML opcionales

Subdirectorio i18n/
modulo.pot (plantilla) es_ES.po

fr_FR.po
....

SubdirectorioProcess, para incluir informacin de procesos

Subdirectorio report/
report_name.xml / report_name.xsl

Otros Es una buena estrategia crear directorios donde se contengan las modificaciones propias de mdulos externos

report_name.rml / report_name.sxw / report_name.py (opcional) report_name.py

subdirectorio wizard/

__init__.py
wizard_name.py

Estructura de un mdulo
Los pasos bsicos para generar un mdulo son:
Crear un subdirectorio en la raz del servidor OpenERP dentro del directorio bin/addons. Crear un archivo con la descripcin del mdulo: __terp__.py Crear los archivos Python que contendrn los objetos.

Crear los archivos xml para la obtencin de datos (vistas, mens, datos de ejemplo,...)
Opcionalmente crear listados, asistentes y flujos de trabajo.

Los archivos xml ubicados en el directorio del mdulo se pueden utilizar para modificar la estructura de la base de datos tambin son utilizados para otros propsitos entre los que podemos destacar:
Cargar datos iniciales o datos de demostracin. Declaracin de vistas. Declaracin de listados. Declaracin de asistentes. Declaracin de flujos de trabajo.

Estructura de un mdulo
La estructura general de los ficheros xml es la siguiente
<?xml version="1.0"?> <openerp> <data> <record model="workflow" id=workflow_id> <field name="name">workflow.name</field> <field name="osv">resource.model</field> <field name="on_create">True | False</field> </record> </data> </openerp>

Ejemplo: sale_workflow.xml
id (en el ejemplo "workflow_id") es un identificador del flujo de trabajo. Cada flujo de trabajo debe tener un identificador nico. name (en el ejemplo "workflow.name") es el nombre del flujo de trabajo. El nombre del

flujo de trabajo debe respetar la sintaxis de OpenERP "nombres punteados".


osv (en el ejemplo "resource.model") es el nombre del objeto OpenERP que vamos a utilizar como modelo [- (Recuerde que OpenObjects hereda de osv.osv, de ah "<field name="osv">')-]. on_create es verdadero cuando workflow.name se instancia automticamente cuando resource.model es creado y falso en el caso contrario.

Estructura de un mdulo
__init__.py: El archivo __init__.py, como cualquier mdulo de Python, es
ejecutado al inicio del programa. En el incluiremos los archivos de Python que necesiten ser cargados.Por lo tanto, si creamos un archivo "modulo.py", que contiene la descripcin de nuestros objetos, tenemos que incluir una lnea en __init__.py:
import modulo

__terp__.py : Cualquier mdulo que creemos debe contener un un

archivo con este nombre __terp__.py y debe estar ubicado en la raz de


nuestro mdulo. Este archivo, que debe tener el formato Phyton es responsable de determinar:
Los archivos XML que sern analizados durante la inicializacin del servidor OpenERP. Las dependencias del mdulo que hemos creado.

Estructura de un mdulo
Este archivo __terp__.py debe contener los siguientes valores de Python:
name: nombre del mdulo. version: versin del mdulo description: descripcin del mdulo.

author: autor del mdulo


website: sitio web del modulo license: licencia del mdulo (por defecto GPL-2) depends: lista de mdulos de los que depende este mdulo. El mdulo base se debe

incluir casi siempre en las dependencias ya que algunos datos de este mdulo son
necesarios para las vistas, informes ..... init_xml: lista de archivos xml que se cargaran al iniciar el servidor OpenERP con la opcin "init=modulo". Las rutas de los archivos debe ser relativas al directorio donde est el mdulo. update_xml: lista de archivos xml que se cargaran al iniciar el servidor OpenERP con la opcin "-update=modulo". Las rutas de los archivos debe ser relativas al directorio donde est el mdulo. installable: acepta valores true o false y determina si el mdulo es instalable o no. active: acepta valores true o false y determina los si el mdulo sera instalado cuando se cree la base de datos (por defecto false)

Mapeador ORM
El mapeador se encuentra en la carpeta bin/osv, es una tcnica de
programacin para convertir datos entre el sistema de tipos utilizado en un lenguaje de programacin orientado a objetos y el utilizado en una base de datos relacional. En nuestro caso: Python - PostgreSQL La estructura es sencilla: 4 ficheros:
fields.py : donde se definen las estructuras bsicas (columnas y tipos de campos) orm.py : donde se crean las clases que van a albergar los objetos y se define su funcionamiento ntimo. (En teora, todo el SQL debera estar aqu...) osv.py: Instancia los objetos expression.py : permite evaluar expresiones complejas para dominios de datos (AND, OR, etc.)

Objetos (modelo)
Todos los datos de OpenERP son accesibles a travs de "objetos". Por ejemplo, existe un objeto "res.partner" para acceder a la informacin

concerniente a las empresas (partners), un objeto "account.invoice" para


acceder a los datos relativos a las facturas, etc. Localizacin: addons/nombre_modulo/nombre_modulo.py Existe un objeto para cada tipo de recurso, y no un objeto por recurso. As tenemos un nico objeto res.partner para manejar a todas las empresas y no un res.partner para cada empresa, es decir, existe un objeto por nivel. La principal consecuencia de ste hecho es que todos los mtodos de los objetos tienen un parmetro comn: el parmetro "ids". Este especifica sobre qu recursos (por ejemplo, sobre que empresa) el

mtodo debe aplicarse. Precisamente este parmetro contiene una lista


de identificadores de recurso (ids) sobre los que se aplicar el mtodo.

Objetos : tipos simples


boolean integer

float
parmetro opcional digits
Ex: 'rate': fields.float('Relative Change rate', digits=(12,6))

char
parmetro size
Ex: 'zip': fields.char('Zip', size=24),

text date datetime binary

Objetos: Los elementos bsicos.... fields


Heredan de una clase base denominada _column (columna), definida en fields.py

Clase _column, atributos ms importantes:


_type : se utiliza para mapear su equivalente en la base de datos posteriormente (mtodo get_pg_type de orm.py)
class integer_big(_column):

_type = 'integer_big'
.... type_dict = { fields.boolean: 'bool', fields.integer: 'int4', fields.integer_big: 'int8', ....

Objetos: Atributos
_multi : Se utiliza en campos 'funcionales' cuando el valor de varios campos se devuelve simultaneamente string: Almacena el valor de la cadena a mostrar (etiqueta)

readonly: Especifica si el campo es de slo lectura


required: Si es obligatorio (ojo! A nivel de base de datos...) size: el tamao. Obligatorio para algunos tipos de campo como 'char' help: Cadena de texto para ayuda contextual change_default: Si es verdadero permite definir al usuario valores por defecto de otros campos basados en el valor de ste.

ondelete: En campos relacionados permite definir a nivel de base de datos el comportamiento con los campos relacionados (... el ON DELETE CASCADE, SET NULL o en su caso RESTRICT). Por defecto set null

translate: Si es verdadero, el contenido del campo ser traducible _domain: si existe un dominio sobre el campo _context: informacin de contexto select : Permite definir si el campo se utilizar en los formularios de bsqueda de registros states: permite definir el valor de los dems atributos dependiendo del valor de la columna 'state'.

Objetos: boolean
Ejemplo tpico: campo 'active'. Si el campo 'active' existe para un objeto por defecto las bsquedas filtrarn solamente los registros activos. Si

adems no ponemos en campo 'active' un atributo 'select' no habr


forma de seleccionar nunca los registros no activos.

base/res/partner/partner.py: base/res/partner/partner.py:

'active': fields.boolean('Active'), 'customer': fields.boolean('Customer',

help="Check this box if the partner if a customer."),

Objetos: integer

Adems de los usos habituales de los enteros se utiliza tambin en campos como 'sequence'. Es una convencin dentro de la aplicacin usar un campo llamado 'sequence' para ordenar los registros.

Rango: -2147483648 a +2147483647 Ejemplo: product/product.py clase: product.category


_columns = { 'name': fields.char('Name', size=64, required=True, translate=True), 'complete_name': fields.function(_name_get_fnc, method=True, type="char", string='Name'), 'parent_id': fields.many2one('product.category','Parent Category', select=True), 'child_id': fields.one2many('product.category', 'parent_id', string='Childs Categories'), 'sequence': fields.integer('Sequence'), } _order = "sequence"

Big Integer apenas se utiliza

Objetos: reference

Se utiliza para crear una referencia a otro objeto que no es siempre del mismo tipo.

Ejemplo: requests -> permite enlazar a los mensajes referencias a facturas, pedidos de ventas, tareas, etc.

En la base de datos se almacena como una cadena de texto donde figura el nombre de modelo y su identificador: account.invoice,7 sera una referencia a la factura nmero 7.

El campo se muestra como 2: un desplegable con los objetos a enlazar y un campo para seleccionarlo. (Ver ejemplo)

Objetos: char

Son cadenas de texto. El campo 'name' es normalmente de tipo char. (Es un campo semiobligatorio por lo que podemos encontrar definiciones en prcticamente todas las clases).

Obligatorio: indicar tamao mediante atributo size Ejemplo:


'name':fields.char('Name',size=64,invisible=True)

Objetos: text

Texto (sin lmite) Se utiliza normalmente para observaciones, etc.

Es texto sin formato

Objetos: float

Numricos de punto flotante En la definicin se pueden especificar los dgitos Se traduce en la base de datos por:

double si no establecemos un nmero de dgitos numeric si los establecemos

Ejemplo: en account/account_move_line.py

La mayor parte de los campos numricos tienes establecida una precisin

El campo 'amount_currency' no la tiene....

Objetos: date, datetime, time

Campos para almacenar valores de tiempo:


date: fecha (sin hora) datetime: almacena fecha y hora time: hora (apenas utilizado)

La forma de evitar problemas.....

AAAA-MM-DD HH:MM:SS

Objetos: binary

Guarda datos binarios En muchas ocasiones se almacenan codificados en formato

base64

Permite almacenar imgenes, ficheros, etc.

Objetos: selection

En el objeto es un campo que puede tomar valores de una lista En la base de datos se mapea a un tipo text

Objetos: many2one

Se utiliza para relaciones muchos a uno El mapeador crea una columna en la tabla muchos, clave foranea de la tabla uno. (La clave principal siempre es id) Ejemplo: lineas de pedido -> pedidos:
'order_id': fields.many2one('sale.order', 'Order Ref', required=True, ondelete='cascade', select=True)

En la base de datos: CONSTRAINT sale_order_line_order_id_fkey FOREIGN KEY (order_id) REFERENCES sale_order (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE,

Cuando creamos un campo many2one, la aplicacin automticamente genera en la base de datos la clave fornea, pero NO crea un ndice sobre esa clave Si el campo en cuestin lleva un select, esto es, prevemos que vamos a utilizarlo en bsquedas, la aplicacin genera un ndice sobre dicho campo

Objetos: one2many

Es la visin inversa de la relacin anterior Es posible definir la relacin en un sentido y no en el otro. La nica consecuencia es que programticamente no podremos utilizarla. En la base de datos no hay diferencia. Ejemplo:
'order_line': fields.one2many('sale.order.line', 'order_id', 'Order Lines', readonly=True, states={'draft':[('readonly',False)]}),

Objetos:many2many

Permite crear relaciones muchos a muchos En la base de datos se utiliza una tabla intermedia (normalmente

terminada en _rel) que almacena los identificadores de los


registros relacionados

Automticamente se crean ndices sobre ambas columnas

Objetos: function

Existe la posibilidad de definir campos funcionales En principio stos no tienen un mapeo a la base de datos excepto que utilicemos el argumento store=True, que almacena el resultado de la funcin en una

columna en la base de datos del tipo adecuado.

Existe la posibilidad de definir varios campos funcionales con la opcin multi . De esta manera, se pueden calcular varios simultneamente. Ejemplo: account/partner.py

_columns = { 'credit': fields.function(_credit_debit_get, fnct_search=_credit_search, method=True, string='Total Receivable', multi='dc', help="Total amount this customer owns you."), 'debit': fields.function(_credit_debit_get, fnct_search=_debit_search, method=True, string='Total Payable', multi='dc', help="Total amount you have to pay to this supplier."), .................. def _credit_debit_get(self, cr, uid, ids, field_names, arg, context): ......

Objetos: related

Campos relacionados (derivan de los campos funcionales) En versiones antiguas, no era sencillo mostrar campos

perteneciente a objetos relacionados (ms all de su nombre)


Ejemplo: Un campo de alerta en clientes. Con este tipo de campos es posible acceder y mostrar esos campos alojados en otras tablas.

Objetos: serialized

Es un tipo de campo diseado para almacenar objetos serializados (persistentes)

Utiliza el mtodo repr() de Python para serializar los objetos por defecto, pero puede ser reemplazado por otro mtodo mediante el parmetro serialize_func

Objetos: property

La clase fields.property hereda de fields.function y sobreescribe


los mtodos read y write. El tipo de este campo es 'many2one', de modo que en la vista se representa de la misma manera que

un campo many2one.

Pero el valor de la propiedad se almacena en la clase ir.property (tabla ir_property) como un registro independiente. El valor almacenado es un campo del tipo 'reference' (referencia, no muchos a uno) porque cada propiedad puede apuntar a un objeto diferente. Si se editan los valores de las propiedades (en el men de administracin), estas estn representadas como campos de tipo referencia.

Objetos: property (2)

Cuando se lee una propiedad el programa devuelve la propiedad adjunta a la instancia del objeto que se est leyendo.

Si el valor de la propiedad no est definido el sistema devolver


la propiedad por defecto.

La definicin de un a propiedad es almacenada en la clase

ir.model.fields como cualquier otro campo. En la definicin de la


propiedad se pueden aadir los grupos que tienen permiso para modificarla.

Clases definidas en OpenERP


class orm_template(object) / class orm(orm_template) Las clases que albergan los objetos con los que normalmente

trabajamos descienden de la clase osv.osv que hereda de orm


que a su vez hereda de orm_template.

Todos los datos del ERP son accesibles a travs de "objetos". Por

ejemplo, existe un objeto "res.partner" para acceder a la


informacin concerniente a las empresas (partners), un objeto "account.invoice" para acceder a los datos relativos a las facturas, etc.

Clases definidas en OpenERP

La principal consecuencia de ste hecho es que todos los mtodos de los objetos tienen un parmetro comn: el

parmetro "ids". Este especifica sobre qu recursos el mtodo


debe aplicarse.

Normalmente llamaremos a un mtodo con una serie de

parmetros, de los cuales algunos prcticamente siempre estn


presentes:

objeto.metodo(cr, uid, ids, ......)

cr : es una referencia al cursor que conecta a la base de datos


uid: identificador de usuario que hace la peticin ids: lista de identificadores

Objetos: orm_template y orm

Principales atributos:
_name = None _columns = {} _constraints = [] _defaults = {} _rec_name = 'name' _parent_name = 'parent_id' _parent_store = False _date_name = 'date' _order = 'id' _sequence = None _description = None _inherits = {} _table = None _sql_constraints = [] _log_access = True _table = None _sql = '' _auto = False

Objetos: orm_template y orm

Principales mtodos:

_auto_init: se ejecuta automticamente al cargar el objeto. En algunos casos se sobreescribe para aadir la creacin de ndices adicionales. (Ej: stock/stock.py) check_recursion: Se utiliza en estructuras arbreas para prevenir ciclos infinitos. Si la estructura la hemos creado a mano tambin podemos utilizar el mtodo pasndole como argumento parent el nombre del campo padre Browse: Se utiliza continuamente. Devuelve un conjunto de objetos navegables de una clase. Copy: Es el mtodo que se invoca cuando duplicamos un registro. Puede ser interesante reescribirlo. Ejemplo: pedidos de venta Create: Se ejecuta al crear un nuevo objeto. En muchos casos puede ser interesante manipular ste mtodo. Ejemplo: account.move.line (al crear un apunte contable) default_get: Devuelve los valores por defecto establecidos por un usuario, etc. Ejemplo de utilizacin: account.move.line

Objetos: orm_template y orm

Principales mtodos:

distinct_field_get: Devuelve todos los distintos valores introducidos en un campo. Se utiliza normalmete para autocompletar campos (es automtico). fields_get: Devuelve los campos pertenecientes a un objeto. Ejemplo de utilizacin: si fuesemos a escribir nuestra propia aplicacin cliente utilizaramos este mtodo remotamente para obtener los campos y sus tipos. Hay un ejemplo de manipulacin de este mtodo en base/res/partner/partner.py en la definicin de los bancos. export_data / import_data: Son los mtodos utilizados en la importacin / exportacin de datos desde el cliente. El hecho de que sean mtodos de clase nos permite sobreescribirlos, en caso necesario, para los objetos que queramos. (No hay un slo caso en todo el repositorio, pero es posible hacerlo) fields_view_get: Devuelve la vista correspondiente a un objeto (en su contexto). Es el mtodo que entre otras cosas se encarga de la aplicacin de las herencias en las vistas. Ejemplo de manipulacin: en stock/product.py o en ir/ir_model.py (ver ste ltimo en funcionamiento)

Objetos: orm_template y orm

Principales mtodos:

name_get: Es un mtodo trivial que devuelve el valor del campo name o el especificado en _rec_name. Ejemplo de utilizacin: Las categoras de producto. name_search: Define la bsqueda a travs del nombre de un objeto. Ejemplo de utilizacin: bsqueda de productos. _parent_store_compute: Para la optimizacin de determinadas consultas en la base de datos de estructuras arbreas es preciso calcular para cada nodo sus ramas izquierda y derecha. Es este mtodo el encargado de realizar el clculo. Ejemplo de utilizacin: este tipo de estructuras se utilizan actualmente con las cuentas contables y las localizaciones de almacn. (enlace) perm_read: Permite consultar los permisos sobre un objeto y los datos de creacin y ltima modificacin. Este mtodo es a veces conveniente ya que los campos internos (create_uid, create_date, etc.) son accesibles directamente slo si los hemos redeclarado (en _columns). Con este mtodo podemos acceder a leerlos sin necesidad de dicha declaracin

Objetos: orm_template y orm

Principales mtodos:

Read: Se utiliza para leer el contenido de diversos campos de un conjunto de registros. Se recomienda utilizar browse en lugar de read, ya que no es ms lento y nos permite realizar lo mismo con una sintaxis ms clara. search_count: Devuelve el nmero de registros como resultado de una bsqueda. search : Es otro de los mtodos muy utilizados. Devuelve una lista de ids que cumplen con una serie de requisitos. Ejemplo de utilizacin: en stock/stock.py hay un bucle que recorre todas las localizaciones hijas de otra. Unlink: Para borrar o eliminar registros view_header_get: Se utiliza si queremos cambiar la etiqueta de una pestaa, dependiendo del contexto. Write: Es el mtodo que se utiliza habitualmente para escribir valores en un objeto

RESUMEN: atributos de campo

readonly (boolean) Valor por defecto: False.

required (boolean) Valor por defecto: False.


translate (boolean) Valor por defecto: False. change_default (boolean) Valor por defecto: False.

Objetos: Atributos de campo

states

Uso: establecer parmetros dependiendo del estado Sintaxis: {'nombre_estado': lista_atributos, ...}

donde lista_atributos es una lista de tuplas de la forma [('nombre_atributo', valor), ...]

Valor por defecto: {}.

Ejemplo:

'partner_id': fields.many2one('res.partner', 'Partner', states={'posted': [('readonly',True)]}),

Objetos: campos complejos

function (nombre_metodo, tipo_metodo, ...)

Ejemplo:

def _get_installed_version(self, cr, uid, ids, field_name=None, arg=None, context={}): res = {} for m in ...: res[m.id] = ... return res 'installed_version': fields.function(_get_installed_version, method=True, string='Installed version', type='char'),

selection (opciones, ...)

Ejemplo:

'state': fields.selection( (('n','Unconfirmed'),('c','Confirmed')), 'State', required=True)

Objetos: campos relacin

many2one (obj, ...)

Ejemplo:

'commercial': fields.many2one('res.users', 'Commercial'),

Parmetros opcionales:

ondelete = cascade
-

Valor por defecto: set null


Valor por defecto: []

domain = [('field_name', 'operator', value), ...]


-

one2many (obj, campo_id, ...)

Ejemplo:

'address': fields.one2many('res.partner.address', 'partner_id', 'Contacts'),

Objetos: campos relacin

many2many (obj, rel, id1, id2)

obj es el otro objeto relacionado rel es el nombre de la tabla que hace la relacin id1 e id2 son los nombres de los campos en la tabla de relacin Ejemplo:

'category_id':
fields.many2many( res.partner.category', 'res_partner_category_rel', 'partner_id', 'category_id', 'Categories'),

Objetos: campos relacin

reference (string, optiones, size) Ejemplo: 'ref': fields.reference(


'Field label', selection = ((('object.name', 'Object Label'), ...), size=128),

Seleccin dinmica:
<field name="name">Project Task</field> <field name="object">project.task</field>

<record model="res.request.link"> </record>

Objetos: valores por defecto


Principios son funciones toman 4 parmetros (obj, cr, uid, context) Sintaxis: _defaults = {

'field_name': function, ...

Ejemplo _defaults = {

'date': lambda obj,cr,uid,context: time.strftime('%Y-%m-%d'), 'state': lambda *a: 'draft'

Objetos: restricciones

Principios: son restricciones en cdigo Sintaxis:

[(metodo, 'mensaje error', lista_campos), ...]

Example def _constraint_sum(self, cr, uid, ids):

... return res < 1000

_constraints = [
(_constraint_sum, 'Error: el resultado debera ser < 1000.', ['name'])

Objetos: herencia simple


Principios: Sintaxis: _inherit = 'object.name' Ejemplo:


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()

Objetos: herencia compleja


Principios: (ver ejemplo biblio) Sintaxis:

_inherits = { 'nombre.objeto': nombre_columna, .....}

Ejemplo:
Ver product.product y product.template

Objetos: otros atributos de objeto

_table

Valor por defecto: nombre del objeto (. sustutuidos por _)

_rec_name

Valor por defecto: 'name'.

_order

Valor por defecto: 'id'.

Objetos: acceso a los objetos

Acceso directo (desde dentro de un objeto)

self.pool.get('nombre.objeto')

Ejemplo:

partner_object = self.pool.get('res.partner') partner_object.nombre_del_metodo(parmetros_m etodo)

Acceso a travs de Netservice (en el servidor pero desde fuera de los objetos)

service = netsvc.LocalService("object_proxy") result = service.execute(user_id, object_name, method_name, parameters)

Objetos: acceso a los objetos

Acceso XML-RPC

sock = xmlrpclib.ServerProxy('http://servidor:pu erto/xmlrpc/object') result = sock.execute(user_id, password, object_name, method_name, parameters)

Objetos: mtodos predefinidos ms importantes

create

def create(self, cr, uid, vals, context={}) devuelve el id def search(self, cr, uid, args, offset=0, limit=80)

search

args = [('nombre_campo', 'operador', valor), ...]

devuelve lista de ids def read(self, cr, uid, ids, fields=None, context={}) devuelve lista de diccionarios: [{'nombre_campo': valor}]

read

Objetos: mtodos predefinidos ms importantes

write

def write(self, cr, uid, ids, vals, context={})

vals = {'field_name': value, ...}

devuelve True def unlink(self, cr, uid, ids) devuelve True def browse(self, cr, uid, ids, offset=0, limit=2000) Ejemplo:

unlink

browse

addr_obj = self.pool.get('res.partner.address').browse(cr, uid, contact_id) contact_name = addr_obj.name contact_bank = addr_obj.partner_id.bank

Objetos: mtodos predefinidos ms importantes

name_get
def name_get(self, cr, uid, ids, context={}) Devuelve

[(id, name), ...]

name_search

Vistas

Vistas sirven para definir como mostrar los objetos. tienes que saber que la interfaz de usuario de OpenERP es dinmica. Esto quiere decir que no esta descrita estticamente por algn cdigo, pero es dinmicamente construida desde las descripciones en XML de la pantalla del cliente. Puede haber varias vistas para el mismo objeto Diferentes tipos de vista:

Formularios

form tree

Tree (con atajos) Graph (* Versin 5) Calendar (* Versin 5)

Vistas: principios

Acciones

Items de Men

Abrir una ventana (form o tree) Imprimir un informe Ejecutar un wizar

Vistas: sintaxis

Como los otros ficheros XML (usan las etiquetas record) objeto que almacena vistas = ir.ui.view
<openerp>
<data>
<record model=ir.ui.view id=...>
...

</record>

</data>

</openerp>

Vistas: sintaxis (formulario)


<record model="ir.ui.view" id="view_id"> <field name="name">nombre_vista</field>

<field name="model">nombre_objecto</field>
<field name="type">form</field> <field name="arch" type="xml">

<form string="Etiqueta">
<field name="nombre_campo" .../> ... </form> </field> </record>

Vista: ejemplo

<record model="ir.ui.view" id="view_organisation_form">



<field name="name">account.organisation.form</field> <field name="model">account.organisation</field> <field name="type">form</field> <field name="arch" type="xml">


<field name="partner_id"/> <field name="partner_contact_id"/> <field name="note"/>

<form string="Company">

</form>

</field>

</record>

Menus y acciones

Crean la accin abrir ventana Crean el correspondiente item de men

<record model="ir.actions.act_window" id="action_id"> <field name="name">action_name</field> <field name="res_model">object_name</field> <field name="view_type">form</field> <field name="view_id" ref="view_id"/> </record>

<menuitem name="Network/All Materials" action="action_id"/>

Seguridad de objetos
Es importante definir permisos de acceso a los objetos de openERP para que puedan acceder a ellos otros usuarios que no sean administradores. Para ello es necesario definir politicas de seguridad a los mdulos que se definiran, tal y como hemos visto en la estructura del mdulo, dentro de la carpeta security y sobre los archivos ir_model_access.csv y modulo_security.xml Ir_model_access.csv: Este archivo contiene los permisos que se les dan a los objetos para un determinado grupo. Este archivo contiene las siguientes columnas: Id: Indica el identificador de esa lnea de seguridad especifica Name: Nombre del registro Model_id:id: Identificador del modelo de objeto sobre el que se van a aplicar esos permisos. Ej: model_res_partner si se llama desde el mdulo que lo crea. Si lo hiciesemos desde otro mdulo se llamara con: base.model_res_partner (Pertenece al mdulo base) Group_id:id: Identificador del grupo de usuarios para el cual se estn estableciendo los permisos. Ej: base.group_partner_manager

Seguridad de objetos
ir_model_access.csv: Perm_read: Indica si al grupo definido le est permitida la lectura sobre ese objeto. Al ser boolean se define con 0 o 1 Perm_write: Indica si le est permitida la escritura sobre el objeto. Perm_create: Indica si se les permite crear esa clase de objetos. Perm_unlink: Indica si les est permitido borrar objetos de esa clase.

Seguridad de objetos
Archivo modulo_security.xml: En este archivo se define la creacin de grupos, reglas de registros y los permisos de un grupo sobre los mens. Creacin de grupos:
<record model="res.groups" id="group_system"> <field name="name">Administrator / Configuration</field> </record>

Permisos sobre mens:


<record id="base.menu_security" model="ir.ui.menu"> <field eval="[(6,0,[ref('base.group_erp_manager')])]" name="groups_id"/> </record>

Seguridad de objetos
Archivo modulo_security.xml: En este archivo se define la creacin de grupos, reglas de registros y los permisos de un grupo sobre los mens. Creacin de Reglas: Sirven para crear dominios especificos sobre los grupos que las tienen definidas. En el ejemplo se crear una regla para que los usuarios vean solamente sus ventas.
<record model="ir.rule.group" id="filter_sale_orders_rule_group"> <field name="name">User Sale Orders</field> <field name="model_id" search="[('model','=','sale.order')]" model="ir.model"/> <field name="global" eval="False"/> </record> <record model="ir.rule" id="filter_sale_orders_rule"> <field name="field_id" search="[('model','=','sale.order'),('name','=','user_id')]" model="ir.model.fields"/> <field name="operator">in</field> <field name="operand">','.join(map(lambda x: str(x.id), user.child_id))</field> <field name="rule_group" ref="filter_sale_orders_rule_group"/> </record>

Seguridad de objetos
Archivo modulo_security.xml: En este archivo se define la creacin de grupos, reglas de registros y los permisos de un grupo sobre los mens. Asignacin de reglas a grupos: A la hora de crear un grupo podemos asignarle las reglas definidas anteriormente:
<record model="res.groups" id="group_system"> <field name="name">Administrator / Configuration</field> <field name="rule_groups" eval="[(6,0,[ref('filter_sale_orders_rule_group')])]"/> </record>

Ejercicio prctico