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.

0

How to populate a one2many field from another one2many field?

By
Anirudh Lou
on 8/24/15, 6:53 AM 605 views

I have this situation w/c i don't know what to do about it. The case is this: In class sale_order I have this definition:

...
'sched_lines' : fields.one2many('schedule.schedule','Schedule'),
'factor_lines' : fields.one2many('sale.order.factor','Factor'),

So does, in class account_invoice i also have this definition:

...
'sched_lines' : fields.one2many('schedule.schedule','Schedule'),
'factor_lines' : fields.one2many('sale.order.factor','Factor'),


Back to class sale_order i override the method manual_invoice ,

        ...
for sale_order in self.browse(cr,uid,ids,context=context):
_logger.info("\n\t\t\tFACTOR LINES IN SALE ORDER ... %s"%(str(sale_order.factor_lines)))
_logger.info("\n\t\t\tHISTORY IN SALE ORDER ... %s"%(str(sale_order.sched_lines)))
inv_id = self.pool.get('account.invoice').search(cr,uid,[('id','in',[new_inv_ids]),('origin','=',sale_order.name)])

factor_list = self.pool.get('sale.order.factor').search(cr,uid,[('invoice_id','=',inv_id[0])])
_logger.info("\n\t\t\tfactor_list...%s"%(str(factor_list)))
factor_lines1 = [factors.id for factors in self.pool.get('sale.order.factor').browse(cr,uid,factor_list,context=context)]
_logger.info("\n\t\t\tfactor_lines1...%s"%(str(factor_lines1)))

# cr.execute('select id from sale_order_factor where invoice_id = %s', (tuple(inv_id)))
#---------------- factor_lines1 = map(lambda x: x[0], cr.fetchall())
# factor_lines1 = [(1,0,[factors.id for factors in sale_order.factor_lines])]
#--- _logger.info("\n\t\t\tfactor_lines1...%s"%(str(factor_lines1)))

self.pool.get('account.invoice').write(cr,uid,inv_id,{
'sched_lines': [(6,0,[sched.id for sched in sale_order.sched_lines])],
'factor_lines': [(6,0,[factor.id for factor in sale_order.factor_lines])],#factor_lines1
}

what i can't understand is that this statement "[(6,0,[factor.id for factor in sale_order.factor_lines])]" does not work. When i view the invoice it has not populated. It's source, that is the factor_lines in sale_order, is not empty. While this statement "[(6,0,[sched.id for sched in sale_order.sched_lines])]" works fine. What's inside in sched_lines from sale_order is being carried fine. Does anyone can point out what's the missing, if there is any, in my code? I am really stuck in this.


Any help is very much appreciated.

1

Anil R. Kesariya

--Anil R. Kesariya--
4321
| 6 5 8
Gandhinagar, India
--Anil R. Kesariya--
ERP Consultant

Key Skill
-
Technical & Functional Expert
Anil R. Kesariya
On 8/25/15, 12:29 AM

Hi Anirudh Lou,

Wrong syntax followed,

Here is the solution : (Add Many2one field in both the relational model which is being used as one2many

_name = 'your.model.name'
'sched_lines' : fields.one2many('schedule.schedule','current_model_id', 'Schedule')

'factor_lines' : fields.one2many('sale.order.factor', 'current_model_id','Factor'),

#instead of current_model_id you can write your own model name where fields are defined.

Than add many2one fields:

class sale_order_factor(models.Model):

    _name = 'sale.order.factor'

    current_model_id = fields.Many2one('your.model.name', "Main Current Model")

#same as for other one2many field.

Hope this will help

Rgds,

Anil

Yeah, thanks a lot. I also noticed it when i opened my project in inspecting what are my fields difinitions. Thanks again. :)

Anirudh Lou
on 8/25/15, 12:56 AM
0
Anirudh Lou
On 8/24/15, 8:27 PM

Okay, I got it there is nothing wrong about the code. The mistake is on my declaration of

 'factor_lines' : fields.one2many('sale.order.factor','Factor'), 

Instead of pointing it to it's counter part (many2one) in class sale_order_factor. It point to different class. By the way, i forgot that my declaration above is not correctly set as seen on the body part of this question, perhaps typo error.


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

1 follower(s)

Stats

Asked: 8/24/15, 6:53 AM
Seen: 605 times
Last updated: 8/25/15, 12:54 AM