Openerp - Introduccion T©cnica

  • View
    173

  • Download
    4

Embed Size (px)

Text of Openerp - Introduccion T©cnica

  • Introduccin TcnicaJunio - 2014

  • Contenido

    Estructura de mdulos

    ORM

    Tipos de campos

    Mtodos estndares

    Vistas

    Herencia

    Reportes

    Ejercicios

  • Estructura de mdulos

  • En OpenERP todos los mdulos se encuentran en la carpeta C:\Archivos de Programa\OpenERP 7 (o numero de versin)\Server\server\openerp\addons .

    Para crear nuevos mdulos se debe ir dentro de la carpeta addons y crear una nueva carpeta con el nombre del nuevo modulo. Dicho nombre no puede contener maysculas ni espacios, por lo que si es un nombre de varias palabras debe estar escrito de la siguiente manera: modulo_nombre

    La estructura de un modulo completo es la siguiente:

    addons/modulo_nombre/ # La carpeta del modulo

    demo/ # Datos pre cargados a la BD para el demo y la unidad de testeoi18n/ # Archivos de traduccinreport/ # Definicin de reportessecurity/ # Declaracin de grupos y derechos de accesowizard/ # Definicin de los wizardsworkflow/ # Definicin de los flujos de trabajo__init__.py # Paquete Python de inicializacin (requerido)__openerp__.py # Declaracin del modulo (requerido)modulo_nombre.py # Clases Python, objetos del modulomodulo_nombre_view.xml # La vista del modulo con los forms, trees, menus

  • El archivo __init__.py es aquel que se encarga de inicializar el modulo. Para este caso el contenido de este archivo seria:

    # -*- encoding: utf-8 -*-

    import modulo_nombre

    Es muy importante prestar atencin al cdigo de arriba ya que ese cdigo es lo que hace que los archivos Python se lean correctamente y OpenERP no de errores al leerlos.

  • El archivo __openerp__.py es aquel que contiene un nico diccionario conteniendo el nombre del modulo, su descripcin, sus dependencias, sus vistas, demos y datos. Para nuestro caso este archivo se vera de la siguiente manera:

    # -*- encoding: utf-8 -*-

    {

    'name' : Nombre del Modulo',

    'version' : '1.0',

    'author' : 'OpenERP',

    'description' : Descripcion del Modulo',

    'category': Categoria del Modulo','website': 'http://www.openerp.com',

    'depends' : ['base'], # lista de dependencias, sin estas no se inicia el modulo

    'data' : [ # vistas y datos del modulo

    'security/groups.xml', # siempre carguen los grupos primero!

    'security/ir.model.access.csv', # cargar los derechos de acceso despues de los grupos

    'workflow/workflow.xml',

    'wizard/wizard.xml',

    'report/report.xml',

    modulo_nombre_view.xml],

    'demo': ['demo/demo.xml'], # Datos del demo (para testeo de la unidad)

    "active": False,

    "installable": True,

    "certificate" : "",

    }

  • El archivo modulo_nombre.py define los objetos que componen un modulo en la vista y en la base de datos, estos objetos tienen atributos predeterminados los cuales son usados e interpretados por Open ERP.

    Atributos predeterminados:

    _columns: Este atributo es requerido, en el se definen los campos que se crean en la tabla de la base de datos y las vistas

    _constraints: Permite establecer restricciones a un campo de un objeto

    _sql_constraints: Permite establecer restricciones SQL a un campo de un objeto

    _defaults: Establece valores predeterminados para un campo

    _inherit: Establece la herencia entre los objetos

    _name: Este atributo es requerido y pone nombre al objeto creado

    _order: Este atributo es usado como resultado de una bsqueda y lectura de mtodos

    _rec_name: Nombre del campo que se usa para recursos de bsqueda

  • El archivo modulo_nombre_view.xml contiene la vista del modulo. En OpenERP se dividen en tres principales; las tree, las form y las graphic. Las vistas describen como es mostrado cada objeto y como y donde es dibujado cada campo de nuestro objeto.

    La definicin de la vista contiene tres tipos de tag:

    - un tags con el atributo model=ir.ui.view, que contiene la definicion de la vista - un tags con el atributo model=ir.actions.act_window, que contiene el tipo de accin perteneciente a esa vista - un tags que crea la entrada en el menu y el vinculo de la accin.

    La estructura de bsica de una vista consta del siguiente formato:

    [view definitions]

  • ORM

  • ORM (Object Relational Mapping)

    Para todos aquellos que no conozcan el significado de las siglas ORM (Object RelationalMapping), diremos que es una tcnica de programacin para convertir datos entre el lenguaje de programacin orientado a objetos utilizado y el sistema de base de datos relacional utilizado en el desarrollo de nuestra aplicacin.

    Actualmente, las bases de datos relacionales solo pueden guardar datos primitivos, por lo que no podemos guardar objetos que vayamos creando en nuestra aplicacin, sino que lo que hacemos es convertir los datos del objeto en datos primitivos que si podremos almacenar en las tablas correspondientes de nuestras bases de datos. Si luego necesitamos ese objeto en alguna parte de nuestra aplicacin, debemos de recuperar los datos primitivos de la base de datos y volver a construir el objeto.

    El mapeo objeto-relacional lo que nos ayudar ser precisamente a eso, a olvidarnos completamente de como convertir los objetos en datos primitivos para almacenarlos y viceversa.

  • Para ver el efecto que tiene el ORM en nuestro cdigo al momento de declarar un nuevo objeto en OpenERP, debajo se encuentra la declaracin de los objetos de nuestro modulo modulo_nombre en el archivo modulo_nombre.py.

    # -*- encoding: utf-8 -*-

    from osv import osv, fields

    class objeto_modulo_nombre(osv.osv):

    _name = objeto.modulo.nombre'

    _columns = {

    'name': fields.char('Title', size=64, required=True, translate=True),

    'state': fields.selection([('draft','Draft'),

    ('confirmed','Confirmed')],'State',required=True,readonly=True),

    'description': fields.text('Description', readonly=True,

    states={'draft': [('readonly', False)]} )

    }

    _defaults = {

    'active': True,

    'state': 'draft',

    }

    def _check_name(self,cr,uid,ids):

    for idea in self.browse(cr, uid, ids):

    if 'spam' in idea.name: return False

    return True

    _sql_constraints = [('name_uniq','unique(name)', 'Ideas must be unique!')]

    _constraints = [(_check_name, 'Please avoid spam in ideas !', ['name'])]

    objeto_modulo_nombre()

  • Tipos de campos

  • Los objetos en Open ERP contienen campos los cuales permiten introducir datos en la base de datos, estos campos van definidos en el atributo _columns. Hay tres tipos de campos, los bsicos, los relacionales y los funcionales. Los bsicos solos sirven para introducir datos bsicos, los relacionales (many2one, one2many, many2many) permiten establecer relaciones entre los objetos y los funcionales no se guardan en la base de datos y son calculados al vuelo como funciones Python.

    Campos simples principales:

    - Boleano (True, False): fields.boolean(Nombre' [, Parametors Opcionales]),

    - Integer: fields.integer('Nombre' [, Parametors Opcionales]),

    - Float: fields.float('Nombre' [, Parametors Opcionales]),

    - Char: fields.char(Nombre', size=n [, Parametors Opcionales]),

    - Date: fields.date(Nombre' [, Parametors Opcionales]),

    - Selection: fields.selection((('n',No confirmado'), ('c','Confirmado')),Nombre' [, Parametors Opcionales]),

    Existen otros campos como Text, Datetime y Binary tambin.

  • Campos relacionales principales:

    - Many2one: Asocia este objeto con un objeto padre en una relacin muchos a uno, por ejemplo, de muchas marcas de autos existe una que pertenece a un vehculo en particular.

    fields.many2one(nombre.otro.objeto', Nombre', parametro opcional)

    - One2many: Este campo expresa una relacin uno a muchos entre dos objetos, este campo es obsoleto utilizando una relacin many2one. Se utiliza en tablas.

    fields.one2one('nombre.otro.objeto', Nombre') fields.one2many('nombre.otro.objeto', id del campo relacional', Nombre',

    parametro opcional)

    - Many2many: Es una relacin bilateral entre dos objetos.

    fields.many2many( nombre.otro.objeto', objetorelacional', id.objeto.actual', id.otro.objeto', Nombre')

  • Campos funcionales principales:

    - Function: fields.function(fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type="float, fnct_search=None, obj=None, method=False, store=False, multi=False,...)

    - type es el tipo de campo devuelto por la funcin. Puede ser cualquiera excepto function. - method indica si el campo se calcula mediante un mtodo (de un objeto) o una funcin global. - store y multi son mecanismos de optimizacin, para guardar los valores de los campos funcionales en la base de datos (store=True) aunque se seguirn calculando mediante una funcin Python o para calcular varios campos funcionales a la vez con el atributo multi. - fnct es la funcin o mtodo que calcular el valor del campo. Es un parmetro obligatorio. Debe haberse declarado antes de declarar el campo funcional.

    Si method es verdadero (True), la signatura del mtodo debe ser:

    def fnct(self, cr, uid, ids, nombre_campo, arg, context)

    en otro caso (si se trata de una funcin global), su signatura debe ser:

    def fnct(cr, tabla, ids, nombre_campo, arg, context)

    De cualquier manera, debe devolver un diccionario de valores de la forma {id'_1_': valor'_1_',id'_2_': valor'_2_',...}.

    Los valores del diccionario devuelto deben ser del tipo indicado en el parmetro type de la declaracin del campo.

  • - fnct_inv es la funcin o mtodo que permitir escribir valores en ese campo. Si method es verdadero (True), la signatura del mtodo debe ser:

    def fnct(self, cr, uid, ids, nombre_campo, valor_campo, arg, context)

    en otro caso (si se trata d