2017-04-26 79 views
1

如何在form_serial_no_id模型的plot.allocate模型的Many2one字段中将状态字段的默认值formdownload模型记录更改为true?如何更改odoo中另一个型号的默认字段值

我已经写了一个方法来覆盖PlotAllocation模型的odoo创建函数,但它仍然没有将状态字段的值更改为true。相反,它会转到父类(plot.allocate)中create方法的override函数。无论何时我保存记录,控制都转到父方法的创建函数,并忽略继承plot.allocate模型的类PlotAllocation的创建函数。我怎样才能解决这个问题?

from openerp import models, fields, api 


class CompanyName(models.Model): 
    _name = 'companyname' 
    _rec_name = 'company_name' 

    company_name = fields.Char(string="Company Name", required=True) 
    company_short_code = fields.Char(string="Company short code", required=True) 


class FormDownload(models.Model): 
    _name = 'formdownload' 
    _rec_name = 'form_serial_no' 

    name = fields.Many2one('companyname', string="Company Name", ondelete='cascade', 
          required=True) 
    form_serial_no = fields.Char(string="Form Serial No", readonly=True) 
    status = fields.Boolean(string="Status", default=False) 

    @api.model 
    def create(self, vals): 
     serial_no = self.env['ir.sequence'].get('formdownload.form_serial_no') 
     code = self.env['companyname'].browse(vals['name']).company_short_code 

     # capitalize company short code values 
     code = code.upper() 

     # merge code and serial number 
     vals['form_serial_no'] = code + serial_no 
     return super(FormDownload, self).create(vals) 


class PlotAllocation(models.Model): 
    _inherit = 'plot.allocate' 

    form_serial_no_id = fields.Many2one('formdownload', 
             domain=[('status', '=', False)], 
             ondelete='cascade', string="Form Serial No") 

    def create(self, vals): 
     form_id = vals['form_serial_no_id'] 
     form_obj = self.env['formdownload'].browse(vals['status']) 

     if form_id: 
      form_obj.write({'status': True}) 

     return super(PlotAllocation, self).create(vals) 

这里是父类的创建覆盖功能

class plot_allocate(osv.osv): 
    _name = 'plot.allocate' 
    _inherit = ['mail.thread', 'ir.needaction_mixin']  

def create(self, cr, uid, vals, context=None): 
     offer_dt = vals.get('offer_dt') 
     offer_price = vals.get('offer_price') 
     plot_no = vals.get('plot_no') 
     payment_plan = vals.get('payment_plan') 
     # generate and store the offer letter reference number 
     vals['offer_letter_reference_number'] = self.pool.get(
      'ir.sequence').get(cr, uid, 'offer_letter_reference_number') 
     # override creation method to prevent creation of duplicate plots 
     if plot_no: 
      plot_no_duplicate = self.search(
       cr, uid, [('plot_no', '=', plot_no)]) 
      if plot_no_duplicate: 
       raise osv.except_osv(
        _('Duplicate!'), 
        _('Plot No is allocated or is open for allocation already')) 
     # change status of unallocated plots to allocated in unit_master 
     unit_master = self.pool.get('unit.master').browse(cr, uid, plot_no) 
     # change corresponding plot in unit_master to allocated 
     unit_master.write({'status': 'allocated'}) 
     project_and_plot_id = super(
      plot_allocate, self).create(
      cr, uid, vals, context=context) 
     plot = self.browse(cr, uid, project_and_plot_id, context=context) 
     if payment_plan: 
      self.calc_payment_plan(cr, uid, plot, offer_dt, payment_plan) 
     return project_and_plot_id 
+0

您正在比较boolean与整数,它有意义吗? '如果vals ['form_serial_no_id'] ==状态:' –

+0

vals ['name']在这里是什么? –

+0

哪个版本的odoo你在用这个? – Bhuro

回答

1

试试这个:

@api.model 
def create(self, vals): 
    status = self.env['formdownload'].browse(vals['form_serial_no_id'])   
    if self.form_serial_no_id.id == status.status: 
     status.write({'status': True})  
    return super(PlotAllocation, self).create(vals) 
+0

感谢您的回应,但没有任何变化。这仍然是一回事。 – John

+0

我意识到在父类(plot.allocate)中有一个创建方法的重写函数,所以无论何时我保存记录,控制都转到父方法的create函数,并忽略继承类“PlotAllocation”的创建函数plot.allocate模型。我怎样才能解决这个问题? – John

+0

匹配返回超级(class_inherit_name,self).create(vals),因为它将覆盖默认方法。 – Rinaldi

0

我想这代码,它工作得很好:

@api.model 
def create(self, vals): 
     rec_id = super(PlotAllocation, self).create(vals) 
     if rec_id.form_serial_no_id : 
      # raise exceptions.ValidationError('Your code is here should make the status of companyname to true') 
      # print 'Your code is here should make the status of companyname to true' 
      rec_id.form_serial_no_id.status = True 
     return rec_id 
+0

添加到注释行如果你可以看到打印在控制台取消注释打印行,否则取消注释提升行只是为了看看代码是否真的让你的创建方法变冷静,因为我试过这个,它工作得很好。 – Cherif

+0

您是否在尝试代码时收到了消息? – Cherif

+0

不,我没有收到任何消息。 – John

0

试试这个:

@api.model 
def create(self, vals): 
    form_id = vals['form_serial_no_id'].id 
    form_obj = self.env['formdownload'].browse([form_id]) 

    if your condition: 
     form_obj.write({'status':True}) 

    return super(PlotAllocation, self).create(vals) 
+0

感谢您的回应,这仍然是一回事。什么都没有发生 – John

+0

如果你告诉我你到达的地方,它会帮助 –

+0

我刚发现现在在父类(plot.allocate)中有一个创建方法的重载函数,所以任何时候我保存记录,控制转到父方法的创建函数并忽略继承plot.allocate模型的类“PlotAllocation”的创建函数。我怎样才能解决这个问题?我编辑了这个问题,并在父类中添加了创建函数供您查看。 – John

相关问题