Crear nuevos modelos de usuarios diferentes con capacidad para loguearse en Odoo, pero diferentes al modelo res.user

523 views
Skip to first unread message

Eduardo BP

unread,
May 29, 2015, 9:43:21 PM5/29/15
to openerp-s...@googlegroups.com
Hola a tod@s.

Estoy desarrollando un pequeño módulo de prueba para probar todo lo que ofrece Odoo, y me ha surgido el siguiente problema.

Necesito crear nuevos tipos de usuarios, pero quiero que cada tipo represente un modelo ya que cada uno tendrá sus propios tipos de fields y métodos.
Además, quiero establecer una cierta jerarquía de herencia entre ellos. Por ejemplo, si tengo los modelos UsuarioA, UsuarioB y UsuarioC, quiero que UsuarioB y UsuarioC hereden de UsuarioA.

La cuestión es que en Odoo, los usuarios que podemos crear para que puedan loguearse son records del modelo res.users.
Yo no puedo hacer que mi modelo UsuarioA tenga la capacidad para hacer login en Odoo, creo yo.

El problema viene con la siguiente situación.
Imaginad que en un determinado momento quiero aplicar un domain como el siguiente: [('responsable_venta', '=', uid)]

responsable_venta es un field de mi modelo Venta que es un Many2one al modelo UsuarioB, que es un tipo de modelo de usuario creado por mí.
En el dominio anterior, uid hace referencia al usuario logueado en Odoo.
La idea es, en un determinado momento, probar que un comercial responsable de una venta coincide con el usuario logueado para permitirle realizar ciertas cosas sobre esa venta.

Para que este dominio funcionara, el field responsable_venta debería ser un Many2one al modelo res.users, pero esto no es lo que quiero.

Claro, una solución es hacer que mis modelos UsuarioX hagan una herencia de tipo Extension (la herencia que usa _inherit en vez de _name en el modelo), pero esta no es mi idea ya que:

- No quiero que tabla res.users crezca con columnas que no son necesarias para otros usuarios o para otros módulos instalados.
- Quiero crear una jerarquía de modelos de usuarios (como expliqué antes), no quiero un único tipo de usuario res.users gigantesco con decenas de columnas en su tabla.

No sé si planteo algo complicado, pero no se me ocurre ninguna buena forma de hacerlo.

Gracias.

Pedro Manuel Baeza Romero

unread,
May 30, 2015, 3:48:02 AM5/30/15
to openerp-s...@googlegroups.com
Eduardo, no debería importarte tanto añadir columnas a la misma tabla, aunque no se rellenen en muchos casos. Postgres se encarga de optimizar eso. Juega con las vistas de mostrar unos u otros elementos filtrados, y sus campos correspondientes. Un ejemplo lo tienes con el módulo membership, que te muestra una vista súper-reducida de los productos.

Un saludo.

--
Has recibido este mensaje porque estás suscrito al grupo "Usuarios Odoo / OpenERP en España" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a openerp-spain-u...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Eduardo BP

unread,
May 30, 2015, 9:52:58 AM5/30/15
to openerp-s...@googlegroups.com
Como siempre, gracias por tu respuesta Pedro.

Lo que yo estaba intentando es evitar filas en la tabla de res.users con muchos valores NULL para hacer cumplir la 1FN (primera forma normal) y así poder tener una base de datos normalizada desde el principio.

Otra solución que no sé si podría funcionar sería la siguiente.
Vamos a imaginar que tengo un modelo basado en una clase llamada Comercial, un nuevo tipo de usuario.

class Comercial(models.Model):
_name='micrm.users.comercial'
_inherits = {'res.users': 'usuario_comercial_id'}

usuario_comercial_id = fields.Many2one('res.users', required=True, ondelete='cascade')
num_ventas = fields.Integer()
presupuestos_conseguidos = fields.One2many('micrm.presupuesto', 'comercial_vendedor_id')
....
....

En este caso, estoy usando la herencia delegation, de modo que desde mi modelo Comercial puedo usar todos los field del modelo res.users, y no estoy añadiendo más columnas a la tabla res.users.

Por otra parte, tendría otro modelo más que se refiere a un presupuesto hecho por un comercial para una venta:

class Presupuesto(models.Model):
_name='micrm.presupuesto'

comercial_vendedor_id = fields.Many2one('micrm.users.comercial')
)

La cuestión es cómo conseguir usar un domain como éste

[('comercial_vendedor_id', ''=", uid)]

para ver si el usuario logueado en Odoo coincide con el comercial que ha realizado un presupuesto, y en caso afirmativo, que pueda hacer ciertas cosas sobre él o ver determinada información.


No sé si esto funcionaría de esta manera.

Gracias.

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "Usuarios Odoo / OpenERP en España" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/openerp-spain-users/fo-kMAPuzIw/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a openerp-spain-u...@googlegroups.com.

Pedro Manuel Baeza Romero

unread,
May 31, 2015, 2:09:53 PM5/31/15
to openerp-s...@googlegroups.com
La normalización de BDs está muy bien cuando eres tú el que diseñas la BD desde 0, pero en un sistema en el que ya tienes un DB layout y una capa de negocio ya aplicada, no es recomendable reinventar las cosas por la gran cantidad de trabajo que conlleva.

Por eso te digo de utilizar el mismo modelo res.users.

Un saludo.

Eduardo BP

unread,
May 31, 2015, 3:15:03 PM5/31/15
to openerp-s...@googlegroups.com
Sí, llevas razón en que normalizar una BD en Odoo no debería hacerse.
Lo único que quería evitar es tener una tabla res_users con 40 columnas, y que por ejemplo, una fila tuviera NULL en 20 columnas.
No sé si es algo que debería olvidar cuando desarrollo para Odoo, pero siempre he tendido a diseñar tablas teniendo en cuenta que haya la mínima cantidad posible de NULL en las filas.

Intentaré ver si funciona la herencia de tipo delegation, y si no pues haré lo que indicabas, hacer una herencia ampliando el modelo res.users.

Como siempre, gracias por tus respuesta Pedro.

Un saludo.

Jordi Ballester Alomar

unread,
Jun 1, 2015, 12:30:33 AM6/1/15
to openerp-s...@googlegroups.com

Hola Eduardo,

Por qué no usas el mismo concepto que hr.employee? Este modelo asocia a un usuario como atributo del modelo.

Luego, allí donde se asigna un empleado, puedes aplicar el dominio del siguiente modo:

<filter string="My Requests" name="my_leaves" domain="[('employee_id.user_id','=', uid)]"...

Ejemplo aqui:

https://github.com/odoo/odoo/blob/8.0/addons/hr_holidays/hr_holidays_view.xml

El dia 31/05/2015 21:15, "Eduardo BP" <eduar...@gmail.com> va escriure:

Eduardo BP

unread,
Jun 1, 2015, 12:18:04 PM6/1/15
to openerp-s...@googlegroups.com
Gracias por tu aporte Jordi.

Perdona que insista, pero hay algunas cosas que no entiendo en tu comentario (estoy empezando a programar con Odoo).

En primer lugar, me comentas que el modelo hr.employee asocia a un usuario como atributo del modelo.
Lo que supongo que quieres decirme es que el modelo hr.employee tiene un field Many2one al modelo res.users:

employee_id = fields.Many2one('res.users')

He estado mirando este módulo y no he encontrado que se defina dicho campo.
En cambio, he visto que el modelo 'hr.holidays' sí que lo define, pero no es un field que apunte al modelo res.users, sino que es lo siguiente:

'employee_id': fields.many2one('hr.employee', "Employee", select=True, invisible=False, readonly=True, ...

Como ves, es un Many2one que apunta al modelo hr.employee, no a res.users.

Si en tu comentario me decías que puedo aplicar un dominio del tipo: 

<filter string="My Requests" name="my_leaves" domain="[('employee_id.user_id','=', uid)]"

puedo concluir que el field employee_id es un many2one al modelo res.users ya que usa la expresión 'employee_id.user_id'

Un saludo.
Reply all
Reply to author
Forward
0 new messages