Odoo Help

Welcome!

This community is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.

1

AttributeError: 'unicode' object has no attribute 'get' with a functional field

By
N
on 5/28/13, 12:03 PM 5,094 views

I want to obtain in a account.invoice the value of a field of the sale order which has created the invoice.

class account_invoice(osv.osv):
    _name = "account.invoice"
    _inherit = "account.invoice"

    def _get_n_ref(self, cr, uid, ids, field_name, arg, context=None):
        origin = self.pool.get('account.invoice').browse(cr, uid, ids, context=context)[0].origin # recuperer attribut 'origin' qui correspond au nom de la commande
        order_id = self.pool.get('sale.order').search(cr, uid, [('name', '=', origin)], context=context)[0] # recuperer id de la commande
        return self.pool.get('sale.order').browse(cr, uid, order_id, context=context)['n_ref'] # retourne n/ref de la commande

    _columns = {
        'n_ref': fields.function(_get_n_ref, string='N/Ref', type='char', store=True),
    }

account_invoice()

I have the error :

Server Traceback (most recent call last):
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\openerp\addons\web\session.py", line 90, in send
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\netsvc.py", line 293, in dispatch_rpc
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\service\web_services.py", line 626, in dispatch
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\osv\osv.py", line 188, in execute_kw
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\osv\osv.py", line 131, in wrapper
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\osv\osv.py", line 197, in execute
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\osv\osv.py", line 185, in execute_cr
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\openerp\addons\test_nouveau_devis\nouveau_devis.py", line 367, in create_invoices
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\openerp\addons\test_nouveau_devis\nouveau_devis.py", line 186, in manual_invoice
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\workflow\wkf_service.py", line 119, in trg_validate
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\workflow\instance.py", line 43, in validate
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\workflow\workitem.py", line 60, in process
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\workflow\workitem.py", line 175, in _split_test
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\workflow\workitem.py", line 183, in _join_test
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\workflow\workitem.py", line 40, in create
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\workflow\workitem.py", line 52, in process
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\workflow\workitem.py", line 127, in _execute
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\workflow\wkf_expr.py", line 67, in execute
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\workflow\wkf_expr.py", line 57, in _eval_expr
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\tools\safe_eval.py", line 241, in safe_eval
    File "", line 1, in <module>
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\osv\orm.py", line 374, in function_proxy
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\openerp\addons\test_nouveau_devis\nouveau_devis.py", line 170, in action_invoice_create
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\openerp\addons\test_nouveau_devis\nouveau_devis.py", line 223, in _make_invoice
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\openerp\addons\mail\mail_thread.py", line 242, in create
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\osv\orm.py", line 4478, in create
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\osv\orm.py", line 4627, in _store_set_values
    File "C:\Program Files (x86)\OpenERP 7.0-20130513-231009\Server\server\.\openerp\osv\fields.py", line 1137, in get
    AttributeError: 'unicode' object has no attribute 'get'

How to fix that ? Thanks

test_nouveau_devis\nouveau_devis.py , line 223 ? test_nouveau_devis\nouveau_devis.py, line 170?

Borni DHIFI
on 5/28/13, 12:11 PM

it is a module i have created

N
on 5/28/13, 12:33 PM

no , what is code lines 170,223 ?

Borni DHIFI
on 5/28/13, 12:34 PM
0
le_dilem
On 5/28/13, 7:17 PM

hi I think it is best to fill the field when creating an invoice

in sale.order

 def _make_invoice(self, cr, uid, order, lines, context=None):
        """Add a ref in the invoice after creation
        """
        inv_obj = self.pool.get('account.invoice')
        # create the invoice
        inv_id = super(sale_order, self)._make_invoice(cr, uid, order, lines, context)
        # modify the invoice
        inv_obj.write(cr, uid, [inv_id], {'n_ref': order.n_ref}, context)
        return inv_id
0

Sudhir Arya (SA)

--Sudhir Arya (SA)--
10150
| 6 8 8
Ahmedabad, India
--Sudhir Arya (SA)--

Working as an OpenERP/Odoo developer and a Team Leader 

Top 5 Odoo contributor On Stackoverflow

LinkedIn

Blog

Stackoverflow

Sudhir Arya (SA)
On 5/29/13, 3:54 AM

Try this:

def _get_n_ref(self, cr, uid, ids, field_name, arg, context=None):
    res = {}
    for id in ids:
        origin = self.pool.get('account.invoice').browse(cr, uid, id, context=context).origin # recuperer attribut 'origin' qui correspond au nom de la commande
        order_id = self.pool.get('sale.order').search(cr, uid, [('name', '=', origin)], context=context)[0] # recuperer id de la commande
        res[id] = self.pool.get('sale.order').browse(cr, uid, order_id, context=context)['n_ref'] # retourne n/ref de la commande
        return res

Your Answer

Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!

About This Community

This community is for professionals and enthusiasts of our products and services. Read Guidelines

Question tools

0 follower(s)

Stats

Asked: 5/28/13, 12:03 PM
Seen: 5094 times
Last updated: 3/16/15, 8:10 AM