首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在odoo 13中输入月份时如何计算到期日

在odoo 13中输入月份时如何计算到期日
EN

Stack Overflow用户
提问于 2020-06-01 20:47:41
回答 1查看 178关注 0票数 0

要求是当我们输入purchase Date (如06/01/2020)和month (如14)时。

它将从购买日期开始计算到期日,因此warranty_expires_on Date (如07/31/2021)。

我在版本13中添加了字段,即

代码语言:javascript
复制
purchase_date=fields.Date(string="Purchase Date")

warranty_period=fields.Integer(string="Warranty Period")

warranty_expires_on=fields.Date(string="Warranty Expires on",compute="_get_date",store=True)

unit_of_time = fields.Selection([

        (YEARLY, 'Years'),
        (MONTHLY, 'Months'),
        (WEEKLY, 'Weeks')])
count = fields.Integer(string="Number of ranges to generate", required=True,default=1)

@api.depends('purchase_date','warranty_period')

def _get_date(self):
    for rec in self:
        vals = rrule(freq=rec.unit_of_time, 
                    interval=rec.warranty_period,
                    dtstart=rec.purchase_date,
                    count=rec.count+1)
        vals = list(vals)
        for idx, dt_start in enumerate(vals[:-1]):
            purchase_date = dt_start.date()
            warranty_expires_on = vals[idx+1].date() - relativedelta(days=1)
            rec.update({'warranty_expires_on':warranty_expires_on})

从xml方面来说...

代码语言:javascript
复制
            <xpath expr="//field[@name='warranty_period']" position="after">
                <field name="unit_of_time"/>
            </xpath>


            <xpath expr="//field[@name='unit_of_time']" position="after">
                <field name="count" invisible='1'/>
            </xpath>

但是我面临着下面的错误。

代码语言:javascript
复制
Odoo Server Error

Traceback (most recent call last):


  File "/home/yash/Workspace/odoo_13/odoo/http.py", line 619, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)

  File "/home/yash/Workspace/odoo_13/odoo/http.py", line 309, in _handle_exception
    raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])

  File "/home/yash/Workspace/odoo_13/odoo/tools/pycompat.py", line 14, in reraise
    raise value

  File "/home/yash/Workspace/odoo_13/odoo/http.py", line 664, in dispatch
    result = self._call_function(**self.params)

  File "/home/yash/Workspace/odoo_13/odoo/http.py", line 345, in _call_function
    return checked_call(self.db, *args, **kwargs)

  File "/home/yash/Workspace/odoo_13/odoo/service/model.py", line 93, in wrapper
    return f(dbname, *args, **kwargs)

  File "/home/yash/Workspace/odoo_13/odoo/http.py", line 338, in checked_call
    result = self.endpoint(*a, **kw)

  File "/home/yash/Workspace/odoo_13/odoo/http.py", line 909, in __call__
    return self.method(*args, **kw)

  File "/home/yash/Workspace/odoo_13/odoo/http.py", line 510, in response_wrap
    response = f(*args, **kw)

  File "/home/yash/Workspace/odoo_13/addons/web/controllers/main.py", line 1319, in call_kw
    return self._call_kw(model, method, args, kwargs)

  File "/home/yash/Workspace/odoo_13/addons/web/controllers/main.py", line 1311, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)

  File "/home/yash/Workspace/odoo_13/odoo/api.py", line 395, in call_kw
    result = _call_kw_multi(method, model, args, kwargs)

  File "/home/yash/Workspace/odoo_13/odoo/api.py", line 382, in _call_kw_multi
    result = method(recs, *args, **kwargs)

  File "/home/yash/Workspace/odoo_13/odoo/models.py", line 6062, in onchange
    for name in nametree

  File "/home/yash/Workspace/odoo_13/odoo/models.py", line 6063, in <listcomp>
    if name not in done and snapshot0.has_changed(name)

  File "/home/yash/Workspace/odoo_13/odoo/models.py", line 5930, in has_changed
    return self[name] != record[name]

  File "/home/yash/Workspace/odoo_13/odoo/models.py", line 5589, in __getitem__
    return self._fields[key].__get__(self, type(self))

  File "/home/yash/Workspace/odoo_13/odoo/fields.py", line 973, in __get__
    self.compute_value(recs)

  File "/home/yash/Workspace/odoo_13/odoo/fields.py", line 1087, in compute_value
    records._compute_field_value(self)

  File "/home/yash/Workspace/odoo_13/odoo/models.py", line 3905, in _compute_field_value
    getattr(self, field.compute)()

  File "/home/yash/Workspace/project13/equipment_allocations_app/models/maintenance.py", line 68, in _get_date
    count=rec.count+1)

  File "/usr/local/lib/python3.6/dist-packages/dateutil/rrule.py", line 619, in __init__

    if freq < HOURLY:

TypeError: '<' not supported between instances of 'str' and 'int'
EN

回答 1

Stack Overflow用户

发布于 2020-06-02 01:38:46

rrule freq参数必须是年、月、周、日、小时、分钟或秒之一。

代码语言:javascript
复制
(YEARLY,
 MONTHLY,
 WEEKLY,
 DAILY,
 HOURLY,
 MINUTELY,
 SECONDLY) = list(range(7))

freq必须在list(range(7))

代码语言:javascript
复制
>>> from dateutil.rrule import MONTHLY
>>> MONTHLY
1

如果您尝试在选择的类型中使用不同于str的值,Odoo将引发错误,

代码语言:javascript
复制
AssertionError: Field purchase.order.unit_of_time with non-str value in selection - - -

使用选择值获取整数频率

示例

代码语言:javascript
复制
from dateutil.rrule import rrule, YEARLY, MONTHLY, WEEKLY

unit_of_time = fields.Selection([

    (str(YEARLY), 'Years'),
    (str(MONTHLY), 'Months'),
    (str(WEEKLY), 'Weeks')])

调用rrule时将unit_of_time转换为int

代码语言:javascript
复制
freq=int(rec.unit_of_time)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62132534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档