如何在odoo中更改另一个模型的默认字段值

时间:2017-04-26 19:13:53

标签: python openerp

如果在formdownload模型的form_serial_no_id Many2one字段中选择值,如何将plot.allocate模型记录的状态字段默认值更改为true?

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

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分: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)