Cambio en las fechas (campo DateTime)

1,217 views
Skip to first unread message

Alvaro Fernandez

unread,
Apr 10, 2014, 3:02:25 AM4/10/14
to openerp-s...@googlegroups.com
Hola,

      Ayer, casi por casualidad, me di cuenta de un problema con los campos DateTime de un pequeño desarrollo. El caso es que, en el pedido de venta, he incluido dos campos DateTime para indicar las fechas inicial y final de la actividad presupuestada. Hasta ahí no ha habido mayor problema. En esos campos selecciono fecha y hora, guardo el registro, y cada vez que lo consulto aparecen las horas que indiqué.

      Sin embargo, al ir a imprimir el modelo de presupuesto que diseñé para este cliente, me di cuenta que en la casilla de estas horas de inicio y fin de actividad, mostraba exáctamente dos horas menos de las que yo había seleccionado en OpenERP. Me fui a consultar directamente en la base de datos, y efectivamente, ahí también se habian almacenado estos campos con dos horas menos de las seleccionadas. Insisto, en la ficha de presupuesto de OpenERP se siguen mostrando la fecha y hora correctas.

     Supongo que esto debe venir de la configuración horaria del cliente, pero he realizado cambiando esta configuración y generado presupuestos nuevos, y sigue haciendo lo mismo. ¿Alguien tiene idea de a qué se puede deber esto?




P.D.: Trabajo con OpenERP 6.1 montado sobre Ubuntu Server 12.04. La configuración horaria del servidor Ubuntu es correcta.





Álvaro Fernández

Alejandro Santana

unread,
Apr 10, 2014, 3:08:42 AM4/10/14
to openerp-s...@googlegroups.com
Hasta donde yo recuerdo, OpenERP guarda la fecha en UTC (http://es.wikipedia.org/wiki/Tiempo_universal_coordinado) y, al imprimir el informe no hace la "traducción" a la hora local... ya que quien te sirve el pdf es el servidor, que trabaja en UTC y no tiene idea de tu hora local.
No sé si hay solución para esto.

Pedro Manuel Baeza Romero

unread,
Apr 10, 2014, 4:12:35 AM4/10/14
to openerp-s...@googlegroups.com
Para que en los informes te vuelva a hacer la traducción de la fecha de UTC a tu hora local, tienes que poner formatLang(campo_date, date_time=True).

Un saludo.


--
Has recibido este mensaje porque estás suscrito al grupo "Usuarios 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.

Alvaro Fernandez

unread,
Apr 10, 2014, 1:08:08 PM4/10/14
to openerp-s...@googlegroups.com
Pero es que el informe lo he hecho con Jasper...





Álvaro Fernández

Pedro Manuel Baeza Romero

unread,
Apr 10, 2014, 1:11:23 PM4/10/14
to openerp-s...@googlegroups.com
Aunque no he manejado apenas JasperReports, se me ocurre que le pases la fecha ya formateada como string en un campo.

Un saludo.


El 10 de abril de 2014, 19:08, Alvaro Fernandez <morph...@gmail.com> escribió:
Pero es que el informe lo he hecho con Jasper...





Álvaro Fernández

--

Alvaro Fernandez

unread,
Apr 25, 2014, 3:01:02 AM4/25/14
to openerp-s...@googlegroups.com
Hola de nuevo,

     He estado dándole otra vuelta de tuerca a este tema. Después de pelearme un buen rato con iReport, me decanté por la opción de Pedro. Me cree dos campos auxiliares (uno por cada uno de los datetime que quiero mostrar), de tipo function-char, que simplemente almacenasen el valor del campo datetime original pero como texto, y mostrar estos campos en el informe.

     Mi gozo en un pozo, porque esto lo único que hace es traerme el campo tal cual se almacena en la base de datos, y por lo tanto, con el huso horario incorrecto. Mi pregunto ahora es ¿sabéis si existe algún método o función que puede aplicar a estos campos para que me transforme el datetime al huso horario asociado al usuario? Me refiero a una función de estilo a formatLang utilizada en los informes sxw, pero que pueda aplicar a los campos mencionados.

     Si no existe, me tocará currármela, pero si ya estuviera hecha... xD. ¿Alguien sabe de otra posible solución?


Muchas gracias como siempre!




Álvaro Fernández

Pedro Manuel Baeza Romero

unread,
Apr 25, 2014, 3:12:29 AM4/25/14
to openerp-s...@googlegroups.com
Buenas, Álvaro,

Puedes utilizar con código python el datetime.datetime.strptime('%y-%m-%d'), o mejor aún, utilizar la variable SERVER_DEFAULT_DATETIME_FORMAT (tendrías que buscar cómo se importa, que no lo tengo a mano), que contiene ese mismo valor (%y-%m-%d), pero que si en un futuro lo cambian desde OpenERP S. A., no tendrás que tocar tu código. Después, hacer la transformación al formato que tú quieras con strftime.

Un saludo.


--
Message has been deleted

Alvaro Fernandez

unread,
Apr 25, 2014, 5:19:54 AM4/25/14
to openerp-s...@googlegroups.com
Bueno, pues os copio la solución, por si alguno se encuentra con el mismo problema (que imagino que será bastante común..).

Lo primero que he hecho ha sido crear un campo auxiliar llamado "race_start_txt" de tipo function con store=False, method=True y type='char'. Este será el campo que mostraré en el informe. Para obtener el valor de este campo, esta es la función implementada:


from osv import osv, fields
from datetime import datetime
from dateutil import tz
import time
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT

class mi_clase(osv.osv) :
[...]

  def _get_datetime_localizado(self,cr,uid,ids,field_name,arg,context=None):     
     if context is None :
       context = {}
     res = {}
     
     from_zone = tz.tzutc()
     to_zone = tz.tzlocal()
     
     for
mi_registro in self.browse(cr,uid,ids,context=context) :
       datetime_txt = False     
       if field_name == 'race_start_txt' :
         if mi_registro.race_datetime_start :
           datetime_utc = datetime.strptime(
mi_registro.race_datetime_start, '%Y-%m-%d %H:%M:%S')
           datetime_utc = datetime_utc.replace(tzinfo=from_zone)
           datetime_locale = datetime_utc.astimezone(to_zone)
           datetime_txt = datetime.strftime(datetime_locale,DEFAULT_SERVER_DATETIME_FORMAT)

       if datetime_txt :       
         res.update({mi_clase.id:datetime_txt})             
     return res

[...]

mi_clase()




Álvaro Fernández

Alvaro Fernandez

unread,
Apr 25, 2014, 6:59:48 AM4/25/14
to openerp-s...@googlegroups.com
Aunque ahora veo que en función de la época del año (por aquello de los cambios de hora), se ajusta a la hora correcta, o se queda una hora por debajo... ¬¬





Álvaro Fernández

Pedro Manuel Baeza Romero

unread,
Apr 25, 2014, 8:21:23 AM4/25/14
to openerp-s...@googlegroups.com
Entonces tendrás que ajustar tú a mano según el timezone. Mejor ve mirando de probar otro motor de informes...


El 25 de abril de 2014, 12:59, Alvaro Fernandez <morph...@gmail.com> escribió:
Aunque ahora veo que en función de la época del año (por aquello de los cambios de hora), se ajusta a la hora correcta, o se queda una hora por debajo... ¬¬





Álvaro Fernández

--

Alvaro Fernandez

unread,
Apr 25, 2014, 8:38:18 AM4/25/14
to openerp-s...@googlegroups.com
Jeje, ¿me lo dices o me lo cuentas? Estoy empezando a probar con Aeroo porque es cierto que Jasper deja muuucho que desear (amén de que no esta migrado a la versiones 7 y 8).

Bueno, pues ya he conseguido solucionar el problema con los horarios de invierno/verano. Copio abajo las modificaciones:

from osv import osv, fields
from datetime import datetime
from dateutil import tz
import time
import pytz

from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT

class mi_clase(osv.osv) :
[...]

  def _get_datetime_localizado(self,cr,uid,ids,field_name,arg,context=None):     
     if context is None :
       context = {}
     res = {}
     
     from_zone = tz.tzutc()
     #to_zone = tz.tzlocal()
     mitz = pytz.timezone('Europe/Madrid')

     
     for
mi_registro in self.browse(cr,uid,ids,context=context) :

       datetime_txt = False     
       if field_name == 'race_start_txt' :
         if mi_registro.race_datetime_start :
           datetime_utc = datetime.strptime(
mi_registro.race_datetime_start, '%Y-%m-%d %H:%M:%S')
           datetime_utc = datetime_utc.replace(tzinfo=from_zone)
           #datetime_locale = datetime_utc.astimezone(to_zone)
           datetime_locale = datetime_utc.astimezone(mitz)

           datetime_txt = datetime.strftime(datetime_locale,DEFAULT_SERVER_DATETIME_FORMAT)

       if datetime_txt :       
         res.update({mi_clase.id:datetime_txt})             
     return res

[...]

mi_clase()


Es cierto que limito el funcionamiento al timezone "Europe/Madrid", pero bueno, teniendo en cuenta que es una personalización muy concreta para un cliente nacional... lo dejaremos así hasta encontrar solución mejor o cambiarlo de versión.

Muchas gracias por la ayuda!



Álvaro Fernández

Pedro Manuel Baeza Romero

unread,
Apr 25, 2014, 8:52:45 AM4/25/14
to openerp-s...@googlegroups.com
Puedes coger también el timezone de tu usuario, consultando con

self.pool['res.users'].browse(cr, uid, uid, context=context).tz

Un saludo.


--

Alvaro Fernandez

unread,
Apr 25, 2014, 8:59:23 AM4/25/14
to openerp-s...@googlegroups.com
Pues también. No había caído.

Gracias!



Álvaro Fernández
Reply all
Reply to author
Forward
0 new messages