Odoo如何获取上个月的第1天和最后一天

GeekerMaster奇客大师有一个SAP自由顾问管理模块,每个月初可以添加上个月的人天数记录,为了减少录入工作量,奇客大师设置了自动获取上个月的工作周期,从月初到月末,代码如下:

import datetime

date_from = fields.Date('Date From', required=True, default=datetime.date(datetime.date.today().year, datetime.date.today().month-1, 1))
date_to = fields.Date('Date To', required=True, default=datetime.date(datetime.date.today().year, datetime.date.today().month, 1)-datetime.timedelta(1))

一直工作正常,结果刚刚进入2019新年,爆出 错误代码:

date_from = fields.Date('Date From', required=True, default=datetime.date(datetime.date.today().year,datetime.date.today().month-1,1))
ValueError: month must be in 1..12

应该是因为现在是1月,如果month-1之后就是0月,系统认为只有1-12个月才存在的缘故吧。使用odoo api进行改造吧:

    @api.multi
    def default_last_month_first_day(self):
        tday = datetime.date.today()
        now_month = tday.month
        if now_month > 1:
            last_month = datetime.date(
                    tday.year, tday.month-1, 1)
        else:
            last_month = datetime.date(
                tday.year, tday.month, 1
            )
        return(last_month)

可以工作,但不完美,也就是如果是1月份,那么date_from获取的是当前月份的第一天,不是上个月的第一天。

引入relativedelta完美解决

import datetime
from dateutil import relativedelta

    @api.multi
    def default_last_month_first_day(self):
        today = datetime.date.today()
        d = today - relativedelta.relativedelta(months=1)
        return datetime.date(d.year, d.month, 1)

    date_from = fields.Date('Date From', required=True, default=default_last_month_first_day, track_visibility='onchange')


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

奇客罗方公众号 奇客罗方小程序 奇客罗方客服 ITGeeker Telegram

网站由ITGeeker技术奇客开发并管理;隶属于GeekerCloud奇客罗方智能科技
Site designed and developed by ITGeekerwhich is a sub-website of GeekerCloud
网站地图 | 沪ICP备2021031434号-4