Odoo qweb报告采购申请的数量

时间:2018-04-22 13:19:34

标签: numbers report odoo words qweb

我正在努力实现odoo 10中的单词数量。我正在覆盖采购申请模板。我将分享我的.py和.xml文件,请检查我做错了什么。提前谢谢!

Step1:使用scaffold命令创建模块。

第2步:model.py

# -*- coding: utf-8 -*-
from odoo import models, fields, api
from openerp import models, api _
from openerp.tools import amount_to_text_en
from openerp import tools
from openerp.tools.amount_to_text import amount_to_text

 class purchase_agreement_updates(models.Model):
     _name = 'purchase_agreement_updates.purchase_agreement_updates'
     _inherit = 'self.header'

     @api.multi
     def amount_to_text(self, amount, currency='Euro'):
         return amount_to_text(amount, currency)
purchase_agreement_updates()
class purchase_requisition(models.Model):
    _inherit = 'purchase.requisition'

     @api.multi
     def amount_to_text(self, amount, currency='Euro'):
         return amount_to_text(amount, currency)

templates.xml:

        <t t-name="purchase_requisition.report_purchaserequisitions">
            <t t-call="report.html_container">
                <t t-foreach="docs" t-as="o">
                    <!--<t t-call="report.external_layout">-->
                        <div class="header">


                              <div style="float:left;width:100px;"></div>
                              <div style="margin:0 auto;width:100%;">
                                  <h3 style="text-align:center;text-decoration: underline;margin-top:50px;">PURCHASE REQUISITION</h3></div>
                              <div style="float:right;width:100px;">
                                  <img t-if="res_company.logo" t-att-src="'data:image/png;base64,%s' %res_company.logo" height="120px" width="100px"/></div>

                            <!--<t t-esc="o.name"/>-->
                        </div>
.
.
.
.
.
.
               <tr t-foreach="o.line_ids" t-as="line_ids">
                                    <t t-set="total_value" t-value="total_value+line_ids.product_qty * line_ids.price_unit"/>
                                    <td style="border:1px solid #000;padding-left:5px;height:25px;"><span t-esc="line_ids_index+1"/> </td>
                                    <td style="border:1px solid #000;padding-left:5px;height:25px;"><span t-field="line_ids.product_id.name"/></td>
                                    <td style="border:1px solid #000;padding-left:5px;height:25px;"><span t-field="line_ids.product_qty"/> </td>
                                    <td style="border:1px solid #000;padding-left:5px;height:25px;"><span t-field="line_ids.price_unit"/> </td>
                                    <td style="border:1px solid #000;padding-left:5px;height:25px;"><span t-esc="line_ids.product_qty * line_ids.price_unit"/> </td></tr>

                                <tr><td style="border:1px solid #000;padding-left:5px;height:25px;"> </td>
                                    <td style="border:1px solid #000;padding-left:5px;height:25px;"> </td>
                                    <td style="border:1px solid #000;padding-left:5px;height:25px;"> </td>
                                    <td style="border:1px solid #000;padding-left:5px;height:25px;">Total </td>
                                    <td style="border:1px solid #000;padding-left:5px;height:25px;"> <t t-esc="total_value"/></td></tr>


                                <tr><td style="border:1px solid #000;padding-left:5px;height:25px;" colspan="5"><span style="font-weight:bold;">TOTAL PURCHASE:</span> <t t-esc="total_value"/> </td></tr>
                                <tr><td style="border:1px solid #000;padding-left:5px;height:25px;" colspan="5"><span style="font-weight:bold;">TOTAL PURCHASE IN WORDS:</span> <span t-esc="o.amount_to_text(total_value, 'Aed')"/>
                                        <!--<span t-esc="o.amount_to_text('2000', o.currency_id)"/>-->  </td></tr>

错误: 渲染编译AST时出错 AttributeError:'purchase.requisition'对象没有属性'amount_to_text' 模板:844 路径:/ templates / t / t / t / t / div [2] / table [2] / tr [5] / td / span [2] 节点:

5 个答案:

答案 0 :(得分:1)

您无需进行任何覆盖。每个货币记录都内置了此功能。如果您有多货币设置,那么purchase.requisition的order_id或公司或用户应该引用货币。确定要使用的货币或者您可以在qweb中获取默认货币ID并致电currency_id.amount_to_text(o.amount_total)。这里currency_id是对货币对象的引用。

答案 1 :(得分:0)

我认为问题在于了解line_ids代表什么模型。

您的报告将参数“docs”中每个对象的对象“o”捕获为对象“o”,该参数将传递给报表呈现函数。

t-foreach="docs" t-as="o"

报告现在忙于根据对象“o”的xml进行渲染,然后迭代对象“o”中找到的每个line_id。

t-foreach="o.line_ids" t-as="line_ids"

我没有看到每个“line_ids”对应的模型,但该模型必须具有该功能

def amount_to_text()

我怀疑你的功能不在适当的模型中,如果你想执行这个功能,你必须将它移动到正确的模型。

答案 2 :(得分:0)

亲爱的菲利普非常感谢您的详细回复。

对我有用的解决方案是这样的,正如我在提问中提到的那样,我使用的是odoo 10。

Models.py:

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

from odoo import models, fields, api
import num2words

class purchase_requisition(models.Model):
    _inherit = 'purchase.requisition'

    def conv(self, val):
        return num2words.num2words(val)

templates.xml:

<span t-esc="o.conv(total_value)" style="text-transform:uppercase;"/>

答案 3 :(得分:0)

from odoo.tools import amount_to_text_en

    amt_in_words = fields.Char(compute='set_amt_in_words')

    def set_amt_in_words(self):
            for each in self:
                amount, currency = each.amount_total, each.currency_id.name
                amount_in_words = amount_to_text_en.amount_to_text(amount, lang='en', currency=currency)
                if currency == 'INR':
                    amount_in_words = str(amount_in_words).replace('INR', 'rupees')
                    amount_in_words = str(amount_in_words).replace('Cents', 'paise')
                    amount_in_words = str(amount_in_words).replace('Cent', 'paise')
                amount_in_words += '\tonly'
                each.amt_in_words = amount_in_words.title()

XML :
<span t-esc="o.amt_in_words"/>

答案 4 :(得分:0)

@ api.multi     def amount_to_text(自身,金额,货币=“ INR”):         amount_in_words = amount_to_text_en.amount_to_text(amount,lang ='en',currency = currency)         如果货币=='INR':             amount_in_words = str(amount_in_words).replace('INR','rupees')             amount_in_words = str(amount_in_words).replace('Cents','paise')             amount_in_words = str(amount_in_words).replace('Cent','paise')         amount_in_words + ='\ tonly'         返回amount_in_words

def get_amount_in_words(self, amount):
    amount_in_words = self.amount_to_text(amount)
    return amount_in_words

和xml-