06 Desember 2014

Tentang Masalah Datetime - UTC OpenERP 7 & 8

Bismillahirrahmaanirrahiim

Hmm sulit sekali lepas dari kata OpenERP.. harusnya Odoo yaa hehe ..
iya ini tentang konsep datetime di OE 7 dan 8. hmm sebenarnya juga OE 6.1

Memang konsep ini dimulai sejak OE 6.1
Sedangkan di OE 6.0 masih "normal"

Maksudnya gimana nih?
Dulu di OE 6.0 kalau kita input datetime 06/12/2014 07:30:58
maka saat disimpan di database juga disimpan sebagai  06/12/2014 07:30:58

Sedangkan, mulai di OE 6.1 dst, maka akan disimpan di Postgre sebagai datetime yang dikembalikan ke basic UTC yaitu UTC+0 sesuai timezone masing-masing user

Di masing-masing user, ada preferences  untuk setting local timezone. Contoh saya set timezone Asia/Jakarta (UTC+7). Nah maka ketika saya input 06/12/2014 07:30:58 maka akan disimpan sebagai 06/12/2014 00:30:58
Sedangkan jika ada user lain di UTC-2 misalkan, dengan input yang sama maka akan disimpan sebagai 06/12/2014 09:30:58

Nope, ini BUKAN BUGS. Ini memang disain yang dibuat demikian.

Nah terus apa masalahnya?
toh nanti pas tampil tetap sesuai timezone yang dipilih tiap user?
betul... di web tentu akan tampil sesuai timezone kita... gak perduli dengan timezone yg kita set di laptop. semua hanya dipengaruhi timezone yg diset di masing-masing user. cmiiw

Masalahnya adalah ketika berhubungan dengan report.
Kalau kita buat report pakai RML standard, sudah ada solusinya, yaitu
pakai [[ formatLang(fielddatetime, datetime=True) ]]

Nah kalau pakai query misalnya, atau pakai browse biasa... maksudnya buat function di *.py untuk menghasilkan datetime sesuai timezone, nah itu yang jadi masalah...

Jadi ceritanya beberapa minggu lalu, saya dapat task untuk export data ke dalam xls. Saat itu saya menggunakan python-xlwt (HINT: xlsxwriter ternyata lebih powerful lho. Saya gak pake aeroo ya.. krn pada kenyataannya dengan langsung generate dengan xlwt/xlxwriter akan jauuuuuuuuuuuuh lebih cepat saat generate data banyak..

Lalu saya gunakan browse biasa kemudian read field datetime, maka akan keluar datetime dengan basic UTC. Dan si user yang request modul ini jadi protes, karena gak sesuai dengan timezone mereka...

yaudah pakai formatLang aja?
sayangnya hanya bisa dipakai di rml saja.. cmiiw

terus gimana?

Alhamdulillah, setelah ngubek2 src code dan gugling sana sini, dapatlah solusi ini...

jangan lupa import pytz nya ya...

Nah selanjutnya tinggal disesuaikan deh mau ambil timezone dari mana.
kalau di code tsb, diambil dari timezone user yg login.

kalau misalnya untuk lembur, mungkin disesuaikan dengan timezone masing2 karyawan. karena bisa jadi karyawan nya tersebar di penjuru dunia dengan berbagai variasi timezone.

Demikian
semoga bermanfaat
kalau ada yang salah mohon bantu koreksi yaa

terima kasih













2 komentar:

  1. Bagaimana dengan filter menggunakan field datetime mbak Siti?
    Contoh pada timezone UTC+7 ketika kita input data pada field datetime 13/10/2015 05:00, data yang tersimpan di database adalah 12/10/2015 22:00
    Ketika di filter by date 13/10/2015 data tersebut tidak akan keluar. Data tersebut akan keluar ketika di filter by date 12/10/2015

    Ada saran dari mbak Siti?

    BalasHapus
    Balasan
    1. sorry baru lihat...
      ini filter di mana kah?
      kalau dari wizard (custom wizard) biasanya saya buat field hidden datetime ..
      jadi misal ada filter field:
      date: fields.date
      startdatetimr: fields.datetimr
      enddatetime: fields.datetime

      nanti saya buat attr onchange di field date, utk generate start dan end date time field

      kalau misal 12/10/2015
      maka saya harus buat suapaya field startdatetime = 12/10/2015 00:00:00
      dan enddatettime = 12/10/2015 23:59:59

      nanti kedua field tsb otomatis ditangkap di python sebagai UTC+0 yaitu 11/10/2015 17:00:00

      dan 12/10/2015 16:59:59

      nah itulah yang dijadikan filter sebenarnya

      cmiiw
      jadi misal filter date biasa 12/10/2015

      Hapus