Как хранить и получать даты, чувствительные к часовому поясу в odoo 10 - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь преобразовать записи hr_attendance в платежную ведомость, однако эти даты должны быть чувствительны к часовому поясу, чтобы правильно платить нашим сотрудникам. Есть ли способ сделать это в поисковом домене?

Вот мой текущий код

в часах

@api.onchange('check_in', 'check_out')
@api.constrains('check_in', 'check_out')
def _tz_check_in(self):
    for attendance in self:
        if attendance.location_id:
            tz = pytz.timezone(attendance.location_id.location_timezone)
            attendance.tz_check_in = pytz.timezone('UTC').localize(datetime.strptime(attendance.check_in, DEFAULT_SERVER_DATETIME_FORMAT)).astimezone(tz)

tz_check_in = fields.Datetime(string='check in w/ tz', compute=_tz_check_in, store=True)

и в hr.payslip

pay_period_attendances = self.env['hr.attendance'].search([
    ('employee_id', '=', employee.id),
    ('tz_check_in', '>=', pay_period['date_from'].strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
    ('tz_check_in', '<=', pay_period['date_to'].strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
    ('payslip_id', '=', False)])

однако, чувствительная к часовому поясу дата не сохраняется.

1 Ответ

0 голосов
/ 15 ноября 2018

Для этого я создал следующий метод

@api.constrains('check_in')
def _tz_check_in(self):
    for attendance in self:
        if attendance.location_id:
            tz = pytz.timezone(attendance.location_id.location_timezone)
            checkin = pytz.timezone('UTC').localize(datetime.strptime(attendance.check_in, DEFAULT_SERVER_DATETIME_FORMAT)).astimezone(tz).strftime(DEFAULT_SERVER_DATETIME_FORMAT)
            if not attendance.tz_check_in or attendance.tz_check_in != checkin:
                attendance.write({'tz_check_in': datetime.strptime(checkin, DEFAULT_SERVER_DATETIME_FORMAT)})

, который берет check_in и преобразует его в строку, чувствительную к часовому поясу, затем преобразует эту строку в объект datetime и вводит его в базу данных. Я использую это поле (tz_check_in) только для справочных целей, и все даты переднего плана являются исходными датами.

...