Odoo Mail Template Dengan Background Image

Ini sebenarnya pengalaman yang sedikit tidak mengenakkan. Saya membuat module untuk kirim email ke customer dengan mail.template. Di email tersebut saya menyertakan gambar backgroud. Kira-kira kodingannya seperti ini

<table width="100%" background="${object.company_id.website}/my_module/static/img/background_mail.png">
 <!-- kode lainnya disini -->
</table>

Saat email terkirim entah kenapa di email tersebut kode background tidak ada. Seperti Odoo menghapus kode tersebut.

Dan ternyata benar. Odoo 12 secara default menghapus beberapa attribute html di model mail.template. Seperti attribute background diatas. Lalu bagaimana agar kita bisa menyertakan gambar background di email ?. Override model mail.message. Kira-kira kodingannya seperti ini.

# -*- coding: utf-8 -*-

from odoo import api, fields, models 

class Message(models.Model):
    _inherit = 'mail.message'

    body = fields.Html('Contents', default='', sanitize_attributes=False)

Pada field Html nilai default parameter sanitize_attributes adalah True. Ini artinya beberapa attribute html akan difilter dan jika tidak termasuk attribute yang aman, maka atribute tersebut akan di hapus. Silakan lihat file odoo-server/odoo/tools/mail.py. Di file tersebut terdapat attribute apa saja yang dianggap aman oleh Odoo.

safe_attrs = clean.defs.safe_attrs | frozenset(
    ['style',
     'data-o-mail-quote',  # quote detection
     'data-oe-model', 'data-oe-id', 'data-oe-field', 'data-oe-type', 'data-oe-expression', 'data-oe-translation-id', 'data-oe-nodeid',
     'data-publish', 'data-id', 'data-res_id', 'data-member_id', 'data-view-id'
     ])

Seperti kita lihat attribute background tidak termasuk attribute yang dianggap aman oleh Odoo. Sehingga attribute tersebut dihapus. Oleh karena itu kita meng-override model mail.message seperti diatas agar pengecekan attribute diabaikan oleh Odoo.

Berikut ini adalah parameter yang bisa anda gunakan di field Html. Lebih detailnya silakan lihat file odoo-server/odoo/fields.py

class Html(_String):
    type = 'html'
    column_type = ('text', 'text')
    _slots = {
        'sanitize': True,               # whether value must be sanitized
        'sanitize_tags': True,          # whether to sanitize tags (only a white list of attributes is accepted)
        'sanitize_attributes': True,    # whether to sanitize attributes (only a white list of attributes is accepted)
        'sanitize_style': False,        # whether to sanitize style attributes
        'strip_style': False,           # whether to strip style attributes (removed and therefore not sanitized)
        'strip_classes': False,         # whether to strip classes attributes
    }
Tulisan Serupa

Leave a Reply