gpt4 book ai didi

python - 我想以浮点值显示休假时间

转载 作者:太空宇宙 更新时间:2023-11-03 12:02:21 25 4
gpt4 key购买 nike

我在 hr_leave_rules.py 中创建了字段 half_day_allowed

from odoo import models, fields, api, _

class HRLeaveRules(models.Model):
_name = 'hr_leave_rules.leave_rules'

half_day_allowed = fields.Selection([
('yes',"Yes"),
('no',"No")],
string="Half Day Allowed", required=True)

而且,我还继承了字段get_number_of_days,它计算休假的天数和holiday_status_id,它指示休假类型。我想做的是,如果对于特定的 holiday_status_id 如果 half_day_allowed 是"is",那么在 get_number_of_days 中它应该采用 float 值,否则它将采用 整数 值。为此,我尝试了下面的代码,但它不起作用。请帮助我。

leave_type.py

from odoo import fields, models, api, _
from math import ceil
from datetime import timedelta
from openerp.exceptions import UserError

HOURS_PER_DAY = 8

class leave(models.Model):
_inherit = "hr.holidays"


@api.onchange('number_of_days_temp')
def _holiday_status_id(self):

current = self.env['hr_leave_rules.leave_rules'].search([(
'holiday_status_id','=',self.holiday_status_id.id)])

@api.onchange('date_from')
def _onchange_date_from(self):

date_from = self.date_from
date_to = self.date_to

if date_from and not date_to:
date_to_with_delta = fields.Datetime.from_string(date_from) + timedelta(hours=HOURS_PER_DAY)
self.date_to = str(date_to_with_delta)
current = self.env['hr_leave_rules.leave_rules'].search([(
'holiday_status_id','=',self.holiday_status_id.id)])

if current.half_day_allowed == 'yes':
if (date_to and date_from) and (date_from <= date_to):
self.number_of_days_temp = self._get_number_of_days(
date_from, date_to, self.employee_id.id)
else:
self.number_of_days_temp = 0
else:
if (date_to and date_from) and (date_from <= date_to):
self.number_of_days_temp = ceil(self._get_number_of_days(
date_from, date_to, self.employee_id.id))
else:
self.number_of_days_temp = 0

@api.onchange('date_to')
def _onchange_date_to(self):

date_from = self.date_from
date_to = self.date_to

current = self.env['hr_leave_rules.leave_rules'].search([(
'holiday_status_id','=',self.holiday_status_id.id)])

if current.half_day_allowed == 'yes':
if (date_to and date_from) and (date_from <= date_to):
self.number_of_days_temp = self._get_number_of_days(
date_from, date_to, self.employee_id.id)
else:
self.number_of_days_temp = 0
else:
if (date_to and date_from) and (date_from <= date_to):
self.number_of_days_temp = ceil(self._get_number_of_days(
date_from, date_to, self.employee_id.id))
else:
self.number_of_days_temp = 0

最佳答案

从哪里开始......

首先,如果您有一个是/否字段,则应将其定义为 Boolean 字段,而不是 Char 字段。 Fields Documentation .它将允许您执行更简单的 if/else 逻辑,更不用说它只是一种更好的做法。

if half_day_allowed:
# Do this way
else:
# Do that way

其次,如果你有重复的代码,你应该把它分解成自己的方法以提高可读性。 Don't repeat yourself .

您已经将整个部分重复了两次:

if half_day_allowed == 'yes':
if (date_to and date_from) and (date_from <= date_to):
self.number_of_days_temp = self._get_number_of_days(
date_from, date_to, self.employee_id.id)
else:
self.number_of_days_temp = 0
else:
if (date_to and date_from) and (date_from <= date_to):
self.number_of_days_temp = ceil(self._get_number_of_days(
date_from, date_to, self.employee_id.id))
else:
self.number_of_days_temp = 0

相反,只需创建一个新方法并在需要时调用它。

@api.multi
def get_number_of_days_temp(self, half_day_allowed=False):
self.ensure_one()
if half_day_allowed == 'yes':
# Do this
else:
# Do that

@api.onchange('date_from')
def _onchange_date_from(self):
...
self.number_of_days_temp = self.get_number_of_days_temp(current.half_day_allowed)

@api.onchange('date_to')
def _onchange_date_to(self):
...
self.number_of_days_temp = self.get_number_of_days_temp(current.half_day_allowed)

最后,为了确定未获得预期结果的问题所在,我们需要您提供更多信息。到目前为止你所说的是:

I tried the below code but it is not working.

Its not showing correct get_number_of_days in both the cases i.e., in 'yes' and 'no'

这对确定问题没有帮助。有错误信息吗?它是否返回无效数据?如果是这样,输入和输出是什么以及期望它应该是什么?

在一无所知的情况下,我唯一的猜测是您的 number_of_days_temp 字段(您没有在问题中包含字段定义)被定义为 Integer 字段,在这种情况下,它将始终忽略小数。它必须定义为 Float 才能工作。

关于python - 我想以浮点值显示休假时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45027648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com