Documentos de Académico
Documentos de Profesional
Documentos de Cultura
• 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.
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
clase anterior se indican con los números de línea correspondientes (→ XX, XX)
_columns ( requerido) {declaración de campo Nombre de campo →} diccionario
_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
_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
•
•
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
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 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)
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)
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
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
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
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
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
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
• haciendo clic en los botones en las vistas, si éstos están conectados a las acciones
138
139
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
• columna : número de columna de este elemento debe asignar a sus elementos secundarios
• 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 ,
• solo lectura : anular solo lectura atributo de campo de modelo para esta vista
• dominio : código Python lista de tuplas declarar para restringir los valores
• 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)
(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:
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
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)
• nivel elementos se utilizan para definir los niveles de diagrama de Gantt, con el campo
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
• 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)
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>
on_create Si Cierto, un elemento de trabajo se crea una instancia de forma automática para cada nuevo osv grabar
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:
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
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)
• 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.
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
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
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
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
Copyright © 2013 Abrir objeto de Prensa - Todos los derechos reservados - Ver licencia en la página 10. p.10 / 10