shopinvader/odoo-shopinvader

View on GitHub
shopinvader/wizards/shopinvader_partner_binding_line.py

Summary

Maintainability
A
1 hr
Test Coverage
# -*- coding: utf-8 -*-
# Copyright 2019 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import _, api, exceptions, fields, models


class ShopinvaderPartnerBindingLine(models.TransientModel):
    """
    Wizard lines used to bind manually some partners on shopinvader backends
    """

    _name = "shopinvader.partner.binding.line"
    _description = "Shopinvader partner binding line"

    shopinvader_partner_binding_id = fields.Many2one(
        comodel_name="shopinvader.partner.binding",
        string="Wizard",
        required=True,
        ondelete="cascade",
    )
    partner_id = fields.Many2one(
        comodel_name="res.partner",
        string="Partner",
        required=True,
        ondelete="cascade",
        readonly=True,
    )
    email = fields.Char(
        related="partner_id.email", required=True, readonly=True
    )
    bind = fields.Boolean(
        help="Tick to bind the partner to the backend. Untick to unbind it."
    )

    @api.multi
    def action_apply(self):
        """
        Bind selected partners
        :return: dict
        """
        shopinvader_partner_obj = self.env["shopinvader.partner"]
        if self.filtered(lambda r: not r.bind):
            message = _(
                "The unbind is not implemented.\n"
                "If you want to continue, please delete lines where "
                "the bind field is not ticked."
            )
            raise exceptions.UserError(message)
        for record in self.filtered(lambda r: r.bind):
            backend = (
                record.shopinvader_partner_binding_id.shopinvader_backend_id
            )
            # Ensure the binding doesn't exist yet
            partner_binding = record.partner_id.shopinvader_bind_ids.filtered(
                lambda x, b=backend: x.backend_id == b
            )
            if not partner_binding:
                bind_values = {
                    "backend_id": backend.id,
                    "record_id": record.partner_id.id,
                    "active": record.partner_id.active,
                }
                # Locomotive doesn't work with uppercase.
                # And we have to do the write before the binding
                email_lower = (record.partner_id.email or "").lower()
                # Do the update only if necessary
                if record.partner_id.email != email_lower:
                    bind_values.update({"email": email_lower})

                shopinvader_partner_obj.create(bind_values)
        return {}