Como usar el método browse para que extraiga todos los registros en lugar de una lista de ids o id.

701 views
Skip to first unread message

Reyes Cofino

unread,
May 20, 2015, 5:58:31 AM5/20/15
to openerp-s...@googlegroups.com
Hola quería saber como puedo hacer un browse como este:

empleados_ids = self.pool['hr.employee'].browse(cr, uid, [0])

pero que recoja todos los registros de la base de datos de hr.employee no solo el primer registro [0]. Me gustaría iterar con un for empleando la notación de puntos para moverme por los campos de la tabla, pero no se como seleccionar todos los registros en el método browse.

Gracias a todos.

Pedro Manuel Baeza Romero

unread,
May 20, 2015, 6:02:43 AM5/20/15
to openerp-s...@googlegroups.com
Buenas, Reyes,

employee_obj = self.pool['hr.employee']
empleados_ids = employee_obj.search(cr, uid, [], context=context)
empleados = employee_obj.browse(cr, uid, empleados_ids, context=context)

El otro código te dará error, ya que no existe el ID 0.

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.

Reyes Cofino

unread,
May 20, 2015, 3:25:25 PM5/20/15
to openerp-s...@googlegroups.com
Muchas gracias Pedro, pero tengo otra dificultad que no se como atacarla. Te adjunto el código:

class hr_calendario_laboral(models.Model):

    _name = 'hr.calendario_laboral'

    year = fields.Char("Año", required=True)
    line_ids = fields.One2many('hr.calendario_laboral.line', 'fiesta_id', string='Días festivos')

    _order = "year"

    _sql_constraints = [('year_unique', 'UNIQUE(year)', '¡Ya se ha introducido el calendario laboral de este año!'),]

    def create(self, cr, uid, values, context=None):
        if context is None:
            context = {}
        context = dict(context, mail_create_nolog=True)
        obj_res_leave = self.pool.get('resource.calendar.leaves')
        empleados_ids = self.pool['hr.employee'].search(cr, uid, [])
        ids_fechas = self.pool['hr.calendario_laboral.line'].search(cr, uid, ['fiesta_id','=', self.id])
# es posible que no funcione porque todavia no esta guardado el registro self.id, tengo que buscar otra forma para seleccionar los festivos que me interesen        
        for fecha_fiesta in self.pool['hr.calendario_laboral.line'].browse(cr,uid, ids_fechas):
            for empleado in self.pool['hr.employee'].browse(cr, uid, empleados_ids):
                vals = {
                    'name': fecha_fiesta.name,
                    'date_from': fecha_fiesta.fecha,
#                    'holiday_id': 1,
                    'date_to': fecha_fiesta.fecha,
                    'resource_id': empleado.resource_id.id,
                    'calendar_id': empleado.resource_id.calendar_id.id
                }
                obj_res_leave.create(cr, uid, vals, context=context)
        return super(hr_calendario_laboral, self).create(cr, uid, values, context=context)
       
class hr_calendario_laboral_line(models.Model):

    _name = 'hr.calendario_laboral.line'

    name = fields.Char('Nombre de la fiesta', size=128, required=True)
    fecha = fields.Datetime(required=True)
    fiesta_id = fields.Many2one('hr.calendario_laboral', string='Calendario laboral')

    _order = "fecha, name desc"

Como ves es muy sencillo, pero tengo el siguiente problema: quiero crear un calendario laboral donde aparezca el año y luego las diferentes fiestas (fechas y nombre de la fiesta), pues bien, trato de modificar el metodo create para que cuando se guarden los datos del calendario laboral aparezca en la vista calendario como dia festivo cuando se solicitan las vacaciones (leaves request). El problema creo que lo tengo porque busco ids_fechas = self.pool['hr.calendario_laboral.line'].search(cr, uid, ['fiesta_id','=', self.id]) pero claro todavía no han sido guardados estos line_ids o fiesta_id en la BD. ¿Cómo se resuelve esto en Odoo?

Muchas gracias Pedro, eres desde luego la referencia a seguir.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a openerp-spain-users+unsub...@googlegroups.com.

Pedro Manuel Baeza Romero

unread,
May 20, 2015, 3:28:49 PM5/20/15
to openerp-s...@googlegroups.com
Buenas, Reyes,

Gracias por el cumplido. Lo que puedes hacer es primero llamar al super para que cree el registro y te devuelva el id creado, y luego haces el resto de operaciones que dependen de ese ID.

Un saludo.

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.

--
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.

Reyes Cofino

unread,
May 21, 2015, 4:25:19 AM5/21/15
to openerp-s...@googlegroups.com
Tremendo Pedro, como no se me había ocurrido antes? Muchísimas gracias por tu ayuda.

Saludos.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a openerp-spain-users+unsub...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
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-users+unsub...@googlegroups.com.

Reyes Cofino

unread,
May 21, 2015, 5:31:36 AM5/21/15
to openerp-s...@googlegroups.com
Pedro, he probado varias cosas pero no consigo recuperar el id creado, ¿cómo puedo recuperar el id creado por el super para operar ?

Pedro Manuel Baeza Romero

unread,
May 21, 2015, 7:51:36 AM5/21/15
to openerp-s...@googlegroups.com
Sería así:

def create(self, cr, uid, values, context=None):
    ...
    calendario_id = super(hr_calendario_laboral, self).create(cr, uid, values, context=context)
    ...
    haz lo que quieras con ese id
    ...
    return calendario_id

Un saludo.

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.

--
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.

--
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.

Reyes Cofino

unread,
May 21, 2015, 9:35:51 AM5/21/15
to openerp-s...@googlegroups.com
Eso es lo que hago, pero cuando empleo la siguiente sentencia para buscar las líneas (dias festivos):

        ids_fechas = self.pool['hr.calendario_laboral.line'].search(cr, uid, ['fiesta_id','=',calendario_id])

Donde fiesta_id es un campo Many2one a hr.calendario_laboral

Me da el siguiente error de ejecución: 

File "/opt/odoo/openerp/osv/expression.py", line 749, in parse
    self.stack = [ExtendedLeaf(leaf, self.root_model) for leaf in self.expression]
  File "/opt/odoo/openerp/osv/expression.py", line 532, in __init__
    self.check_leaf()
  File "/opt/odoo/openerp/osv/expression.py", line 588, in check_leaf
    raise ValueError("Invalid leaf %s" % str(self.leaf))
ValueError: Invalid leaf fiesta_id

Pedro Manuel Baeza Romero

unread,
May 21, 2015, 10:10:12 AM5/21/15
to openerp-s...@googlegroups.com
Pero eso será hr.calendario_laboral.line no tiene ese campo.

Un saludo.

Reyes Cofino

unread,
May 21, 2015, 12:17:40 PM5/21/15
to openerp-s...@googlegroups.com
Si que tiene ese campo, aquí te dejo la definición de la clase que es muy sencilla:

class hr_calendario_laboral_line(models.Model):

    _name = 'hr.calendario_laboral.line'

    name = fields.Char('Nombre de la fiesta', size=128, required=True)
    fecha = fields.Datetime(required=True)
    fiesta_id = fields.Many2one('hr.calendario_laboral', string='Calendario laboral')

    _order = "fecha, name desc"

¿Dónde crees que puede estar el problema para que de ese error?, si pruebo la busqueda con los campos name o fecha me da el mismo error, es como si no reconociera los campos de hr.calendario_laboral.line. 

Pedro Manuel Baeza Romero

unread,
May 21, 2015, 12:19:49 PM5/21/15
to openerp-s...@googlegroups.com
OK, el error está en la expresión, que te faltan los paréntesis de la tupla:

ids_fechas = self.pool['hr.calendario_laboral.line'].search(cr, uid, [('fiesta_id','=',calendario_id)])

Un saludo.

Reyes Cofino

unread,
May 21, 2015, 12:42:02 PM5/21/15
to openerp-s...@googlegroups.com
Efectivamente, faltaban los paréntesis, que horror!, dos días completos perdidos en intentar resolver el problema. Y lo peor de todo es que si no es por tu ayuda Dios sabe lo que tardaría.

Muchíiiiisimas gracias Pedro.


Alejandro Santana

unread,
May 22, 2015, 6:23:10 AM5/22/15
to openerp-s...@googlegroups.com
Hola, Reyes.

Desde  luego, eso del calendario laboral suena muy interesante y deseable.
Leyendo por encima veo que haces que el calendario laboral sea único por año.

Te dejo varias ideas que se me han ocurrido al respecto, ya que he pensado algo similar:
  • Mejor programar en inglés, por nombres de variables y demás, pensando en que pueda ser aprovechado por otra gente de la comunidad que puede ser de cualquier país. Convención, nada más.
  • Creo que los calendarios laborales no deberían ser únicos por año. ¿Por qué? Porque, el menos en España, un calendario laboral es, realmente, la suma de varios niveles:
    • Estatal: festivos nacionales
    • Regional: festivos de Comunidad Autónoma
    • Provicial: De esto no estoy muy seguro
    • Local: Cada localidad suele tener sus 2 patronos particulares.
    • Sectorial o por convenio: Hay convenios que tienen días festivos específicos
    • Empresa: Hay empresas que dictan que tal o tal día es libre.
  • Con todo lo anterior, sabiendo que una misma empresa puede tener dos delegaciones en dos ciudades diferentes, sus trabajadores tendrán festivos diferentes.
  • Por eso se me ocurrió que tal vez los calendarios laborales no deberían clasificarse por años, sino por niveles (e ir actualizándolos año a año, no añadiendo nuevos).
  • Esos calendarios estarían disponibles en cada "compañia" y se aplicarían a cada usuario y/o empleado, de manera que sumara todos los festivos que le corresponda. Así es perfectamente flexible. Por ejemplo:
    • user1: calendario España + calendario Galicia + calendario Vigo + calendario Construcción
    • user2: calendario España + calendario Galicia + calendario Santiago de Compostela + calendario Construcción
Luego, actualizar los datos de calendarios nacional y regional sería bastante fácil y vieble dentro de la localización. Y los locales y sectoriales se podrían añadir a mano muy fácil ya que apenas serían un par de días al año.
¿Cómo lo veis?

David Santiago Neyra Bustamante

unread,
May 23, 2015, 11:58:15 AM5/23/15
to openerp-s...@googlegroups.com
es una gran idea, como podriamos hacerlo realidad?

David Santiago Neyra Bustamante

unread,
May 23, 2015, 11:58:37 AM5/23/15
to openerp-s...@googlegroups.com
reyes estarias dispuesto a compartir el codigo del calendario que has armado?

Ana Juaristi

unread,
May 23, 2015, 2:57:12 PM5/23/15
to openerp-s...@googlegroups.com

Y ademas de esos niveles tambien el del usuario individual ya que las vacaciones y dias libres estan asociados a estos de forma individual.
Esto que hablais seria base imprescindible para el desarrollo de planificacion de recursos en carga finita tanto en proyectos como en fabricacion
Sobre el enfoque creo que seria mas sencillo marcar dias de fiesta aprovechando el objeto estándar que ya existe para festivos. Sobre este se podria definir un campo categoria festivo y posteriormente asociar a cada recurso las diferentes categorias que le aplican. No lo veo excesivamente complejo de hacer y seria un gran avance
A ver quien se anima

Reyes Cofino

unread,
May 24, 2015, 2:43:04 PM5/24/15
to openerp-s...@googlegroups.com
Hola a todos,

No tengo ningún problema en compartir el código cuando termine el proyecto. Mi idea Alejandro difiere un poco de lo que comentas. Primeramente estoy implementando la solución para crear un solo calendario laboral por año. Una vez este todo funcionando lo ampliaré para que se puedan crear diferentes centros de trabajo con diferentes calendarios laborales en función de criterio de fiestas nacionales, CCAA, fiestas locales y posibles convenios de la empresa. A su vez cada calendario (nacional, CCAA, ...) será introducido por una persona específica de RRHH y aprobado por un superior.  Como ves lo que quiero es que funcionalmente los datos sean introducidos y aprobados, por lo que no me planteo la carga de datos automática.

Por otro lado también estoy modificando el modulo hr.holidays para que resuelva todos los problemas que tiene como el hecho de que las vacaciones te las tenga que aprobar alguien con perfil de manager de RRHH o que un manager pueda aprobarse sus propias vacaciones, o el hecho de que cualquier manager puede visualizar y aprobar las vacaciones de toda la cia, o que el sistema funcione con días laborables y no naturales a la hora de contabilizar las vacaciones consumidas, etc, etc.

Ana, ¿podrías indicarme cual es el objeto estándar que ya existe para definir los festivos? Precisamente estoy ahora con ese tema.

Saludos.    
 
Reply all
Reply to author
Forward
0 new messages