Odoo 10 Пользовательский отчет Qweb: Ошибка при визуализации при компиляции AST TypeError: Объект 'NoneType' не вызывается - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь расширить существующий отчет из модуля поставщика, вставив сумму, преобразованную в текст, поэтому я начал с нуля создавать модуль для своего отчета:

Это мой report_file.py

from openerp import api, models
from num2words import num2words

class ReportReceiptReprint(models.AbstractModel):
    _name = 'report.aces_pos_reorder.receipt_reprint'

@api.multi
def _numwords(val):
    pretext = val
    text = ''
    entire_part = int((str(pretext).split('.'))[0])
    decimal_part = int((str(pretext).split('.'))[1])  
    text+=num2words(entire_part, lang='es').upper()
    text+=' CON '
    text+=num2words(decimal_part, lang='es').upper()
    if decimal_num > 1:
        text+= ' CENTAVOS '
    else:
        text+= ' CENTAVO '
    return text

@api.multi
def render_html(self, docids, data=None):
    report = self.env['report']._get_report_from_name('aces_pos_reorder.receipt_reprint')
    docargs = {
        'doc_ids': docids,
        'doc_model': report.model,
        'docs': self,
        'num_words': _numwords,
        }
    return self.env['report'].render('aces_pos_reorder.receipt_reprint', docargs)

И мой файл_отчета. xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
   <template id="report_receipt_reprint_inherit" inherit_id="aces_pos_reorder.receipt_reprint">
     <xpath expr="//div[@class='numbers_text']" position="replace">
        <div style="font-size: 14px; width: 100%">
          <b>Son: <span t-esc="num_words(receipt.amount_total)"/></b>
        </div>
     </xpath>
   </template>
</data>
</odoo>

но я просто получаю это:

Error to render compiling AST
TypeError: 'NoneType' object is not callable
Template: 1130
Path: /templates/t/t/div[2]/div[9]/div[1]/b/span
Node: <span t-esc="num_words(receipt.amount_total)"/>

Это происходит, даже если я помещаю функцию _numwords () в файл models.py основного модуля. Расширение для модуля работает, если я избегаю вызывать функцию, текст вставляется как положено. num2words установлен.

Буду признателен за любые комментарии или предложения! Заранее спасибо.

== РЕДАКТИРОВАТЬ ==

report_file.py

from odoo import api, models
from num2words import num2words


class ReportReceiptReprint(models.AbstractModel):
      _name = 'report.aces_pos_reorder.receipt_reprint'

@api.multi
def _numwords(self, val):
    pretext = float(val)
    text = ''
    entire_part = int((str(pretext).split('.'))[0])
    decimal_part = (pretext-float(entire_part))*100
    decimal_part = int((str(decimal_part).split('.'))[0])
    text += num2words(entire_part, lang='es').upper()
    text += ' LEMPIRAS CON '
    text += num2words(decimal_part, lang='es').upper()
    if decimal_part > 1:
        text += ' CENTAVOS '
    else:
        text += ' CENTAVO '
    return text

@api.multi
def render_html(self, docids, data=None):
    # report = self.env['report']._get_report_from_name('aces_pos_reorder.receipt_reprint')
    docargs = {
        'doc_ids': docids,
        'doc_model': self.env.context.get('active_model'),
        'docs': self.env['pos.order'].browse(int(docids)),
        'num_words': self._numbwords,
    }
    return self.env['report'].render('aces_pos_reorder.receipt_reprint', docargs)

Не знаю, почему закомментированная строка "# report = "было много проблем.

Ответы [ 2 ]

0 голосов
/ 20 марта 2020
@api.milti
def _numbwords(self, val)....

@api.multi
def render_html(self, docids, data=None):
# report = self.env['report']._get_report_from_name('aces_pos_reorder.receipt_reprint')
# This line caused problems so commented out
docargs = {
    'doc_ids': docids,
    'doc_model': self.env.context.get('active_model'),
    'docs': self.env['pos.order'].browse(int(docids)), # have to include the model and methods to index the documents
    'num_words': self._numbwords,
}
return self.env['report'].render('aces_pos_reorder.receipt_reprint', docargs)

Вот и все

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

В вашем файле python просто измените вызывающую функцию на

'num_words': self._numwords (data ['form'] ['amount_total']), & def _numwords (self, val)

Где убедиться, что вы проверили, что переданное вами значение amount_total получено из ваших данных и что вы должны передать _numwords функция. И в XML файле t-esc = "num_words" попробуйте получить доступ к значению, как это.

Спасибо

...