Как добавить данные в POS-заказ Odoo13

Я пытаюсь добавить данные в заказ POS и отправить эти данные в модель pos.order на основе сайта https://odoo-development.readthedocs.io/en/latest/dev/pos/load-data-to-pos.html . Чтобы сделать мой случай более общим, я создаю новую модель odoo с именем 'custom.model', я создаю связь с 'pos.config', чтобы помочь мне с доменом модели в последнем javascritp со следующим кодом:

# -*- coding: utf-8 -*-

from odoo import models, fields

class custom_model(models.Model):
    _name = 'custom.model'

    name = fields.Char(string='name')

class myPosConfig(models.Model):
    _inherit = 'pos.config'

    custom_model_id = fields.Many2one('custom.model', string='My custom model')

Затем я добавляю интересующее меня отношение к модели pos.order с помощью следующего кода Python:

# -*- coding: utf-8 -*-

from odoo import models, fields, api


class myPosOrder(models.Model):
    _inherit = 'pos.order'

    custom_model_id = fields.Many2one('custom.model', string='My model')

Затем я добавляю свою пользовательскую модель в интерфейс с файлом javascript со следующим кодом:

odoo.define('kyohei_pos_computerized_billing.billing_dosage', function (require) {
    "use strict";

    var models = require('point_of_sale.models');
    var _super_order_model = models.Order.prototype;

    models.load_models([{
        model: 'custom.model',
        label: 'custom_model',
        fields: ['name'],
        // Domain to recover the custom.model record related to my pos.config
        domain: function(self){ return [['id', '=', self.config.custom_model_id[0]]];},
        loaded: function(self, dosage){self.dosage = dosage[0]},
    }]);

});

Затем я добавляю следующий код в тот же файл javascript, чтобы запись сохранялась в браузере и при необходимости отправляла данные на бэкэнд:

    models.Order = models.Order.extend({
        initialize: function(){
          _super_order_model.initialize.apply(this,arguments);
          if (this.custom_model){
              this.custom_model = this.pos.custom_model;
          }
        },

        export_as_JSON: function () {
            var data = _super_order_model.export_as_JSON.apply(this, arguments);
            data.custom_model = this.custom_model;
            return data
        },

        init_from_JSON: function (json) {
            this.custom_model = json.custom_model;
            _super_order_model.init_from_JSON.call(this. json);
        },

        export_for_printing: function() {
        var json = _super_order_model.export_for_printing.apply(this,arguments);
        json.custom_model = this.custom_model;
        return json;
        },

    });

и, наконец, добавили в модель pos.order следующий метод, чтобы он сохранял то, что отправляет интерфейс:

    @api.model
    def _order_fields(self, ui_order):
        fields = super(MyPosOrder, self)._order_fields(ui_order)

        fields.update({
            'custom_model': ui_order('custom_model.id')
        })

        return fields

Но поле все еще не заполняется моим идентификатором реестра custom_model, и я получаю следующую ошибку:

Odoo Server Error
Traceback (most recent call last):
  File "/opt/odoo/odoo13/odoo/http.py", line 619, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "/opt/odoo/odoo13/odoo/http.py", line 309, in _handle_exception
    raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
  File "/opt/odoo/odoo13/odoo/tools/pycompat.py", line 14, in reraise
    raise value
  File "/opt/odoo/odoo13/odoo/http.py", line 664, in dispatch
    result = self._call_function(**self.params)
  File "/opt/odoo/odoo13/odoo/http.py", line 345, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "/opt/odoo/odoo13/odoo/service/model.py", line 93, in wrapper
    return f(dbname, *args, **kwargs)
  File "/opt/odoo/odoo13/odoo/http.py", line 338, in checked_call
    result = self.endpoint(*a, **kw)
  File "/opt/odoo/odoo13/odoo/http.py", line 910, in __call__
    return self.method(*args, **kw)
  File "/opt/odoo/odoo13/odoo/http.py", line 510, in response_wrap
    response = f(*args, **kw)
  File "/opt/odoo/odoo13/addons/web/controllers/main.py", line 1320, in call_kw
    return self._call_kw(model, method, args, kwargs)
  File "/opt/odoo/odoo13/addons/web/controllers/main.py", line 1312, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
  File "/opt/odoo/odoo13/odoo/api.py", line 383, in call_kw
    result = _call_kw_model(method, model, args, kwargs)
  File "/opt/odoo/odoo13/odoo/api.py", line 356, in _call_kw_model
    result = method(recs, *args, **kwargs)
  File "/opt/odoo/odoo13/addons/point_of_sale/models/pos_order.py", line 440, in create_from_ui
    order_ids.append(self._process_order(order, draft, existing_order))
  File "/opt/odoo/odoo13/addons/point_of_sale/models/pos_order.py", line 122, in _process_order
    pos_order = self.create(self._order_fields(order))
  File "/opt/odoo/odoo13/kyohei_addons/kyohei_pos_computerized_billing/models/pos_order.py", line 27, in _order_fields
    'test_string': ui_order('dosage.id'),
TypeError: 'dict' object is not callable

person Simon Capriles    schedule 07.04.2020    source источник


Ответы (2)


Эта ошибка из-за несоответствия аргументов в методе, просто проверьте odoo-13 this method _ process_order

В вашем коде вы использовали метод старой версии, а в версии odoo13 он изменен.

В этом методе необходимо обновить поле, в которое данные поступили из функции export_as_JSON.

@api.model
def _order_fields(self, ui_order):
    pos_order = super(KyoheiComputerizedPosOrder, self)._order_fields(ui_order)
    # Get the data from ui_order  
    return pos_order

Спасибо

person Dipen Shah    schedule 07.04.2020
comment
Спасибо за ответ @Dipen Shah, я изменил метод (проверьте мои изменения), но я все еще не могу передать данные в бэкэнд-запись pos.order. Как должен выглядеть метод? - person Simon Capriles; 07.04.2020
comment
@Simon Capriles, я отредактировал свой код, посмотрите. - person Dipen Shah; 08.04.2020

Я хочу поблагодарить @Dipen Shah, наконец-то наш код заработал. Файл python должен выглядеть следующим образом:

# -*- coding: utf-8 -*-

from odoo import models, fields, api


class MyPosOrder(models.Model):
    _inherit = 'pos.order'

    test_string = fields.Char(string='test_string')

    @api.model
    def _order_fields(self, ui_order):
        order_fields = super(MyPosOrder, self)._order_fields(ui_order)

        order_fields['test_string'] = ui_order.get('test_string')

        return order_fields

Файл, который может помочь разобраться в этой проблеме, - это pos_order.py pos_restaurant.

person Simon Capriles    schedule 08.04.2020