2017-10-20 6 views
1

Ich habe diese Methode:Pass Objektfelder und one2many Felder auf gleiche Methode - Odoo v8

@api.multi 
def create_print(self,vals): 
    rec_production_order = self.env['bsi.production.order'].search([], order='id desc', limit=1) 
    self.env['bsi.print.order'].create({ 
     'origin': rec_production_order.name, 
     'state': 'draft', 
    }) 
    if order_lines in rec_production_order: 
     vals.update({'order_lines':[(0,0, 
      { 
      'isbn':'isbn', 
      'qty':'consumed_qty', 
      })]}) 
     return super(bsi_print_order,self).create(vals) 

Diese Methode ist auf 'bsi.production.order' Objekt, das sind die Objekte Ich verwende:

class bsi_production_order(models.Model): 
_name = 'bsi.production.order' 
_inherit = ['product.product'] 

@api.model 
def create(self, vals): 
    if vals.get('name', 'New') == 'New': 
     if vals.get('production_type') == 'budgeted': 
      vals['name'] = self.env['ir.sequence'].next_by_code('bsi.production.budgeted') or '/' 
     elif vals.get('production_type') == 'nonbudgeted': 
      vals['name'] = self.env['ir.sequence'].next_by_code('bsi.production.non_budgeted') or '/' 
     elif vals.get('production_type') == 'direct': 
      vals['name'] = self.env['ir.sequence'].next_by_code('bsi.production.direct') or '/' 
    return super(bsi_production_order, self).create(vals) 

name = fields.Char('Reference', required=True, index=True, copy=False, readonly='True', default='New') 
date = fields.Date(string="Production Date") 
notes = fields.Text(string="Notes") 
order_lines = fields.One2many('bsi.production.order.lines', 'production_order', states={'finished': [('readonly', True)], 'cancel': [('readonly', True)]}, string="Order lines", copy=True) 
print_orders = fields.One2many('bsi.print.order', 'production_orders', string="Print Orders") 

class bsi_print_order(models.Model): 
_name = 'bsi.print.order' 
_inherit = ['mail.thread','mrp.worksheet.contract'] 

name = fields.Char('Reference', required=True, index=True, copy=False, readonly='True', default='New') 
date = fields.Date(string="Print Date") 
production_orders = fields.Many2one('bsi.production.order', ondelete='cascade', string="Production Order") 
origin = fields.Char(string="Origin") 
due_date = fields.Date(string="Due Date") 
state = fields.Selection([ 
    ('draft','Draft'), 
    ('awaitingraw','Awaiting raw materials'), 
    ('wip','Work in Progress'), 
    ('delivered','Delivered'), 
    ('cancel','Cancel'), 
], string="State") 
notes = fields.Text(string="Notes") 

class bsi_print_order_lines(models.Model): 
_name = 'bsi.print.order.lines' 

print_order = fields.Many2one('bsi.print.order', string="Print Order") 
production_orders = fields.Many2one('bsi.production.order', ondelete='cascade', string="Production Order") 
isbn = fields.Many2one('product.product', string="ISBN", domain="[('is_isbn', '=', True)]") 
qty = fields.Integer(string="Quantity") 
consumed_qty = fields.Integer(string="Quantity consumed") 
remaining_qty = fields.Float(string="Remaining quantity", compute="_remaining_func") 
state = fields.Selection([ 
     ('draft','Draft'), 
     ('inprogress','In progress'), 
     ('readytomove','Ready to move'), 
     ('intransit','In transitt'), 
     ('done','Done'), 
    ], string="State") 
is_book_block = fields.Boolean(string="Is Book Block Done") 
is_binding = fields.Boolean(string="Is Binding Done") 
is_edging = fields.Boolean(string="Is Edging Done") 

@api.onchange('qty', 'consumed_qty') 
def _remaining_func(self): 
    if self.consumed_qty or self.qty: 
     self.remaining_qty = self.consumed_qty - self.qty 

Ich möchte Datensätze aus dem aktuellen Formular in bsi.production.order, bsi.print.order und bsi.print.order.lines weiterleiten, jedes Mal, wenn ich auf die oben genannte Methode klicke, wirft es mich:

Traceback (most recent call last): 
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\http.py", line 546, in _handle_exception 
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\http.py", line 583, in dispatch 
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\http.py", line 319, in _call_function 
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\service\model.py", line 118, in wrapper 
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\http.py", line 316, in checked_call 
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\http.py", line 812, in __call__ 
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\http.py", line 412, in response_wrap 
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\openerp\addons\web\controllers\main.py", line 948, in call_button 
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\openerp\addons\web\controllers\main.py", line 936, in _call_kw 
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\api.py", line 268, in wrapper 
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\.\openerp\api.py", line 399, in old_api 
File "C:\Program Files (x86)\Odoo 8.0-20170914\server\openerp\addons\bsi\models\models.py", line 381, in create_print 
NameError: global name 'order_lines' is not defined 

Irgendwelche Ideen?

Antwort

1

zuerst, wenn Sie diese Methode aus dem keine Notwendigkeit Taste rufen jeden Datensatz zu holen, weil selbst (RecordSet) nur diesen Datensatz enthalten wird, aber es ist besser Schleife eine Möglichkeit, wenn Sie diese Methode aufrufen, sich mit der odoo-API wollen .

def @api.multi 
def create_print(self,vals): 
    # first define the empty model to call create from 
    copy_record = self.env['other.model'] # now you call the method directly 
    for record in self: 
     # like this is safer 
     # here create a list of cammands for you new o2m_field 

     o2m_field = [] 
     for rec in record.o2m_field: 
      # here loop through all o2m record to create the list of commands 
      o2m_field.append(
      (0,0, 
      { 
       'some_field': rec.some_field, 
       'some_field2': rec.some_field2, 
       'some_m2o_field': rec.some_m2o_field.id,# m2o pass interger value 
       # hope you don't have o2m_field here too. or you need to use imagination to create 
       # a good method that creates this list of commands. 
       } 
      ) 


     # now create the record 
     copy_record.create(
     { 
      'simple_field' : record.simple_field, # for simple field type char,date,... 
      'm2o_field': record.m2o_field.id, # pass the id always 
      'o2m_field': o2m_field, # here we pass the list of commands that we created earlier 
     }) 

Ich glaube, du hast die Idee kopiert ein Datensatz eine sehr komplizierte Operation ist speziell, wenn es zu m2m und O2M Feld in der Kopie.

+0

Ich muss die one2many 'Order_lines' Feld speichern, aber ich muss angeben, welche Felder gespeichert werden sollen, ich denke, ich kann nicht einfach speichern, indem ich selbst.order_lines, ich habe 'Orderlines' zu ändern "self.order_lines" und es heißt "Äpfel mit Orangen mischen" – NeoVe

+0

Offensichtlich würde dies auf einem anderen Modell gespeichert werden "bsi.print.order" – NeoVe

+0

Ist es möglich, order_lines ohne Bedingung zu übergeben? – NeoVe