Odoo PoS не показывает значение настраиваемого поля - PullRequest
0 голосов
/ 22 марта 2020

Я создал модуль, который добавляет некоторые пользовательские поля в модель res.partner и партнера PoS с файлом python и файлом javascript. Я знаю, что оба работают правильно, потому что, когда я пишу некоторый контент в поле, запись обновляется в бэкэнде. Проблема в том, что PoS не показывает значение поля. Файл python, который добавляет поле, имеет следующую форму:

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

from odoo import models, fields, api

class MyModulePartner(models.Model):
    _inherit = 'res.partner'

    billing_name = fields.Char(string='Billing name')
    billing_number = fields.Char(string='Billing number')

Файл javascript имеет следующую форму:

odoo.define('my_module.partner', function (require) {
"use strict";

   var models = require('point_of_sale.models');
   var _super_posmodel = models.PosModel.prototype;

   models.PosModel = models.PosModel.extend({
   initialize: function (session, attributes) {
      var partner_model = _.find(this.models, function(model) {
           return model.model === 'res.partner';
      });
      partner_model.fields.push(['billing_name', 'billing_number']);
      return _super_posmodel.initialize.call(this, session, attributes);
      },
   });
});

Затем я добавил файл javascript с файлом "views / computerized_pos_assets_template. xml" со следующим кодом:

<?xml version="1.0" encoding="utf-8"?>
<odoo>

   <template id="assets" inherit_id="point_of_sale.assets">
      <xpath expr="." position="inside">
         <script type="text/javascript" src="/my_module/static/src/js/partner.js"></script>
      </xpath>
   </template>

</odoo>

Попытка изменить представление pos с файлом "static / src / xml / computerized_pos. xml" с помощью следующий код:

<?xml version="1.0" encoding="UTF-8"?>
<template xml:space="preserve">

    <t t-extend="ClientDetailsEdit">
        <t t-jquery=".client-details-left" t-operation="replace">
            <div class='client-details-left'>
                <div class='client-detail'>
                    <span class='label'>Razón</span>
                    <input class='detail client-billing-name'           name='billing_name'     t-att-value='partner.billing_name || ""'></input>
                </div>
                <div class='client-detail'>
                    <span class='label'>Tax ID</span>
                    <input class='detail vat'           name='vat'     t-att-value='partner.vat || ""'></input>
                </div>
                <div class='client-detail'>
                    <span class='label'>Barcode</span>
                    <input class='detail barcode'       name='barcode'    t-att-value='partner.barcode || ""'></input>
                </div>
                <div class='client-detail'>
                    <span class='label'>Correo</span>
                    <input class='detail client-email'  name='email'    type='email'    t-att-value='partner.email || ""'></input>
                </div>
            </div>
        </t>
   </t>

<t t-extend="ClientDetails">
        <t t-jquery=".client-details-left" t-operation="replace">
            <div class='client-details-left'>
                <div class="client-detail">
                    <span class="label">Razón</span>
                    <t t-if='partner.billing_name'>
                        <span class="detail client-billing-name"><t t-esc="partner.billing_name"/></span>
                    </t>
                    <t t-if='!partner.billing_name'>
                        <span class="detail client-billing-name empty">N/A</span>
                    </t>
                </div>
                <div class='client-detail'>
                    <span class='label'>Barcode</span>
                    <t t-if='partner.barcode'>
                        <span class='detail client-id'><t t-esc='partner.barcode'/></span>
                    </t>
                    <t t-if='!partner.barcode'>
                        <span class='detail client-id empty'>N/A</span>
                    </t>
                </div>
                <div class='client-detail'>
                    <span class='label'>Correo</span>
                    <t t-if='partner.email'>
                        <span class='detail client-email'><t t-esc='partner.email' /></span>
                    </t>
                    <t t-if='!partner.email'>
                        <span class='detail client-email empty'>N/A</span>
                    </t>
                </div>
            </div>
        </t>
   </t>

И, наконец, в файле манифеста я добавил следующие файлы:

'data': [
        'views/computerized_pos_assets_template.xml',
    ],
    'qweb': [
        'static/src/xml/computerized_pos.xml',
    ],

Что-то, что я заметил, это то, что в "представлениях" /computerized_pos_assets_template.xml "Я подробно описываю расположение файла javascript как" /my_module/static/src/js/partner.js "Odoo выдает следующую ошибку:

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/odoo/models.py", line 4845, in search_read
    result = records.read(fields)
  File "/opt/odoo/odoo13/odoo/models.py", line 2877, in read
    fields = self.check_field_access_rights('read', fields)
  File "/opt/odoo/odoo13/odoo/models.py", line 2809, in check_field_access_rights
    invalid_fields = {name for name in fields if not valid(name)}
  File "/opt/odoo/odoo13/odoo/models.py", line 2809, in <setcomp>
    invalid_fields = {name for name in fields if not valid(name)}
  File "/opt/odoo/odoo13/odoo/models.py", line 2800, in valid
    field = self._fields.get(fname)
TypeError: unhashable type: 'list'

Но когда расположение "/static/src/js/partner.js" Я получаю следующую ошибку:

point_of_sale.assets.js:477 Could not get content for /static/src/js/partner.js defined in bundle 'point_of_sale.assets'.

1 Ответ

0 голосов
/ 28 марта 2020

Я понял, что функция, которую я использовал для полей pu sh, не поддерживает списки, поэтому после того, как я исправил файл js, как показано ниже, поле работало корректно:

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

    var models = require('point_of_sale.models');
    var super_posmodel = models.PosModel.prototype;

    models.PosModel = models.PosModel.extend({
        initialize: function (session, attributes) {
            var partner_model = _.find(this.models, function (model){
                return model.model === 'res.partner';
            });
            partner_model.fields.push('billing_name');
            return super_posmodel.initialize.call(this, session, attributes);
        },
    });
});
...