2016-02-16 2 views
1

Я пытаюсь создать модуль для управления поездками для сотрудников.Odoo - Как обновить значение поля от другого модуля

Что мне нужно сделать, это добавить дополнительное поле с плавающей точкой в ​​hr.employee module of 'available_tickets'. Будет выделено из другого модуля с именем «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... 
+0

вам нужно изменить значение * на лету *? Я имею в виду в GUI? –

+1

Да, и жаль, что я не определил поле как функцию. Я обновил его в вопросе – youta

ответ

4

У вас несколько проблем.

1. Ваше сообщение об ошибке

Сообщение об ошибке DataError: invalid input syntax for integer: "available_tickets" указывает на вашей ошибки. Вычисленная реализация поля возвращает dict с "available_tickets" в качестве ключа вместо идентификаторов сотрудника. Поэтому, когда система пытается обновить базу данных, не удается найти запись сотрудника с идентификатором "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 API, new API) или примеры в официальных модулях Odoo для вдохновения.

2. Ваша компьютерная логика поля

Ваш текущий (проект?) Реализация для get_tickets() имеет мало смысла:

  • он должен иметь основной цикл по запрашиваемым hr.employee идентификаторов. Это важно, потому что вычисляемые поля Odoo вычисляются в пакетном режиме системой.
  • он должен, по-видимому, не зависеть от текущего пользователя, чтобы вычислить результат. В настоящее время вы ищете travel.requests текущего пользователя через этот домен ('user_id', '=', uid). Это означает, что вы смотрите на пользователя , который просматривает или изменяет сотрудника, а не пользователя сотрудника. Здесь следует использовать переменную ids; до browse сотрудников, для которых вы вычисляете значения, а затем выполните поиск нужного travel.request.
  • Если вы храните вычисленное значение (store=True), вам нужны правильные триггеры перекомпоновки, иначе сохраненное значение не изменится при изменении/добавлении travel.request. В новом API это делается с помощью @api.depends и в старом API, передавая словарь store, как описано в документации.

Чтение документации и исходного кода официальных дополнений - это действительно лучший способ узнать о вычисленных по Odoo полях.

+0

Уважаемый разработчик, я полностью согласен с вами. Ваш ответ является наиболее правильным, полным и информативным. Поэтому мой ответ не имеет смысла. Удачи в развитии;) –

Смежные вопросы