how to change the default field value from another model in odoo

孤人 提交于 2019-12-08 06:45:00

问题


How can I change the status field default value of formdownload model record to true when a value is picked in form_serial_no_id Many2one field of plot.allocate model?

I have written a method to override odoo create function of the PlotAllocation model but it's still not changing the value of status field to true. Instead, it goes to the override function of create method in the parent class(plot.allocate). Anytime I save record, control goes to the create function of the parent method and ignore the create function of class PlotAllocation that inherit the plot.allocate model. How can I fix this?

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)

Here is the create override function of the parent class

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

回答1:


try this :

@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)



回答2:


Try this:

@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)



回答3:


i tried this code and it work just fine :

@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


来源:https://stackoverflow.com/questions/43642701/how-to-change-the-default-field-value-from-another-model-in-odoo

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!