Odoo - 如何从另一个模块更新字段值

时间:2016-02-16 12:59:29

标签: python-2.7 openerp odoo-8

我试图制作一个模块来管理员工的旅行休假。

我需要做的是在' available_tickets'的hr.employee模块中添加额外的浮点字段。 。从名为" travel_request"的其他模块分配。这该怎么做? 这是我的代码:

class travel_request(osv.osv):

    _name = 'travel.request'

    _columns = {

        'no_tickets': fields.float('Number of Tickets'),

     }

class hr_employee(osv.osv):
_inherit="hr.employee"


def _get_tickets(self, cr, uid, ids, field_name, args, context=None):
    res = {}
    tickets_obj = self.pool.get('travel.request')
    tickets_ids = self.pool.get('travel.request').search(cr, uid, [('user_id', '=', uid), ('state', '=', 'validate')])
    for t_id in tickets_ids :
        emp_ticket = tickets_obj.browse(cr, uid, t_id, context=context)

    res['available_tickets'] = emp_ticket.no_tickets
    return res    


_columns = {
    'available_tickets': fields.function(_get_tickets, string='Available Tickets', type="float", store=True),
}

我也尝试过这种方法:

def _get_tickets(self, cr, uid, ids, field_name, args, context=None):
    res = {}
    tickets_obj = self.pool.get('travel.request')
    for record in self.browse(cr, uid, ids, context=None):
        tickets_ids = tickets_obj.search(cr, uid, [('user_id', '=', uid), ('state', '=', 'validate')], ids, context=None)
        emp_ticket = tickets_obj.browse(cr, uid, tickets_ids[0], context=None )
        res['available_tickets'] = emp_ticket.no_tickets        
    return res 

但什么都没发生,我不知道出了什么问题。任何人都可以帮我修理它

以下是错误消息:

2016-02-16 13:29:14,549 27608 ERROR test2_travel openerp.http: Exception during JSON request handling.
Traceback (most recent call last):
  File "/opt/odoo8/odoo/openerp/http.py", line 537, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "/opt/odoo8/odoo/openerp/http.py", line 574, in dispatch
    result = self._call_function(**self.params)
  File "/opt/odoo8/odoo/openerp/http.py", line 310, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "/opt/odoo8/odoo/openerp/service/model.py", line 118, in wrapper
    return f(dbname, *args, **kwargs)
  File "/opt/odoo8/odoo/openerp/http.py", line 307, in checked_call
    return self.endpoint(*a, **kw)
  File "/opt/odoo8/odoo/openerp/http.py", line 803, in __call__
    return self.method(*args, **kw)
  File "/opt/odoo8/odoo/openerp/http.py", line 403, in response_wrap
    response = f(*args, **kw)
  File "/opt/odoo8/odoo/addons/web/controllers/main.py", line 944, in call_kw
    return self._call_kw(model, method, args, kwargs)
  File "/opt/odoo8/odoo/addons/web/controllers/main.py", line 936, in _call_kw
    return getattr(request.registry.get(model), method)(request.cr, request.uid, *args, **kwargs)
  File "/opt/odoo8/odoo/openerp/api.py", line 268, in wrapper
    return old_api(self, *args, **kwargs)
  File "/opt/odoo8/odoo/addons/hr_holidays/hr_holidays.py", line 494, in create
    return super(hr_employee, self).create(cr, uid, vals, context=context)
  File "/opt/odoo8/odoo/openerp/api.py", line 268, in wrapper
    return old_api(self, *args, **kwargs)
  File "/opt/odoo8/odoo/addons/hr/hr.py", line 285, in create
    employee_id = super(hr_employee, self).create(cr, uid, data, context=context)
  File "/opt/odoo8/odoo/openerp/api.py", line 268, in wrapper
    return old_api(self, *args, **kwargs)
  File "/opt/odoo8/odoo/addons/mail/mail_thread.py", line 381, in create
    thread_id = super(mail_thread, self).create(cr, uid, values, context=context)
  File "/opt/odoo8/odoo/openerp/api.py", line 268, in wrapper
    return old_api(self, *args, **kwargs)
  File "/opt/odoo8/odoo/openerp/api.py", line 372, in old_api
    result = method(recs, *args, **kwargs)
  File "/opt/odoo8/odoo/openerp/models.py", line 4094, in create
    record = self.browse(self._create(old_vals))
  File "/opt/odoo8/odoo/openerp/api.py", line 266, in wrapper
    return new_api(self, *args, **kwargs)
  File "/opt/odoo8/odoo/openerp/api.py", line 508, in new_api
    result = method(self._model, cr, uid, *args, **old_kwargs)
  File "/opt/odoo8/odoo/openerp/models.py", line 4279, in _create
    result += self._columns[field].set(cr, self, id_new, field, vals[field], user, rel_context) or []
  File "/opt/odoo8/odoo/openerp/osv/fields.py", line 1486, in set
    self._fnct_inv(obj, cr, user, id, name, value, self._fnct_inv_arg, context)
  File "/opt/odoo8/odoo/addons/hr/hr.py", line 186, in _set_image
    return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)
  File "/opt/odoo8/odoo/openerp/api.py", line 268, in wrapper
    return old_api(self, *args, **kwargs)
  File "/opt/odoo8/odoo/addons/mail/mail_thread.py", line 432, in write
    result = super(mail_thread, self).write(cr, uid, ids, values, context=context)
  File "/opt/odoo8/odoo/openerp/api.py", line 268, in wrapper
    return old_api(self, *args, **kwargs)
  File "/opt/odoo8/odoo/openerp/api.py", line 399, in old_api
    result = method(recs, *args, **kwargs)
  File "/opt/odoo8/odoo/openerp/models.py", line 3789, in write
    self._write(old_vals)
  File "/opt/odoo8/odoo/openerp/api.py", line 266, in wrapper
    return new_api(self, *args, **kwargs)
  File "/opt/odoo8/odoo/openerp/api.py", line 592, in new_api
    result = method(self._model, cr, uid, self.ids, *args, **old_kwargs)
  File "/opt/odoo8/odoo/openerp/models.py", line 4037, in _write
    cr, user, todo, fields_to_recompute, context)
  File "/opt/odoo8/odoo/openerp/api.py", line 268, in wrapper
    return old_api(self, *args, **kwargs)
  File "/opt/odoo8/odoo/openerp/models.py", line 4453, in _store_set_values
    cr.execute(query, (column._symbol_set[1](value), id))
  File "/opt/odoo8/odoo/openerp/sql_db.py", line 158, in wrapper
    return f(self, *args, **kwargs)
  File "/opt/odoo8/odoo/openerp/sql_db.py", line 234, in execute
    res = self._obj.execute(query, params)
DataError: invalid input syntax for integer: "available_tickets"
LINE 1: ...ployee" SET "available_tickets"='5.00' WHERE id = 'available...

1 个答案:

答案 0 :(得分:4)

您有多个问题。

1。您的错误消息

错误消息DataError: invalid input syntax for integer: "available_tickets"指向您的错误。您的计算字段实现返回dict,其中"available_tickets"为密钥,而不是员工ID。因此,当系统尝试更新数据库时,无法找到ID为"available_tickets"的员工记录。

问题在于get_tickets()

res['available_tickets'] = emp_ticket.no_tickets

您需要遍历传递给ids的员工get_tickets()并返回如下所示的结果res

{
  1: 3.0,  # 3 `available_tickets` for employee ID 1
  2: 4.0,  # 4 `available_tickets` for employee ID 2
  ...
}

所以在get_tickets()你应该有这样的东西:

res[emp.id] = <computed number of tickets> # emp = hr.employee record!

请查看有关编写计算字段(old APInew API)的文档或官方Odoo模块中的示例以获取灵感。

2。您的计算字段逻辑

get_tickets()的当前(草稿?)实现没有多大意义:

  • 它应该在请求的hr.employee ID上有一个主循环。这很重要,因为Odoo计算字段是由系统批量计算的。
  • 它应该可能不依赖于当前用户来计算结果。目前,您正在通过此域travel.requests搜索当前用户的('user_id', '=', uid)。这意味着您正在查看正在查看或修改员工用户的travel.requests,而不是该员工的用户。这是应该使用ids变量的地方;至browse您正在为其计算价值的员工,然后搜索相应的travel.request
  • 如果要存储计算值(store=True),则需要正确的重新计算触发器,否则在修改/添加travel.request时,存储的值不会更改。在新API中,这是使用@api.depends完成的,并在旧API中通过传递store字典来完成,如文档中所述。

阅读官方插件的文档和源代码是了解Odoo计算字段的最佳方式。