简体   繁体   中英

Write a button to copy data from table (Python3、Odoo 14)

I try to write a copy function to copy data from table to same table.

    def formmst_copy_func(self):
        _logger.info('=== formmst_copy_func start ===')
        for record in self:
            formbas_obj = self.env['hre.formmst']
            defaults = {
                'form_no': record.form_no,
                'hre_orgbas_id': record.hre_orgbas_id.id if record.hre_orgbas_id else False,
                'form_name': record.hre_formmst_id.form_name,
                'form_type': record.hre_formmst_id.form_type,
                'calculate_type': record.hre_formmst_id.calculate_type,
                'total_score': record.hre_formmst_id.total_score,
                'hre_formdtl_ids': record.hre_formmst_id.hre_formdtl_ids,
            }
            formbas_obj.create(defaults)
        _logger.info('=== formmst_copy_func end ===')

hre_formmst_id is Many2one field. hre_formdtl_ids is One2many field.

Use a button to call this function.

<record id="form_hre_formbas_copy_wizard" model="ir.ui.view">
    <field name="name">form.hre.formbas.copy.wizard</field>
    <field name="model">hre.formbas.copy.wizard</field>
    <field name="arch" type="xml">
        <form>
            <group col="4">
                <field name="hre_formmst_id"/>
                <newline/>
                <field name="form_no"/>
                <field name="hre_orgbas_id"/>
            </group>
            <footer>
                <button string="Copy" name="formmst_copy_func" type="object" class="oe_highlight"/>
                or
                <button string="Cancel" special="cancel" type="object" class="oe_link"/>
            </footer>
        </form>
    </field>
</record>

The function can copy data successfully.
But the hre_formdtl_ids in the original data disappeared.
How can I fix the function? Please give me some suggestions. Thanks!

Try updating one2many field as [(6, 0, ids)] or [(4, id)]

For filling many2many and one2many:

(0, 0,  { values })    link to a new record that needs to be created with the given values dictionary
(1, ID, { values })    update the linked record with id = ID (write *values* on it)
(2, ID)                remove and delete the linked record with id = ID (calls unlink on ID, that will delete the object completely, and the link to it as well)
(3, ID)                cut the link to the linked record with id = ID (delete the relationship between the two objects but does not delete the target object itself)
(4, ID)                link to existing record with id = ID (adds a relationship)
(5)                    unlink all (like using (3,ID) for all linked records)
(6, 0, [IDs])          replace the list of linked IDs (like using (5) then (4,ID) for each ID in the list of IDs)

So in your case you can try:

def formmst_copy_func(self):
    _logger.info('=== formmst_copy_func start ===')
    for record in self:
        formbas_obj = self.env['hre.formmst']
        defaults = {
            'form_no': record.form_no,
            'hre_orgbas_id': record.hre_orgbas_id.id if record.hre_orgbas_id else False,
            'form_name': record.hre_formmst_id.form_name,
            'form_type': record.hre_formmst_id.form_type,
            'calculate_type': record.hre_formmst_id.calculate_type,
            'total_score': record.hre_formmst_id.total_score,
            'hre_formdtl_ids': [(4, l.id for l in record.hre_formmst_id.hre_formdtl_ids)],
        }
        formbas_obj.create(defaults)
    _logger.info('=== formmst_copy_func end ===')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM