# Copyright 2019 O4SB - Graeme Gellatly # Copyright 2019 Tecnativa - Ernesto Tejeda # Copyright 2020 Onestein - Andrea Stirpe # Copyright 2021 Tecnativa - João Marques # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import re from lxml import etree, html from markupsafe import Markup from odoo import api, models class MailRenderMixin(models.AbstractModel): _inherit = "mail.render.mixin" def remove_href_odoo(self, value, to_keep=None): if len(value) < 20: return value # value can be bytes or markup; ensure we get a proper string and preserve type back_to_bytes = False back_to_markup = False if isinstance(value, bytes): back_to_bytes = True value = value.decode() if isinstance(value, Markup): back_to_markup = True has_dev_odoo_link = re.search( r"") tree = html.fromstring(value) odoo_anchors = tree.xpath('//a[contains(@href,"odoo.com")]') for elem in odoo_anchors: parent = elem.getparent() # Remove "Powered by", "using" etc. previous = elem.getprevious() if previous is not None: previous.tail = etree.CDATA(" ") elif parent.text: parent.text = etree.CDATA(" ") parent.remove(elem) value = etree.tostring( tree, pretty_print=True, method="html", encoding="unicode" ) if to_keep: value = value.replace("", to_keep) if back_to_bytes: value = value.encode() elif back_to_markup: value = Markup(value) return value @api.model def _render_template( self, template_src, model, res_ids, engine="inline_template", add_context=None, options=None, ): """replace anything that is with odoo in templates if is a