如何在 odoo 10 中存储和检索时区敏感日期
How to store and retrieve timezone sensitive dates in odoo 10
我正在尝试将 hr_attendance 记录转换为工资单,但是这些日期时间需要对时区敏感才能正确支付我们的员工。有没有办法在搜索域中执行此操作?
这是我当前的代码
在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)])
但是,不存储时区敏感日期。
为此,我创建了以下方法
@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 并将其转换为时区敏感字符串,然后将该字符串转换为日期时间对象并将其输入数据库。我仅将此字段 (tz_check_in) 用于参考目的,所有前端日期均为原始日期。
我正在尝试将 hr_attendance 记录转换为工资单,但是这些日期时间需要对时区敏感才能正确支付我们的员工。有没有办法在搜索域中执行此操作?
这是我当前的代码
在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)])
但是,不存储时区敏感日期。
为此,我创建了以下方法
@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 并将其转换为时区敏感字符串,然后将该字符串转换为日期时间对象并将其输入数据库。我仅将此字段 (tz_check_in) 用于参考目的,所有前端日期均为原始日期。