OCA/server-tools

View on GitHub
base_import_odoo/models/import_odoo_database_field.py

Summary

Maintainability
A
3 hrs
Test Coverage
# -*- coding: utf-8 -*-
# © 2017 Therp BV <http://therp.nl>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openerp import api, fields, models


class ImportOdooDatabaseField(models.Model):
    _name = 'import.odoo.database.field'
    _description = 'A field mapping for records in the remote database'
    _order = 'database_id, sequence'

    sequence = fields.Integer()
    database_id = fields.Many2one(
        'import.odoo.database', string='Database', required=True,
        ondelete='cascade',
    )
    model_id = fields.Many2one(
        'ir.model', string='Model', required=True, ondelete='cascade',
    )
    model = fields.Char(related=['model_id', 'model'])
    field_ids = fields.Many2many(
        'ir.model.fields', string='Field', help='If set, the mapping is only '
        'effective when setting said field', ondelete='cascade',
    )
    model_field_id = fields.Many2one(
        'ir.model.fields', string='Model field', compute=lambda self:
        self._compute_reference_field('model_field_id', 'char'),
        inverse=lambda self:
        self._inverse_reference_field('model_field_id', 'char'),
    )
    id_field_id = fields.Many2one(
        'ir.model.fields', string='ID field', compute=lambda self:
        self._compute_reference_field('id_field_id', 'integer'),
        inverse=lambda self:
        self._inverse_reference_field('id_field_id', 'integer'),
    )
    # TODO: create a reference function field to set this conveniently
    local_id = fields.Integer(
        'Local ID', help='If you leave this empty, a new record will be '
        'created in the local database when this field is set on the remote '
        'database'
    )
    remote_id = fields.Integer(
        'Remote ID', help='If you leave this empty, every (set) field value '
        'will be mapped to the local ID'
    )
    mapping_type = fields.Selection(
        [
            ('fixed', 'Fixed'),
            ('by_field', 'Based on equal fields'),
            ('by_reference', 'By reference'),
            ('unique', 'Unique'),
        ],
        string='Type', required=True, default='fixed',
    )

    @api.multi
    def _compute_reference_field(self, field_name, ttype):
        for this in self:
            this[field_name] = this.field_ids.filtered(
                lambda x: x.ttype == ttype
            )

    @api.multi
    def _inverse_reference_field(self, field_name, ttype):
        self.field_ids = self.field_ids.filtered(
            lambda x: x.ttype != ttype
        ) + self[field_name]