Está en la página 1de 10

RAD Fuente abierta con OpenERP 7.

0 la creación de bases de datos


Después de iniciar el servidor, abierto http: // localhost: 8069 en su navegador favorito. Verá la pantalla del
Administrador de base de datos donde se puede crear una nueva base de datos. Cada base de datos tiene sus
PAG REÁMBULO OpenERP es un moderno conjunto de aplicaciones empresariales, publicado bajo la licencia AGPL, y
propios módulos y configuración, y se puede crear en el modo de demostración para poner a prueba una base de
con CRM, recursos humanos, ventas, contabilidad, fabricación, gestión de almacenes, gestión de proyectos, y
datos pre-poblada (no utilice el modo de demostración para una base de datos real!)
mucho más. Se basa en un sistema modular, escalable, e intuitivo Desarrollo rápido de aplicaciones (RAD) marco
escrito en Python.

La construcción de un módulo de OpenERP: idea


OpenERP Cuenta con una caja de herramientas completa y modular para la construcción rápida de aplicaciones:
CONTEXTO Los ejemplos de código utilizados en este memento se toman de una hipotética idea módulo. El propósito
integrado Relación de objeto Mapping (ORM) apoyo,
de este módulo sería ayudar a las mentes creativas, que a menudo vienen con ideas que no pueden llevarse a
basada en plantillas Modelo-Vista-Controlador (MVC) interfases, un informe
cabo de inmediato, y se olvidan con demasiada facilidad si no hay sesión en alguna parte. Podría ser utilizado para
sistema de generación, la internacionalización automatizado, y mucho más.
registrar estas ideas, ordenarlas y la tasa de ellos.

Pitón es un lenguaje de programación dinámico de alto nivel, ideal para RAD,


la combinación de potencia con una sintaxis clara, y un núcleo mantenido pequeño por diseño.
Nota: Desarrollo modular
OpenERP utiliza módulos como contenedores de características, para fomentar el desarrollo mantenible y robusto. Módulos de función proporcionan
Consejo: Enlaces de interés
aislamiento, un nivel adecuado de abstracción, y los patrones MVC obvias.
• sitio web principal, con descargas de OpenERP: www.openerp.com

• Funcional y técnica documentación: doc.openerp.com Composición de un módulo


• Recursos de la comunidad: www.openerp.com/community Un módulo puede contener cualquiera de los siguientes elementos:

• servidor de integración continua: runbot.openerp.com • objetos de negocio: declarado como clases de Python extienden la
osv.Model clase, la persistencia de estos recursos está completamente gestionados por OpenERP;
• Learning Python: doc.python.org

• datos: XML / CSV con los meta-datos (puntos de vista y los flujos de trabajo de declaración), datos de
Instalación de OpenERP configuración (módulos de parametrización) y datos de demostración (opcional pero recomendado para la

OpenERP se distribuye como paquetes / instaladores para la mayoría de plataformas, sino que también se puede instalar prueba, por ejemplo, las ideas de la muestra);

desde la fuente en cualquier plataforma. • asistentes: formularios interactivos con estado que se utilizan para ayudar a los usuarios, a menudo disponible como
acciones contextuales sobre los recursos;
OpenERP Arquitectura • informes: RML (formato XML), plantillas de informes MAKO o OpenOffice, se va a combinar con cualquier
tipo de datos de la empresa, y generar HTML, ODT o informes en formato PDF.

estructura de módulo Típica


Cada módulo está contenido en su propio directorio dentro de la servidor / bin / complementos
directorio de la instalación del servidor.

Nota: Se puede declarar su propio directorio de complementos en el archivo de configuración de OpenERP (pasa al servidor con el - do opción) utilizando
la addons_path opción.

56789complementos /
| - idea/ # El directorio de módulos
| - manifestación/ # Demo y prueba de población unidad de datos
OpenERP utiliza el paradigma cliente-servidor conocido: el cliente se ejecuta como una aplicación Javascript en su | - i18n / # Los archivos de traducción
navegador, la conexión con el servidor utilizando el protocolo JSON-RPC a través de HTTP (S). clientes ad-hoc | - informe/ # Las definiciones de informe

también pueden ser fácilmente escritas y conectarse al servidor utilizando XML-RPC o JSON-RPC. 10 | - seguridad/ # Declaración de los grupos y los derechos de acceso
11 | - ver/ # Views (formas), listas, menús y acciones
12 | - mago/ # definiciones Wizards
13 | - flujo de trabajo / # las definiciones de flujo de trabajo
Consejo: Procedimiento de instalación 14 | - __init__.py # paquete de Python inicialización (requerido)
El procedimiento de instalación de OpenERP es probable que evolucione (dependencias, etc.), así que asegúrese de comprobar siempre la 15 | - __openerp__.py # Declaración módulo (requerido)
documentación específica (empaquetado y en el sitio web) para los últimos procedimientos. Ver 16 | - idea.py # clases de Python, objetos del módulo

http://doc.openerp.com/v7.0/install
los __ init__.py archivo es el descriptor de módulo de Python, porque un módulo de OpenERP es también un módulo
La instalación de paquetes de Python regular.
Windows Linux todo-en-uno instalador __init__.py:
17 # Importar todos los archivos y directorios que contienen el código Python
todo-en-uno los paquetes disponibles para basada en Debian (.deb) y RedHat- basados ​(.rpm) 18 importar idea, mago, informe

Mac distribuciones
No todo-en-uno instalador, necesita ser instalado desde la fuente los __ openerp__.py es el módulo de OpenERP manifiesto y contiene un diccionario de Python individual con la
declaración del módulo: su nombre,
dependencias, la descripción y composición.
__openerp__.py:
Instalación desde el código fuente 19 { 'nombre' : 'Idea' ,
Hay dos alternativas: el uso de un archivo comprimido en la página web, o conseguir directamente la fuente 20

21 'versión' : '1.0' ,
utilizando Bazar (Fuente distribuido de control de versiones). También es necesario para instalar las dependencias
22 'autor' : 'OpenERP' ,
necesarias (PostgreSQL y algunas bibliotecas de Python - véase la documentación doc.openerp.com ). 23 'descripción' : 'Ideas módulo de gestión' ,
24 'categoría' : ' Empresa Innovación' ,
25 'sitio web' : ' http://www.openerp.com ' ,
punta Compilación: OpenERP está basado en Python, no se necesita ningún paso de compilación 26 'Depende' : [ 'base' ], # Lista de dependencias, acondicionamiento orden de inicio
procedimiento bazar Típica checkout (en Linux basada en Debian) 27 'datos' : [ # archivos de datos van a cargar al módulo de instalación
1234 PS sudo apt-get install bzr # Instalar Bazar (software de control de versiones) 28 'Seguridad / groups.xml' , # Siempre primeros grupos de carga!
PS gato bzr lp -d: ~ OpenERP-dev / OpenERP-tools / tronco setup.sh | sh # Obtener instalador 29 'Seguridad / ir.model.access.csv' , # Derechos de acceso de carga después de que grupos
PS hacer init-v70 # Instalar OpenERP 7.0 30 'Flujo de trabajo / workflow.xml' ,
PS hacer que el servidor # Comience OpenERP Server con Web incorporado 31 'View / views.xml' ,

Copyright © 2013 Abrir objeto de Prensa - Todos los derechos reservados - Ver licencia en la página 10. p.1 / 10
32 'Asistente / wizard.xml' ,
33 'Informe / report.xml' , predefinida osv.osv atributos de los objetos de negocio
34 ],
35 'manifestación' : [ 'Demo / demo.xml' ], # datos de demostración (para pruebas de unidad) _sql código SQL para crear la tabla / vista para este objeto (si _ auto es falso) - se puede
36 }
sustituir por la ejecución de SQL en el en eso() método

Objeto-Relacional de Servicio de Mapas - ORM _mesa nombre de la tabla SQL a utilizar (por defecto: _ nombre con puntos ''. reemplazado por
componente clave de OpenERP, el ORM es una capa de mapeo relacional de objetos completa, liberando a los guiones '_')
desarrolladores de tener que escribir la plomería básica de SQL. Los objetos de negocio se declaran como clases
de Python que heredan de la osv.Model clase, lo que les hace mágicamente persistió por la capa ORM. mecanismos de herencia

atributos predefinidos se utilizan en la clase de Python para especificar las características de un objeto de negocio
para el ORM:

idea.py:
37 desde osv importar OSV, campos
38 clase ideaidea
ideaidea (Osv.Model): _name = 'Idea.idea'
39

40 _columns = {
41 'nombre' : Fields.char ( 'Título' , Size = 64 , Requerido = Cierto , Traducir = Cierto ),
42 'estado' : Fields.selection ([( 'borrador' , 'Borrador' ), ( 'confirmado' , 'Confirmado' )], 'Estado' , Requerido = Cierto , De sólo lectura
43 = Cierto ),
44 # Descripción es de sólo lectura cuando no redactar!
45 'descripción' : Fields.text ( 'Descripción' , De sólo lectura = Cierto , Estados = { 'borrador' : [( 'solo
46 lectura' , Falso )]}),
47 'activo' : Fields.boolean ( 'Activo' ),
48 'Invent_date' : Fields.date ( 'Inventar fecha' ),
49 # Por convención, los campos many2one terminan con '_id'
50 'Inventor_id' : Fields.many2one ( 'Res.partner' , 'Inventor' ),
51 'Inventor_country_id' : Fields.related ( 'Inventor_id' , 'país' ,
52 = sólo lectura Cierto , Tipo = 'Many2one' , Relación = 'Res.country' ,
53 Cadena = 'País' ),
54 # por convención, * Campos 2many terminan con '' _ids
55 '' vote_ids : Fields.one2many ( 'Idea.vote' , 'Idea_id' , 'Votos' ),
56 '' sponsor_ids : Fields.many2many ( 'Res.partner' , 'Idea_sponsor_rel' ,
57 'Idea_id' , 'Documento de identidad del patrocinador' , '' Los patrocinadores ),
58 'Puntuación' : Fields.float ( 'Puntuación' , Dígitos = ( 2 , 1 )),
59 'categoria ID' = Many2one ( 'Idea.category' , 'Categoría' ),
60 } _defaults = {
61

62 'activo' : Cierto , # las ideas son activos por defecto


63 'estado' : 'borrador' , # las ideas están en estado de borrador de forma predeterminada
64 } def _check_name ( yo, cr, UID ids):
65

66 para idea en yo. Examinar (cr, UID IDS):


67 Si 'correo no deseado' en idea.name: falso retorno # No se puede crear ideas con el spam!
68 devolver True
69 _sql_constraints = [( 'Name_uniq' , 'nombre único)' , 'Las ideas deben ser únicos! )] _Constraints = [(_check_name, "Por favor, tipos de campo ORM
70 evita el spam en las ideas! , [ 'nombre' ])] Los objetos pueden contener 3 tipos de campos: simple, relacionales, y funcionales.
71
Sencillo tipos son números enteros, flotadores, booleanos, cadenas, etc. Relacional campos representan las
predefinida osv.osv atributos de los objetos de negocio relaciones entre los objetos (one2many, many2one, Many2Many). Funcional campos no se almacenan en la base
de datos, pero calculan sobre la marcha como las funciones de Python. Algunos ejemplos relevantes en el idea
_nombre ( necesario) Nombre del objeto de negocio, en la notación de puntos (en el espacio de nombres del módulo)

clase anterior se indican con los números de línea correspondientes (→ XX, XX)
_columns ( requerido) {declaración de campo Nombre de campo →} diccionario

_defaults diccionario: {nombre de campo → proporcionando predeterminado literal o función}


ORM campos de tipos
_defaults [ 'nombre' ] = lambda auto, cr, uid, el contexto: 'huevos'
atributos comunes soportados por todos campos (opcional menos que se especifique)
_auto Si Cierto ( por defecto) el ORM creará la tabla de base de datos - a establecer Falso para
crear su propia tabla / vista dentro de la en eso() método
• cuerda: Etiqueta de campo ( necesario) • contexto: diccionario con parámetros contextuales

• necesario: Cierto Si obligatoria (para campos relacionales)


_heredar _nombre del objeto de negocio de los padres (por herencia)
• solo lectura: Cierto Si no se puede editar • change_default: Es cierto que si el campo debe ser utilizable como

_inherits para decoración herencia: el diccionario de la asignación _ nombre del objeto (s) empresa • ayuda: ayuda sobre herramientas
condición para valores por defecto en los clientes

matriz a los nombres de los correspondientes campos de clave externa a utilizar • seleccionar: Cierto para crear un índice de
• establece lo siguiente: cambios dinámicos a los atributos

comunes de este campo en función de la estado campo (→


base de datos en esta columna
42,46)
_constraints lista de tuplas que definen las restricciones de Python, en la forma campos simples
(Func_name, mensaje, campos) ( → 70)

_sql_constraints lista de tuplas que definen las limitaciones de SQL, en la forma


(Nombre, sql_def, mensaje) ( → 69)

_log_access Si es True (predeterminado), 4 campos (create_uid, create_date, write_uid, write_date) se


utiliza para registrar las operaciones a nivel de grabación, hecha accesible a través de la perm_read
() función

_orden Nombre del campo utilizado para ordenar los registros en listas (por defecto: 'id')

_rec_name campo alternativo para utilizar como nombre, utilizado por name_get () ( defecto: ' nombre' )

Copyright © 2013 Abrir objeto de Prensa - Todos los derechos reservados - Ver licencia en la página 10. p.2 / 10
ORM campos de tipos ORM campos de tipos
booleano (...) entero (...) la fecha (...) de fecha y 'activo' : campos. booleano ( ' Activo' ), propiedad( obj, type = 'flotan', view_load = Ninguno, nombre_de_grupo = Ninguno, ...)
'prioridad' : campos. entero( ' Prioridad' ),
hora (...) hora(...) atributo dinámico con derechos de acceso específicos
'fecha de inicio' : campos. fecha( ' Fecha de inicio' ),
• obj: objeto ( necesario)
carbonizarse( cuerdas, tamaño, traducir = False, ..) • traducir: Cierto Si los valores de campo pueden ser • tipo : tipo de campo equivalente
texto( cadena, traducir = False, ...)
traducidos por los usuarios, para char / texto campos
campos basados ​en texto
• Tamaño: opcional Tamaño máximo de carbonizarse campos
Consejo: campos relacionales simetría

(→ 41,45) • one2many ↔ many2one son simétricas



Many2Many ↔ Many2Many son simétricas cuando invertida (de intercambio campo1 y campo2 Si explícita)
flotador( cadena, dígitos = Ninguno, ...) dígitos: tupla (precisión, escala) (→ 58)
valor decimal • one2many ↔ many2one + many2one ↔ one2many = Many2Many

selección( valores, cuerdas, ...) • valores: lista de valores (tuplas de etiqueta clave) o función que
nombres de los campos especiales / Reservados
El campo que permite la selección entre un
devuelve una lista de este tipo ( required) ( → 42) Unos pocos nombres de campo están reservados para el comportamiento predefinido en OpenERP. Algunos de ellos son
conjunto de valores predefinidos
creados automáticamente por el sistema, y ​en ese caso, se ignorará cualquier campo facturan con ese nombre.
binario( cadena, filtros = Ninguno, ...) • filtros: filtros opcionales de nombre de archivo para la selección
Campo para almacenar un archivo o contenido 'imagen' : Fields.binary ( 'Imagen' ,
binarios. filtros = '*. png, *. gif' )
carné de identidad identificador de sistema único para el objeto
referencia( cadena, la selección, el tamaño, ..) • selección: modelo _ nombre de tipos de objetos permitidos y la
El campo con relación dinámica a nombre campo cuyo valor se utiliza para mostrar el registro de listas, etc. si falta, establecer _
etiqueta correspondiente (mismo formato que
cualquier otro objeto, asociada a un widget rec_name para especificar otro campo de usar
valores para selección campos) ( necesario)
de asistente
• tamaño: tamaño de la columna de texto usado para activo la visibilidad de palanca: registros con activo ajustado a Falso están ocultas por defecto

almacenarlo (formato de almacenamiento es " nombre_del_modelo, object_id' ) secuencia define el orden y permite arrastrar y soltar reordenamiento si visible en las vistas de lista
'contacto' : Fields.reference ( 'Contacto' , [( 'Res.partner' , 'Compañero' ), ( 'Res.partner.contact'
, 'Contacto' )]) estado etapas del ciclo de vida para el objeto, utilizados por el estados atributo

Identificación de los padres


define la estructura de árbol en los registros, y permite niño de operador
campos relacionales
parent_left ,
atributos comunes soportados por • dominio: filtro opcional en forma de argumentos para parent_right se utiliza junto con
el acceso a las_estructuras debandera
parent_store en el
árbol (véase objeto,Optimización
también permite más delrápido
rendimiento sección)
relacional campos la búsqueda (véase buscar ())
Fecha de Creación , utilizada para iniciar sesión creador, la última de actualización, fecha de creación y fecha de la última
many2one ( obj, ondelete = 'conjunto nulo', ...) • obj: _name del objeto de destino ( necesario) create_uid , actualización del registro. desactivada si _ log_access indicador se establece en Falso
(→ 50)
Relación hacia un objeto padre
• ondelete: manejo eliminación, por ejemplo, " conjunto nulo ', write_date , (Creado por ORM, no añadirlos)
' cascada ', ver documentación de PostgreSQL write_uid
(usando una clave externa)
one2many ( obj, identificador de campo, ...) ( → 55) • obj: _name del objeto de destino ( necesario)
relación virtual hacia varios Trabajar con el ORM
• id_campo: nombre de campo de many2one inversa, es decir, clave
objetos (inversa de many2one) Heredando de la osv.Model clase hace que todos los métodos ORM disponible en los objetos de negocio. Estos
externa correspondiente ( necesario)
métodos pueden ser invocados en el yo objeto dentro de la propia clase Python (ver ejemplos en la tabla de abajo),
o desde fuera de la clase mediante la obtención de primero una instancia a través del sistema de la piscina ORM.
Many2Many ( obj, rel, campo1, campo2, ...) • obj: _name del objeto de destino ( necesario)
(→ 56)
Bidireccional relación múltiple
• rel : nombre opcional de la tabla de relación de usar (por defecto:

asignado automáticamente en función de los nombres de modelo)


entre objetos Muestra el uso de ORM
• campo1: nombre de campo en rel tabla que almacena el ID del objeto 72 clase Idea2Idea2
Idea2Idea2 (Osv.Model): _inherit = 'Idea.idea'
73
actual (por defecto: basado en el modelo)
74 def _score_calc ( yo, cr, uid, ids, campo, arg, context = Ninguna ): res = {}
• campo2: nombre de campo en rel tabla que almacena el ID del objeto 75

de destino (por defecto: basado en el modelo) 76 # Este circuito genera sólo 2 consultas gracias a navegar ()!
77 para idea en yo. Examinar (cr, uid, ids, context = contexto):
campos funcionales
78 sum_vote = sum ([v.vote para v en idea.vote_ids]) avg_vote = sum_vote / len
función( fnct, arg = Ninguno, fnct_inv = Ninguno, fnct_inv_arg = Ninguno, type = 'flotar', fnct_search = Ninguno, 79 (idea.vote_ids) res [idea.id] = avg_vote
80
obj = Ninguno, almacenar = False, multi = False, ...)
81 regreso res
ámbito funcional de la simulación de un campo de bienes, calculada en lugar de almacenarse
82 _columns = {
83 # Vuelva a colocar la puntuación estática con un promedio de votos
• fnct: función para calcular el valor del campo ( necesario) 84 'Puntuación' : Fields.function (_score_calc, tipo = 'flotador' )
def fnct (self, Cr, uid, ids, nombre_campo, arg, contexto) 85 }

devuelve un diccionario { IDS → valores} con valores de tipo tipo


• fnct_inv: función que se utiliza para escribir un valor en el campo en lugar Métodos de ORM en osv.Model objetos
def fnct_inv (obj, Cr, uid, ID, nombre, valor, fnct_inv_arg, contexto)
OSV de acceso genérico • self.pool.get ( 'object_name') puede ser utilizado para obtener un
• tipo: tipo de campo simulado (puede ser cualquier otro tipo excepto 'función')
modelo de cualquier otro
• fnct_search: la función utiliza para buscar en este campo

def fnct_search (obj, cr, uid, obj, nombre, args)


Los parámetros comunes, utilizados por • cr: conexión de base (cursor)

devuelve una lista de tuplas argumentos a favor buscar() , p.ej [(' id', 'en', [1,3,5])]
múltiples métodos • UID: Identificación de usuario que realiza la operación

• obj : modelo _ nombre de campo simuladas si se trata de un campo relacional • iDs: grabar carné de identidad s para realizar la operación de

• tienda, múltiples : mecanismos de optimización (ver el uso en la sección de rendimiento) • contexto: diccionario opcional de parámetros
contextuales, por ejemplo { ' lang' : 'En_US' , ...}
relacionado( f1, f2, ..., type = 'flotan', ...) Campo acceso directo equivalente a navegar por los campos encadenados

• f1, f2, ...: campos encadenados para alcanzar el objetivo ( f1 requerido) ( → 51)

• tipo : tipo de campo de destino

Copyright © 2013 Abrir objeto de Prensa - Todos los derechos reservados - Ver licencia en la página 10. p.3 / 10
Métodos de ORM en osv.Model objetos Métodos de ORM en osv.Model objetos
buscar( cr, uid, dominio offset = 0, límite = • dominio: filtro de especificar criterios de búsqueda default_get ( cr, uid, campos, context = • campos: lista de los nombres de los campos
Ninguno, orden = Ninguno, context = Ninguno, Ninguno)
count = False)
• compensar : número opcional de registros para saltar
defs = yo. default_get (cr, uid,
• límite : número máximo de registros opcional para volver Devuelve: un diccionario de los valores por [ 'nombre' , 'activo' ])
Devuelve: lista de identificadores de registros # Activa debe ser predeterminada en True
defecto para los campos (establecidos en la
afirmar defs [ 'activo' ]
que coinciden con los criterios dados • orden : columnas opcionales para ordenar por (por defecto: clase de objeto, por las preferencias del
self._order ) usuario, o mediante el contexto)

• contar : Si Cierto, devuelve sólo el número de registros que perm_read ( cr, uid, IDS, detalles = true) • detalles : Si Cierto, * _ UID valores de los campos se
cumplan los criterios, no sus ids
reemplazan con pares ( Identificación, name_of_user)
Devuelve: una lista de diccionarios de
Operadores: #! =, =, >, > =, <, <=, como, iLike,
# En, no en, child_of, parent_left, parent_right propiedad para cada registro solicitado
• diccionarios devueltos contienen la identificación del objeto ( carné de identidad ),

# operadores de prefijo: '&' ( predeterminado), '|' '!', Identificación del usuario creador ( create_uid ), fecha de creación
# Fetch tiendas asociadas que no son spam + 34 socios ( Fecha de Creación ), Identificación del usuario actualizador ( write_uid ),
ids = yo. Búsqueda (cr, uid,
fecha de actualización ( write_date )
[ '|' , ( 'identificación del socio' , '! =' , 34 ),
'!' , ( ' nombre' , ' me gusta' , ' correo no deseado' ),], Orden = 'identificación permanentes = yo. perm_read (cr, uid, [ 42 , 43 ])
del socio' ) impresión 'creador:' , Permanentes [ 0 ].obtener( 'Create_uid' , 'n / A' )

crear( cr, uid, los valores, el contexto = None) • valores: diccionario de los valores de los campos fields_get ( cr, uid, campos = Ninguno, context = • campos: lista de los nombres de los campos
Ninguno) clase ideaidea
ideaidea (Osv.osv): (...)
idea_id = yo. crear (cr, uid,
Crea un nuevo registro con el valor { 'nombre' : 'Receta Spam' ,
_columns = {
especificado 'descripción' : 'Spam y huevos' , ' inventor_id' : 45 , Devuelve un diccionario de diccionarios de
'nombre' : Fields.char ( 'Nombre' , Size = 64 ) (...)
Devuelve: Identificación del nuevo registro campo, cada uno describiendo un campo del
})
objeto de negocio def test_fields_get ( yo, cr, uid):
leer( cr, uid, ids, campos = Ninguno, context = • campos: lista opcional de nombres de campo para volver (por
afirmar (Self.fields_get ( 'nombre' ) [ 'tamaño' ] == 64 )
Ninguno)
defecto: todos los campos) fields_view_get ( cr, uid, view_id = Ninguno, view_type = • view_id: Identificación de la vista o Ninguna
'forma', context = Ninguno, barra de herramientas =
Devuelve: lista de diccionarios con valores de los
resultados = yo. leer (cr, uid, [ 42 , 43 ],
False)
• v iew_type : Tipo de vista para volver si es view_id Ninguna (' forma',
[ 'nombre' , 'Inventor_id' ])
campos solicitados impresión 'Inventor:' , Los resultados [ 0 ] [ 'Inventor_id' ] 'árbol', ...)
Devuelve un diccionario que describe la • barra de herramientas : Cierto para incluir acciones contextuales
read_group ( cr, uid, dominio, campos, group_by, • dominio : filtro de búsqueda (ver buscar() )
composición de la vista solicitada
offset = 0, límite = Ninguno, order_by = Ninguno, def test_fields_view_get ( yo, cr, uid): idea_obj = yo. pool.get ( 'Idea.idea' )
context = Ninguno)
• campos: lista de nombres de campo para leer
(incluyendo vistas heredadas) Form_view = idea_obj.fields_view_get (cr, uid)

• agrupar por : campo o lista de campos para agrupar por

Devuelve: lista de diccionarios con valores de los • offset, límite : ver buscar() name_get ( cr, uid, ids, context = # Ideas deben mostrarse con fecha invención
def name_get ( yo, cr, UID ids): res = []
Ninguno)
campos solicitados, agrupadas por campo
• order_by : ordenamiento opcional para los resultados
group_by dado (s). Devuelve tuplas con la representación de para r en self.read (Cr, uid, ids [ 'nombre' , 'Fecha de Creación' ]) Res.append ((r [ 'carné
> impresión yo. read_group (cr, uid, [],
texto de objetos solicitados para las de identidad' ], '% S (% s)' (R [ 'nombre' ],año))
[ 'Puntuación' ], [ 'Inventor_id' ])
regreso res
[{ 'Inventor_id' : (1, 'Administrador' ), relaciones-a-muchos
'Puntuación' : 23, # Puntuación agregada
'Inventor_id_count' : 12, # Grupo de recuento
name_search ( cr, uid, name = '', domain = • nombre: nombre de objeto a buscar
Ninguno, operador = 'ilike', context = Ninguno,
}, { 'Inventor_id' : (3, 'Manifestación' ),
límite = 80)
• operador : operador para el criterio nombre

'Puntuación' : 13, • dominio, límite : mismo que para buscar() )


'Inventor_id_count' : 7,}]
lista de nombres de objetos que coinciden con # Países se pueden buscar por código o nombre
def name_search ( yo, cr, uid, name = '' , Domain = [], el
los criterios utilizados para proporcionar la
escribir( cr, uid, ids, los valores, el contexto = None) • valores: diccionario de los valores de campo para actualizar terminación de las relaciones a muchos
operador = 'me gusta' , Context = Ninguno, límite = 80
):
yo. escribir (cr, uid, [ 42 , 43 ], devuelve. Equivalente de ids = []
Actualizaciones de registros con identificadores Si nombre y len (nombre) == 2 :
{ 'nombre' : 'Spam y huevos' ,
buscar() en nombre + name_get ()
de dados con los valores dados. Devuelve: 'identificación del socio' : 24 , ids = yo. Búsqueda (cr, usuario,
}) [( 'código' , '=' , Nombre)] + args, límite = límite,
Verdadero
context = contexto)
dupdo( cr, uid, ID, por defecto, el contexto = None)
• por defecto: diccionario de los valores de los campos a modificar
si no iDs:
ids = yo. Búsqueda (cr, usuario,
en los valores copiados al crear el objeto duplicado [( 'nombre' , Operador, nombre)] + args, límite = límite,
Duplicados registro con ID dado actualización
context = contexto)
con por defecto valores. Devuelve: Verdadero regreso yo. name_get (cr, uid, ids)

exportar datos( cr, uid, ids, campos, context = • campos: lista de los nombres de los campos
yo. desvincular (cr, uid, [ 42 , 43 ]) Ninguno)
desconectar( cr, uid, ids, context = Ninguno)
• contexto puede contener import_comp ( defecto:

exportaciones campos para los objetos seleccionados, Falso) para que los datos exportados compatible con
Elimina los registros con los ID devoluciones
datos de importacion() ( puede impedir la exportación de algunos
dados: Verdadero devolviendo un diccionario con un
campos)
idea = yo. Examinar (cr, uid, 42) Datas matriz. Se utiliza cuando la exportación de
vistazo( cr, uid, ids, context = Ninguno)
impresión 'Descripción Idea:' , idea.description datos a través del menú del cliente.
impresión 'Código de país Inventor:' , Idea.inventor_id.address [0]
Obtiene registros como objetos, lo que permite .country_id.code datos de importacion( cr, uid, los campos, los datos,
• campos: lista de los nombres de los campos
utilizar la notación punto-a navegar por los para votar en idea.vote_ids: modo = 'init', current_module = '', noupdate = False, el
impresión 'Voto% 2.2f' % vote.vote contexto = Ninguno, nombre de archivo = None)
• datos: los datos de importación (véase exportar datos() )
campos y las relaciones devoluciones: objeto o
lista de objetos solicitados
• modo: ' init' o 'actualización' para la creación del registro

• current_module : Nombre del módulo


Importaciones datos proporcionados en el
• ninguna actualización: bandera para la creación del registro
módulo dado Usado al exportar datos a través
de menú del cliente
• nombre del archivo : El archivo opcional para almacenar el estado

parcial de importación para la recuperación

Propina: utilizar leer() a través de llamadas de servicio web, pero prefieren vistazo() internamente

Copyright © 2013 Abrir objeto de Prensa - Todos los derechos reservados - Ver licencia en la página 10. p.4 / 10
carné de identidad identificador de la acción en la tabla ir.actions.act_window , debe ser único
La construcción de la interfaz del módulo nombre nombre de la acción ( necesario)
Para construir un módulo, el mecanismo principal es la de insertar los registros de datos que declaran los view_id vista específica para abrir (si se utiliza, vista de prioridad más alta que falta de tipo dado)
componentes de interfaz de módulo. Cada elemento de módulo es un registro de datos regular: menús, vistas, dominio tupla (véase buscar() argumentos) para filtrar el contenido de la vista
acciones, papeles, derechos de acceso, etc.
contexto diccionario de contexto para pasar a la vista

res_model modelo objeto en el que se define la vista para abrir


estructura XML comunes
view_type ajustado a formar para abrir los registros en modo de edición, se establece en árbol para una vista de jerarquía únicamente
archivos XML declaradas en un módulo de datos sección contener declaraciones de registro en la siguiente forma:
modo de vista Si view_type es formar, Lista permitido modos de visualización (registros forma, árbol, ...)

objetivo ajustado a nuevo para abrir la vista en una nueva ventana / emergente

87 <? Xml versión = "1,0" codificación = "UTF-8" ?> <OpenERP> search_view_id identificador de la vista de búsqueda para reemplazar el formulario de búsqueda por defecto ( nuevo en la versión 5.2)
88

89 <datos>
Declaración de menú
90 <registro modelo = "Object_model_name" carné de identidad = "Object_xml_id" > <Field nombre = "Campo1"
91 > valor1 </ Field> <field nombre = "Campo2" > valor2 </ Field> </ registro> <registro modelo = "Object_model_name2"
El elemento menuitem es un atajo para declarar una ir.ui.menu grabar y conectarlo con una acción correspondiente
92 carné de identidad = "Object_xml_id2" > <Field nombre = "Campo1" árbitro = "Module.object_xml_id" /> a través de una ir.model.data grabar.
93
<Field nombre = "Campo2" eval = "Ref ( 'module.object_xml_id')" /> </ Registro> </ data> </ 115 <menuitem carné de identidad = "Menu_id" padre = "Parent_menu_id" nombre = "etiqueta"
94 116 acción = "Action_id" grupos = "Grupo1, groupname2" secuencia = "10" />
OpenERP>
95

96 carné de identidadidentificador del elemento de menú, debe ser único


97 padre Identificación externa (xml_id) del menú principal en la jerarquía
98
nombre etiqueta de menú opcional (por defecto: nombre de la acción)
99

100 acción identificador de la acción a ejecutar, en su caso

grupos lista de grupos que pueden ver este elemento de menú (si falta, todos los grupos pueden verla)

Cada tipo de registro (vista, menú, acción) es compatible con un conjunto específico de entidades secundarias y atributos, secuencia índice entero para ordenar menuitems de hermanos (10,20,30 ..)
pero todos comparten las siguientes características especiales:
carné dela única
identidad (por módulo) identificador externo de este registro (xml_id)

árbitro puede utilizarse en lugar del contenido normal de elemento para hacer referencia a otra
Puntos de vista y la herencia
registro (que funciona a través del módulo de anteponiendo el nombre del módulo) Vistas forman una jerarquía. Varias vistas del mismo tipo pueden ser declaradas en el mismo objeto, y se utilizarán
en función de sus prioridades. Al declarar una vista heredada es posible añadir / quitar funciones en una vista.
eval utilizado en lugar del contenido elemento para proporcionar un valor como una expresión Python,
que pueden utilizar el árbitro() método para encontrar el identificador de base de datos para un determinado xml_id

Genérica declaración vista


Consejo: la validación de XML RelaxNG
117 <registro modelo = "Ir.ui.view" carné de identidad = "View_id" > <Field nombre
OpenERP valida la sintaxis y la estructura de archivos XML, de acuerdo a una gramática RelaxNG, que se encuentra en 118 = "nombre" > view.name </ Field >
servidor / bin / import_xml.rng . 119 <field nombre = "modelo" > object_name </ Field> <- tipos: árbol, forma, calendario, búsqueda, gráfico,
Para el uso manual de verificación xmllint: xmllint -relaxng /path/to/import_xml.rng <archivo> 120 Gantt, Kanban -> <field nombre = "tipo" > formulario </ Field> <field nombre = "prioridad" eval = "dieciséis" />
121
122
CSV sintaxis común 123 <field nombre = "arco" tipo = "Xml" >
Los archivos CSV también se pueden añadir en el datos sección y los registros se insertan por la OSV de datos de 124 <! - Ver el contenido: <form>, <tree>, <gráfico>, ... ->
125 </ Field> </
importacion() método, utilizando el nombre de archivo CSV para determinar el modelo de objetos de destino. El
126 record>
ORM vuelve a conectar automáticamente las relaciones basadas en los siguientes nombres de las columnas
especiales: carné de identidad única vista identificador
nombre nombre de la vista
id (xml_id) identificadores de columna que contiene para las relaciones
modelo modelo de objeto sobre el que se define la vista (lo mismo que res_model en acciones)
many2one_field vuelva a conectar usando many2one name_search ()
tipo tipo de vista: forma, árbol, gráfico, calendario, búsqueda, Gantt, Kanban
many2one_field: Identificación vuelva a conectar many2one basado en objeto de xml_id prioridad vista prioridad, más pequeño es más alta (por defecto: 16)

many2one_field.id vuelva a conectar many2one basado en objeto de Número de registro arco arquitectura de la vista, ver varios tipos de vista de abajo

many2many_field vuelva a conectar a través name_search (), múltiples valores w / comas


(formas para ver / editar registros)
many2many_field: Identificación vuelva a conectar w / objeto de xml_id, m ultiple valores de w / comas
Los formularios permiten la creación / edición o recursos, y corresponden a < form> elementos.
many2many_field.id vuelva a conectar w / objeto de Identificación de bases de datos, múltiples valores w / comas elementos permitidos todo (ver elementos de formulario a continuación)
one2many_field / campo crea one2many registro de destino y conjuntos campo valor 128 <form cuerda = "Forma Idea" > <Grupo columna = "6" colspan = "4" > <Grupo colspan = "5" columna = "6" > <Field nombre = "nombre"
129 seleccionar = "1" colspan = "6" /> <Field nombre = "Inventor_id" seleccionar = "1" /> <Field nombre = "Inventor_country_id"
ir.model.access.csv 130 /> <Field nombre = "Puntuación" seleccionar = "2" /> </ Grupo> <grupo colspan = "1" columna = "2" > <Field nombre
101 "Id", "nombre", "model_id: id", "group_id: id", "perm_read", "perm_write", "perm_create", "perm_unlink" "access_idea_idea",
127 = "activo" /> <Field nombre = "Invent_date" /> </ Group> </ group> <portátil colspan = "4" > <Página cuerda = "General"
102 "idea.idea", "model_idea_idea"" base.group_user", 1,0,0,0 "access_idea_vote", "idea.vote", "model_idea_vote", "base.group_user",
131 > <Separador cuerda = "Descripción" /> <Field colspan = "4" nombre = "descripción" sin etiqueta = "1" /> </
103 1,0,0,0
132 Page> <página cuerda = "Votos" > <Field colspan = "4" nombre = "vote_ids" sin etiqueta = "1" seleccionar = "1" >
133 <Tree>
Menús y acciones 134
135
Las acciones se declaran como registros regulares y se pueden activar en 3 maneras:
136
• haciendo clic en los elementos de menú vinculados a una acción específica 137

• haciendo clic en los botones en las vistas, si éstos están conectados a las acciones
138
139

• acciones como contextual sobre un objeto (visible en la barra lateral) 140


141
142
Declaración de acción 143
104 <registro modelo = "Ir.actions.act_window" carné de identidad = "Action_id" > <Field nombre = "nombre" > action.name </ Field> <field nombre 144
105 = "View_id" árbitro = "View_id" /> <Field nombre = "dominio" > [Lista de 3-tuplas (máximo 250 caracteres)] </ Field> <field nombre 145
106 = "contexto" > {Diccionario de contexto (máximo 250 caracteres)} </ Field> <field nombre = "Res_model" > object.model.name </ 146
107 Field> <field nombre =" view_type" > forma | árbol </ Field> <field nombre = "modo de vista" > forma, árbol, calendario, gráfico </ 147 <field nombre = "identificación del socio" /> <Field nombre = "votar" /> </ Árbol> </ field> </ page>
108 Field> <field nombre = "objetivo" > nuevo </ Field> <field nombre = "Search_view_id" árbitro = "Search_view_id" /> </ Registro> 148 <página cuerda = "Patrocinadores" > <Field colspan = "4" nombre = "sponsor_ids" sin etiqueta = "1" seleccionar = "1" />
109 149 </ Page> </ portátil>
110 150
111 151
112 152
113 153
114 154
155

Copyright © 2013 Abrir objeto de Prensa - Todos los derechos reservados - Ver licencia en la página 10. p.5 / 10
156 <field nombre = "estado" /> <Botón nombre = "Do_confirm" cuerda = "Confirmar" tipo = "objeto" /> </
157 Form>
Las listas y listas de árbol jerárquico
158 Las listas incluyen campo elementos, se crean con el tipo de árbol, y tienen una < árbol>
elemento padre. Se utilizan para definir las dos listas planas y listas jerárquicas.
Nuevo: la forma v7.0 API
A partir de OpenERP 7.0 una nueva forma de la visión de la API se ha introducido. Que se puede activar mediante la adición
version =”7.0” al < form> elemento. Esta nueva forma API permite mezclar código XHTML arbitraria con elementos regulares de forma OpenERP. También
atributos • colores : lista de colores asigna a las condiciones de Python

introduce algunos elementos específicos para producir formas de mejor aspecto, como < hoja> , <Header> , <Pie de página> , y un conjunto de clases de • editable: parte superior o fondo para permitir en el lugar de edición
propósito general CSS para personalizar la apariencia y el comportamiento de los elementos del formulario. Mejores prácticas y ejemplos para la nueva
• barra de herramientas : ajustado a Cierto para visualizar el nivel superior de las
forma de API están disponibles en el
jerarquías de objetos como una barra de herramientas (ejemplo: el menú)
técnico documentación:
http://doc.openerp.com/trunk/developers/server/form-view-guidelines elementos permitidos campo, grupo, separador, árbol, botón, filtro, de nueva línea
159 <árbol cuerda = "Idea Categorías" barra de herramientas = "1" colores = "Azul: estado == proyecto" > <Field nombre = "nombre" />
160 <Field nombre = "estado" /> </ Árbol>
161
formar elementos 162

atributos comunes para todos los elementos:

• cuerda: etiqueta del elemento

• nolabe l: 1 para ocultar la etiqueta de campo

• colspan : número de columna en la que debe abarcar el campo

• rowspan : número de filas en las que debe abarcar el campo

• columna : número de columna de este elemento debe asignar a sus elementos secundarios

• invisible : 1 para ocultar este elemento completamente

• eval : evaluar el código Python como elemento de contenido (contenido es una cadena por defecto)

• attrs : Mapa de Python que define las condiciones dinámicas en los siguientes atributos: solo lectura ,

invisible , necesario basado en las tuplas de búsqueda en otros valores de campo

campo reproductores automáticos en función del tipo de campo correspondiente. atributos:

• cuerda: etiqueta del campo para esta vista particular

• sin etiqueta : 1 para ocultar la etiqueta de campo

• necesario : anular necesario atributo de campo de modelo para esta vista

• solo lectura : anular solo lectura atributo de campo de modelo para esta vista

• contraseña : Cierto para ocultar los caracteres escritos en este ámbito

• contexto: código Python declarar un diccionario de contexto

• dominio : código Python lista de tuplas declarar para restringir los valores

• on_change : Python método a llamar cuando se cambia el valor del campo

• grupos : lista separada por comas de grupo (id) permitió ver a este campo

• Reproductor : seleccione widget de campo alternativo ( URL, correo electrónico, imagen, float_time,
referencia, html, ProgressBar, barra de estado, mango, etc.)

propiedades widget de dinámica que muestra todas las propiedades disponibles (sin atributo)

botón widget de hacer clic asociado a las acciones. atributos específicos:


• tipo : tipo de botón: flujo de trabajo ( defecto), objeto, o acción
• nombre : señal de flujo de trabajo, nombre de la función (sin paréntesis) o acción para llamar

(dependiendo tipo )
• confirmar : texto del mensaje de confirmación cuando se hace clic

• estados : lista separada por comas de estados en los que se muestra en este botón

separador línea de separación horizontal para las vistas de estructuración, con la etiqueta opcional

nueva línea lugar a los titulares para completar la línea actual de la vista
etiqueta subtítulo de texto libre o leyenda en la forma

grupo utilizado para organizar los campos en grupos con etiqueta opcional (añade marco)

cuaderno, cuaderno elementos son contenedores ficha para página elementos. atributos:
página • nombre : etiqueta de la pestaña / página

• posición : las orejetas de posicionamiento en el cuaderno ( en el interior, arriba, abajo, izquierda, derecha)

vistas dinámicas
Además de lo que se puede hacer con estados y attrs atributos, las funciones pueden ser llamados por elementos
de la vista (por medio de botones de tipo objeto , o on_change
desencadena en los campos) para obtener un comportamiento dinámico. Estas funciones pueden alterar la interfaz de vista
mediante la devolución de un mapa Python con las siguientes entradas:

valor un diccionario de nombres de campo y sus nuevos valores

dominio un diccionario de nombres de campos y sus dominios actualizadas de valor

advertencia un diccionario con una título y mensaje para mostrar un diálogo de advertencia

Copyright © 2013 Abrir objeto de Prensa - Todos los derechos reservados - Ver licencia en la página 10. p.6 / 10
Juntas Kanban Ver Herencia
A partir de OpenERP 6.1 una nueva visión del tipo de tarjeta versátil, en el que cada registro se representa como vistas existentes deben estar modificando a través de puntos de vista heredados, nunca directamente. Una visión
una pequeña “tarjeta Kanban”. Soporta arrastrar y soltar para gestionar el ciclo de vida de las tarjetas Kanban en heredada hace referencia a la vista padre usando el inherit_id
base a las dimensiones configurables. vistas Kanban se introducen en las notas de la versión de OpenERP 6.1 y campo, y puede añadir o modificar los elementos existentes en la vista por referencia a ellos a través de
definen utilizando el lenguaje de plantillas QWEB, documentado en la documentación técnica: ver http://bit.ly/18usDXt expresiones XPath, y especificando el apropiado posición .
y Propina: referencia XPath se puede encontrar en www.w3.org/TR/xpath

posición • dentro: ponga partido en el interior (por defecto) • antes de: poner antes del partido
http://doc.openerp.com/trunk/developers/web/qweb
• reemplazar: reemplazar partido • después: poner después del partido
189 <! - lista de categorías mejorada idea ->
calendarios 190 <registro carné de identidad = "Idea_category_list2" modelo = "Ir.ui.view" > <Field nombre =" nombre" > id.category.list2 </
Vistas utilizan para mostrar los campos de fecha como eventos de calendario ( < Calendario> padre) 191 Field> <field nombre = "modelo" > ir.ui.view </ Field> <field nombre = "Inherit_id" árbitro = "Id_category_list" /> <Field nombre
= "arco" tipo = "Xml" > <XPath expr = "/ Árbol / campo [@ name = 'description']" posición = "después" > <Field nombre =

188
atributos color : nombre de campo para la segmentación de color 192 "idea_ids" cuerda = "Número de ideas" /> </ XPath> </ field> </ registro>
• DATE_START: nombre del campo que contiene acontecimiento de la fecha / hora de inicio
193
194
• Dia largo: longitud de un día de trabajo [] en horas (por defecto: 8) 195

• date_stop: nombre del campo que contiene la fecha tope evento / hora
196
197
o 198

• date_delay: nombre del campo que contiene la duración del evento

163
elementos permitidos campo (para definir la etiqueta para cada evento del calendario)
<calendario cuerda = "Ideas" DATE_START = "Invent_date" color = "Inventor_id" > <Field nombre = "nombre" /> </ Calendario>
Informes
164 Hay varios motores de informes en OpenERP, para producir informes de diferentes fuentes y en muchos formatos.
165

Diagramas de Gantt
Diagrama de barras que normalmente se utiliza para mostrar la programación del proyecto ( < Gantt> elemento padre)

atributos igual que < Calendario>

elementos permitidos nivel de campo

• nivel elementos se utilizan para definir los niveles de diagrama de Gantt, con el campo

cerrado utilizado como etiqueta para ese nivel de drill-down


166 <Gantt cuerda = "Ideas" DATE_START = "Invent_date" color = "Inventor_id" > <Nivel objeto = "Idea.idea" enlazar = "carné
167 de identidad" dominio = "[]" > <Field nombre = "Inventor_id" /> </ Nivel> </ Gantt>
168
169
170 expresiones especiales utilizados en el interior plantillas de informes producen datos dinámicos y / o modifican la estructura del
informe en el momento de la representación. analizadores de informes personalizados pueden ser escritos para apoyar
Gráficas (Gráficos) expresiones adicionales.
Vistas usadas para mostrar gráficos estadísticos ( < gráfico> elemento padre)
Propina: gráficos son más útiles con vistas personalizadas extraer estadísticas listas para su uso Formatos informe alternativo ( ver doc.openerp.com )
atributos • tipo: tipo de gráfico: barras, circulares ( defecto) sxw2rml OpenOffice 1.0 plantillas (.sxw) convierten a RML con la herramienta sxw2rml, y la RML
• orientación : horizontal Vertical prestan en HTML o PDF
RML plantillas RML prestados directamente como HTML o PDF
elementos permitidos campo, con un comportamiento específico:
RML datos XML + XSL:: XML, XSL hojas de estilo de RML para generar odt2odt RML
• primer campo de vista es el eje X, 2 Dakota del Norte uno es Y, 3 rd uno es Z
plantillas de OpenOffice (.odt) que se utilizan para producir directamente los documentos de
• 2 campos requeridos, 3 rd uno es opcional
OpenOffice (.odt)
• grupo atributo define el GROUP BY campo (ajustado a 1)

• operador atributo establece el operador de agregación a utilizar para otros campos


Expresiones utilizadas en las plantillas de informes de OpenERP
cuando se agrupa un campo ( +, *, **, mínimo máximo ) [[<Contenido>]] contenido de soportes de doble se evalúa como una expresión de Python en
171 <gráfico cuerda = "La puntuación total por la idea del inventor" tipo = "bar" > <Field nombre = "Inventor_id" base a las siguientes expresiones
172 /> <Field nombre = "Puntuación" operador = "+" /> </ Gráfico>
173 expresiones predefinidas:
174 • objetos contiene la lista de registros para imprimir
• datos viene desde el asistente de la presentación del informe
vistas de búsqueda
vistas de búsqueda personalizar el panel de búsqueda en la parte superior de otros puntos de vista.
• usuario contiene el usuario actual ( browse_record , como lo devuelve vistazo() )

elementos permitidos campo, grupo, separador, etiqueta, buscar, filtrar, nueva línea,
• hora da acceso a Python hora módulo

propiedades • repeatin (lista, 'var', 'etiqueta') repite el elemento primario actual llamado etiqueta para cada objeto en lista , haciendo

• filtrar elementos permiten definir el botón de filtros de dominio


que el objeto disponible como var durante cada bucle

• la adición de una contexto atribuir a los campos hace widgets que alteran el contexto de
• setTag ( 'tag1', 'tag2') sustituye a la matriz RML tag1 con tag2

búsqueda (útil para los campos sensibles al contexto, por ejemplo, los precios de listado de • removeParentNode ( 'etiqueta') elimina los padres elemento RML etiqueta

precios-dependiente) • formatLang (valor = 2, dígitos, fecha = False, fecha_hora = False, agrupando = True, monetaria = False) se puede utilizar
176 <Búsqueda cuerda = "Buscar las ideas" > <Grupo columna para dar formato a una fecha, hora o cantidad de acuerdo a la configuración regional
177 = "6" colspan = "4" > <Filtro s Tring = "Mis ideas "
178
175 dominio = "[( 'Inventor_id', '=', uid)]" • setlang ( 'LANG_CODE') Establece el idioma y la configuración regional actual para traducciones
179 ayuda = "Mis propias ideas" /> <Field nombre
declaración de informe
180 = "nombre" /> <Field nombre = "descripción" /> 199 <! - A continuación se crea registros en el modelo ir.actions.report.xml ->
181 <Field nombre = "Inventor_id" /> 200 <informe carné de identidad = "Idea_report" cuerda = Imprimir "Ideas" modelo = "Idea.idea"
182
201 nombre = "Idea.report" RML = "Idea / informe / idea.rml" >
183 <! - siguiente campo de contexto es sólo para ilustración -> 202 <! - Uso complementos / base_report_designer / asistente / tiny_sxw2rml / tiny_sxw2rml.py
184 <field nombre = "Inventor_country_id" Reproductor = "selección" 203 para generar el archivo de plantilla RML partir de una plantilla .sxw ->
185 contexto = "{ 'Inventor_country': self}" />
186 </ Group> </ carné de identidad identificador único informe
187 search>
nombre nombre para el informe ( necesario)

Copyright © 2013 Abrir objeto de Prensa - Todos los derechos reservados - Ver licencia en la página 10. p.7 / 10
cuerda título del informe ( necesario)

modelo modelo de objeto sobre el que se define el informe ( necesario)


Los flujos de trabajo
RML, sxw, XML, XSL informe de ruta de fuentes plantilla (a partir de complementos ), dependiendo informe
Los flujos de trabajo pueden estar asociadas con cualquier objeto

auto ajustado a Falso utilizar un analizador personalizado, por subclases report_sxw.rml_parse y declarando el informe de la
en OpenERP, y son totalmente adaptable.
siguiente manera:
report_sxw.report_sxw (REPORT_NAME, object_model, rml_path, parser = CustomClass) Los flujos de trabajo se utilizan para estructurar y gestionar los ciclos
encabezamiento ajustado a Falso para suprimir el encabezado del informe (por defecto: Cierto) de vida de los objetos de negocio y documentos, y definir las
grupos lista separada por comas de los grupos pueden ver este informe transiciones, triggers, etc., con herramientas gráficas. Flujos de
menú ajustado a Cierto para visualizar este informe en el menú de impresión (por defecto: Cierto) trabajo, actividades nodos (o acciones) y las transiciones
palabras clave especifique informe tipo de palabra clave (por defecto: client_print_multi) (condiciones) se declaran como registros XML, como de costumbre.
Las fichas que navegan en los flujos de trabajo se denominan artículos
Propina: RML Guía del usuario: www.reportlab.com/docs/rml2pdf-userguide.pdf de trabajo.
Ejemplo RML extracto de informe:
204 <Historia>
205 <blockTable estilo = "Mesa" > <Tr>
206 declaración de flujo de trabajo
207 <Td> <para estilo = "Título" > nombre idea </ Para> </ td> <td> <para estilo = "Título" Los flujos de trabajo se declaran en los objetos que poseen un campo de estado (véase el ejemplo idea clase
208 > Puntuación </ Para> </ td> </ tr> <tr>
209
en la sección de ORM)
216 <registro carné de identidad = "Wkf_idea" modelo = "Flujo de trabajo" >
210
217 <Field nombre = "nombre" > idea.basic </ Field> <field nombre = "OSV"
211 <Td> <para> [[Repeatin (objetos, 'o', 'tr')]] [[o.name]] </ Para> </ td> <td> <para > [[O.score]] </ Para> </ td> </ tr>
218 > idea.idea </ Field> <field nombre = "On_create" eval = "1" /> </
212
219 Registro>
213
220
214 </ BlockTable> </
215 historia>

carné de identidad identificador de registro único de flujo de trabajo

nombre nombre para el flujo de trabajo ( necesario)

osv modelo de objeto sobre el que se define el flujo de trabajo ( necesario)

on_create Si Cierto, un elemento de trabajo se crea una instancia de forma automática para cada nuevo osv grabar

De flujo de trabajo Actividades (nodos)


221 <registro carné de identidad = "Act_confirmed" modelo = "Workflow.activity" > <Field nombre = "nombre"
222 > confirmado </ Field> <field nombre = "Wkf_id" árbitro = "Wkf_idea" /> <Field nombre = "tipo"
223 > función </ Field> <field nombre = "acción" > action_confirmed () </ Field> </ record>
224
225
226

carné de identidad identificador actividad única

wkf_id identificador de flujo de trabajo de los padres

nombre etiqueta nodo actividad

flow_start Cierto para que sea un nodo 'empezar', que recibe un elemento de trabajo para cada instancia del flujo de trabajo

flow_stop Cierto para que sea un nodo de 'fin', terminando el flujo de trabajo cuando todos los artículos lleguen a él

join_mode comportamiento lógico de este nodo con respecto a las transiciones entrantes:

• XOR: active en la primera transición de entrada (por defecto)

• Y: espera a que todas las transiciones entrantes a convertirse válida

split_mode comportamiento lógico de este nodo con respecto a las transiciones salientes:

• XOR: una transición válida es necesario, envíe elemento de trabajo en el mismo (por defecto)

• O: enviar elementos de trabajo en todas las transiciones válidas (0 o más), de forma secuencial

• Y: enviar un elemento de trabajo en todas las transiciones válidas a la vez (tenedor)

tipo tipo de acciones a realizar cuando el nodo es activado por una transición:

• tonto para llevar a cabo ninguna operación cuando se activa (por defecto)

• función para invocar una función determinada por acción

• subflujo para ejecutar el subflujo con subflow_id, invocación acción para determinar el ID de registro del registro para el
cual la corriente parcial debe ser instanciada. Si la acción no devuelve ningún resultado, se elimina el elemento de trabajo.

• para todo de interrumpir el flujo de trabajo tras la activación

subflow_id Si especie subflujo, Identificación del subflujo para ejecutar (uso árbitro atributo o buscar con una tupla)

acción objeto llamada al método, utilizado si la clase es función o subflujo. Esta función también debe actualizar la estado campo del
objeto, por ejemplo, para una función tipo:
def action_confirmed ( yo, cr, UID ids):
yo. Write (cr, UID, los ID de { 'estado' : 'confirmado' })
# ... realizar otras tareas
devolver True

Workflow Transitions (bordes)


Condiciones se evalúan en este orden: ROLE_ID, señal, la expresión condición
227 <registro carné de identidad = "Trans_idea_draft_confirmed" modelo = "Workflow.transition" > <Field nombre = "Act_from"
228 árbitro = "Act_draft" /> <Field nombre = "acto para" árbitro = "Act_confirmed" /> <Field nombre = "señal" > button_confirm
229 </ Field> <field nombre = "Identificación del rol" árbitro = "Idea_manager" /> <Field nombre = "condición" > 1 == 1 </
230 Field> </ record>
231
232
233

act_from, act_to identificadores de las actividades de origen y de destino

señal nombre de un botón de tipo de flujo de trabajo que desencadena esta transición

Copyright © 2013 Abrir objeto de Prensa - Todos los derechos reservados - Ver licencia en la página 10. p.8 / 10
Identificación del rol referencia al papel que debe tener el usuario para desencadenar la transición (véase roles) 273 <field nombre = "View_type" > formar </ Field> <field nombre = "modo
274 de vista" > formar </ Field> <field nombre = "objetivo" > nuevo </
condición expresión de Python que se deben evaluar a Cierto para la transición a ser activado
275 Field> </ record>
276

Propina: OpenERP cuenta con un editor de flujo de trabajo gráfico, disponible por el cambio a la vista Diagrama de flujo de trabajo mientras se ve una
en la Configuración> Técnicas> Flujos de trabajo

WebServices - XML-RPC
OpenERP es accesible a través de interfaces XML-RPC, para los que existen bibliotecas en muchos idiomas.
Seguridad
mecanismos de control de acceso se deben combinar para lograr una política de seguridad coherente. ejemplo Python
277 importar xmlrpclib
278 # . . . definir host, el puerto DB, USUARIO, PASS
279 url = 'Http: //% s:% d / xmlrpc / common' % (HOST, PORT) calcetín =
mecanismos de control de acceso basadas en grupos 280 xmlrpclib.ServerProxy (url) uid = sock.login (DB, USER, PASS)
Los grupos se crean como registros normales en el res.groups el modelo y el acceso al menú, otorgada a través menú 281
282 impresión "Conectado como% s (uid:% d)" % (USER, uid)
definiciones. Sin embargo, incluso sin un menú, objetos todavía pueden ser accesibles indirectamente, de modo
real permisos de nivel objeto 284 # Crear una nueva idea
( crear, leer, escribir, desvincular) debe definirse para grupos. Por lo general, se insertan a través de archivos 285 url = 'Http: //% s:% d / xmlrpc / objeto' % (HOST, puerto) calcetín =
286 xmlrpclib.ServerProxy (URL) args = {
CSV dentro de los módulos. También es posible restringir el acceso a campos específicos en una visión o un 283
objeto utilizando el campo de grupos atributo. 287
'nombre' : 'Otra idea' ,
288
'descripción' : 'Esta es otra de mis ideas' ,
289
ir.model.access.csv 290 'Inventor_id' : Uid,} idea_id = sock.execute (DB, uid, PASS, 'Idea.idea' , 'crear' , Args)
234 "Id", "nombre", "model_id: id", "group_id: id", "perm_read", "perm_write", "perm_create", "perm_unlink" "access_idea_idea", 291

235 "idea.idea", "model_idea_idea"," base.group_user", 1,1,1,0 "access_idea_vote", "idea.vote", "model_idea_vote", "base.group_user", 292

236 1,1,1,0
ejemplo PHP
Roles 294 <?
295 incluir ( 'Xmlrpc.inc'); // uso de la biblioteca phpxmlrpc, disponible en SourceForge
Los roles se crean como registros normales en el res.roles modelo y sólo se utiliza para las transiciones de estado de flujo
296 // ... $ definir HOST, PUERTO $, $ DB, $ USER, $ PASS
de trabajo a través de transiciones Identificación del rol atributo. 293 $ cliente = nuevo xmlrpc_client ( "Http: // $ HOST : $ PUERTO / Xmlrpc / común" );
297 $ msg = nuevo xmlrpcmsg ( "iniciar sesión" );
298 $ msg -> addParam ( nuevo xmlrpcval ( $ DB , "cuerda" ));

Wizards 299
300
$ msg -> addParam ( nuevo xmlrpcval ( $ USUARIO , "cuerda" ));
$ msg -> addParam ( nuevo xmlrpcval ( $ PASS , "cuerda" )); resp = $ cliente ->
Wizards describen sesiones interactivas con estado con el usuario a través de formularios dinámicos. Se construye 301 send ( $ msg ); = uid $ resp -> valor de () -> scalarval ()
302
a partir de la osv.TransientModel
303 eco "Conectado como $ USUARIO (UID: $ uid )"
clase y de forma automática recolección de basura después de su uso. Están definidos utilizando la misma API y
puntos de vista como normal osv.Model objetos. 305 // crear una nueva idea
306 $ arrayVal = Array (
307 'nombre' => nuevo xmlrpcval ( "Otra idea" , "cuerda" ),
modelos Wizard (TransientModel) 304 'descripción' => nuevo xmlrpcval ( "Esta es otra de mis ideas" , "cuerda" ),
238 desde osv importar campos, OSV 308 'Inventor_id' => nuevo xmlrpcval ( $ uid , "En t" ),
239 importar fecha y hora 309 );
clase cleanup_wizard
cleanup_wizard (Osv.TransientModel): _name = 'Idea.cleanup.wizard' 310
240 $ msg = nuevo xmlrpcmsg ( 'ejecutar' );
311
237 $ msg -> addParam ( nuevo xmlrpcval ( $ DB , "cuerda" ));
312
241 _columns = { $ msg -> addParam ( nuevo xmlrpcval ( $ uid , "En t" ));
313
242 'Idea_age' : Fields.integer ( 'Edad (en días)' ), $ msg -> addParam ( nuevo xmlrpcval ( $ PASS , "cuerda" ));
314
243 } def limpiar (Self, Cr, uid, ids, context = Ninguno): $ msg -> addParam ( nuevo xmlrpcval ( "Idea.idea" , "cuerda" ));
315
244
316 $ msg -> addParam ( nuevo xmlrpcval ( "crear" , "cuerda" ));
245 idea_obj = self.pool.get ( 'Idea.idea' ) 317 $ msg -> addParam ( nuevo xmlrpcval ( $ arrayVal , "Estructura" ));
246 para fenómeno en self.browse (Cr, uid, ids): 318 $ resp = $ cliente -> send ( $ msg );
247 Si wiz.idea_age <= 3 : 319 ?>
248 aumento osv.except_osv ( 'Error de usuario' , 'Por favor seleccione una edad más grande' )
249 límite = datetime.date.today () - datetime.timedelta (día = wiz.idea_age) ids_to_del = idea_obj.search (cr, uid, [( 'Fecha
de Creación' , '<' , Limit.strftime ( '% Y-% m-% d 00:00:00' ))], Context = contexto)
internacionalización
250
251
252 idea_obj.unlink (cr, uid, ids_to_del)
Cada módulo puede proporcionar a sus propias traducciones dentro de la i18n directorio, por tener archivos con el
253 regreso {}
nombre LANG.po dónde LANG es el código de región para el idioma o el idioma y el país combinación cuando

vistas del asistente difieren (por ejemplo,


pt.po o pt_BR.po ). Las traducciones serán cargados automáticamente por OpenERP para todos los idiomas
Wizards utilizar vistas regulares y sus botones pueden utilizar un especial cancelar
habilitados.
atribuir a cerrar la ventana del asistente cuando se hace clic.
255 <registro carné de identidad = "Wizard_idea_cleanup" modelo = "Ir.ui.view" > <Field nombre = "nombre" > idea.cleanup.wizard.form Los desarrolladores utilizan siempre Inglés al crear un módulo, a continuación, exportar los términos módulo
256 </ Field> <field nombre = "modelo" > idea.cleanup.wizard </ Field> <field nombre = "tipo" > formar </ Field> <field nombre usando gettext de OpenERP MACETA exportar característica
257 = "arco" tipo = "Xml" > <Form cuerda = "Asistente para limpieza de Idea" > <Label colspan = "4" cuerda = "Seleccione la
( Configuración> Traducciones> Importar / Exportar> Exportar Traducción y seleccione “Nuevo
254 edad de las ideas a la limpieza" /> <Field nombre = "Idea_age" cuerda = "Edad (días)" /> <Grupo colspan = "4" >
258 <Botón cuerda = "Cancelar" especial = "cancelar" /> <Botón cuerda = "Limpiar" nombre = "limpiar" tipo = "objeto" /> </ Languag”para crear el archivo POT plantilla de módulo, a continuación, obtener los archivos PO traducidos de ella.
259 Group> </ form> </ field> </ registro>
260
Muchos IDE tienen plugins o modos de edición y combinación de archivos / PO POT.
261
262
263 Propina: El GNU g ettext Formato (Portable Object) utilizado por OpenERP está integrado en Launchpad, lo que es una plataforma de traducción
264
colaborativa en línea.
265
266
320 | - idea/ # El directorio de módulos
267
321 | - i18n / # Los archivos de traducción
268
322 | - idea.pot
idea.pot # Plantilla de traducción (exportado de OpenERP)
323 | - es.po # Traducción francés
asistente para la ejecución 324 | - pt_BR.po # Traducción al portugués de Brasil
Dichos asistentes se ponen en marcha a través de registros de acciones regulares, con un especial objetivo 325 | (...)

campo utiliza para abrir la vista de asistente en una nueva ventana.


269 <registro carné de identidad = "Action_idea_cleanup_wizard" modelo = "Ir.actions.act_window" > <Field nombre = "nombre" > Limpiar Propina: Por defecto exportación POT de OpenERP sólo extrae las etiquetas dentro de archivos XML o definiciones de campo en el interior en el código
​270 </ Field> <field nombre = "Tipo"> ir.actions.act_window </ Field> <field nombre = "Res_model" > idea.cleanup.wizard </ Python, pero cualquier cadena de Python se puede traducir de esta manera por lo rodea con el tools.translate._
271 Field> método (por ejemplo, _ ( ' Etiqueta' ) )
272

Copyright © 2013 Abrir objeto de Prensa - Todos los derechos reservados - Ver licencia en la página 10. p.9 / 10
Optimización del rendimiento Licencia
Como software de gestión empresarial por lo general tiene que lidiar con grandes cantidades de registros, es
posible que desee prestar atención a lo siguiente patrones anti-, para obtener un rendimiento constante: Copyright © 2010-2013 Abrir objeto Press. Todos los derechos reservados. Usted puede tomar copia electrónica

de este trabajo y distribuirlo si no se cambia el contenido. También puede imprimir una copia para ser leído por sí
• No coloque vistazo() llamadas dentro de los bucles, los puso antes y el acceso sólo los objetos navegado
mismo solamente. Tenemos contratos con diferentes editoriales en diferentes países para vender y distribuir
dentro del bucle. El ORM optimizará el número de consultas de bases de datos basado en el navegado atributos.
versiones en papel o electrónicos basados ​de este trabajo (traducido o no) en las librerías. Esto ayuda a distribuir y

• Evitar la recursividad en las jerarquías de objetos (objetos con una Identificación de los padres promocionar el producto Open ERP. También nos ayuda a crear incentivos para pagar los contribuyentes y autores
relación), mediante la adición de parent_left y parent_right campos enteros en su objeto, y el ajuste _ parent_store con las regalías.
a Cierto en su clase de objeto. El ORM utilizará una el recorrido del árbol preorden modificado para ser capaz
de realizar operaciones recursivas (por ejemplo, niño de ) con las consultas de bases de datos en O (1) en lugar
de En)
• No utilice campos de funciones ligera, sobre todo si los incluye en las vistas de árbol. Para optimizar
Debido a esto, las subvenciones para traducir, modificar o vender este trabajo está estrictamente prohibido, a menos
campos de funciones, dos mecanismos están disponibles:
que OpenERP SA (que representa Abrir objeto Press) le da una autorización por escrito para ello.
◦ multi : todos los campos que comparten el mismo multi valor de atributo se calcula con una sola
llamada a la función, que luego debe devolver un diccionario de valores en su valores mapa
Mientras que cada precaución se ha tomado en la preparación de este trabajo, el editor, y los autores no asumen
◦ almacenar : campos de funciones con una almacenar atributo se almacena en la base de datos y
ninguna responsabilidad por errores u omisiones, ni de los daños resultantes del uso de los datos contenidos en
vuelve a calcular la demanda cuando se modifican los objetos relevantes de disparo. El formato para la
especificación de disparo es la siguiente: tienda = { 'modelo': (_ref_fnct, campos, prioridad)} ( ver ejemplo a continuación) este documento. Publicado por Abrir objeto Press, Gran Rosière, Bélgica

327 def _get_idea_from_vote ( yo, cr, uid, ids, context = Ninguno) :


328 res = {} = vote_ids yo. pool.get ( 'Idea.vote' ) .Browse (cr, uid, ids, context = contexto)
329
326 para v en vote_ids:
330 res [v.idea_id.id] = Cierto # Guarde los identificadores idea en un conjunto
331 regreso res.keys ()
332 def _ calcular ( yo, cr, uid, ids, nombre_campo, arg, context = Ninguno):
333 res = {}
334 para idea en yo. Examinar (cr, uid, ids, context = contexto):
335 vote_num = len (idea.vote_ids) vote_sum = sum ([v.vote para v en idea.vote_ids])
336 res [idea.id] = {
337
338 'Vote_sum' : Vote_sum,
339 'Vote_avg' : (Vote_sum / vote_num) Si vote_num más 0.0,
340 }
341 regreso res
342 _columns = {
343 # Estos campos se recalculan cada vez que uno de los votos cambia
344 'Vote_avg' : Fields.function (_compute, cadena = 'Media de Votos' , Almacenar = { 'Idea.vote' : (_Get_idea_from_vote, [ 'votar' ],
345 10)}, multi = 'votos' ),
346 'Vote_sum' : Fields.function (_compute, cadena = 'Votos Sum' , Almacenar = { 'Idea.vote' : (_Get_idea_from_vote, [ 'votar' ],
347 10)}, multi = 'votos' ),
348 }

Comunidad / Contribuir
proyectos OpenERP se alojan en Launchpad (LP), donde se pueden encontrar todos los recursos del proyecto: ramas
Bazaar, seguimiento de errores, planos, plan de trabajo, preguntas frecuentes, etc. Crear una cuenta gratuita en launchpad.net
para poder contribuir.

grupos de Launchpad
Grupo* miembros restricciones bazar / LP

Equipo de Calidad OpenERP equipo central puede combinar y comprometerse en


OpenERP (~ OpenERP) ramas oficiales.
Los conductores de miembros de la comunidad Puede confirmar errores y establecer
OpenERP (~ OpenERP-conductores) activos seleccionados hitos en los insectos

Comunidad OpenERP (~ OpenERP en la comunidad) grupo abierto,


cualquiera Puede crear ramas de la comunidad donde todo
pueden unirse a el mundo puede contribuir
* Los miembros de grupos superiores son también miembros de los grupos de menores

Copyright © 2013 Abrir objeto de Prensa - Todos los derechos reservados - Ver licencia en la página 10. p.10 / 10

También podría gustarte