Überschreibung und Übersetzung von E-Mail-Templates über eine XML Datei

Dieser Artikel soll als Erklärung dafür dienen, wie bereits vorhandene E-Mail Templates überschrieben und dafür zusätzlich noch eine Übersetzung in einer gewünschten Sprache eingefügt werden kann. Der folgende Abschnitt zeigt am Beispiel des Standardtemplates einer Rechnung, wie folgende Bereiche/Begriffe der E-Mail Templates übersetzt werden:

  • Betitelung (Name) → Dieses Feld ('name' des Datenmodells mail.template) wurde nachträglich in unserem Modul 'eq_mail_extension' auf translate = True gesetzt, sodass ein Übersetzung möglich ist.
  • Betreff (Subject) 
  • Body


Der Auszug des folgenden Quellcodes stammt aus dem Modul 'eq_account' aus der 'invoice_send_by_email.xml'. Die verschiedenen Einträge werden durch ein data noupdate="1" umschlossen, sodass die Updatesicherheit gegeben ist und nachträgliche Änderungen im Editor durch den Kunden erhalten bleiben.

Als 'record id' wird die ID verwendet (siehe nachfolgenden Codeblock), welche auch das Standardtemplate der Rechnung aus dem Odoo Modul 'account' erhalten hat (account.email_template_edi_invoice).

  • 'account' ist hierbei der Verweiß auf das Modul
  • 'email_template_edi_invoice' ist die record id im Modul 'account'


<?xml version="1.0" encoding="utf-8"?>
<odoo>
	<data noupdate="1">

        <!-- Invoice Sent By Mail /Rechnung EN-->
        <record id="account.email_template_edi_invoice" model="mail.template">
            <field name="name">Invoice -  Send by E-Mail</field>
            <field name="eq_email_template_version">1</field>
            <field name="email_from">${(object.user_id.email and '%s <%s>' % (object.user_id.name, object.user_id.email) or '')|safe}</field>
            <field name="subject">${object.company_id.name} Invoice (Ref ${object.number or 'n/a'})</field>
            <field name="partner_to">${object.partner_id.id}</field>
            <field name="model_id" ref="account.model_account_invoice"/>
            <field name="auto_delete" eval="True"/>
            <field name="report_template" ref="account.account_invoices"/>
            <field name="report_name">Invoice_${(object.number or '').replace('/','_')}_${object.state == 'draft' and 'draft' or ''}</field>
            <field name="lang">${object.partner_id.lang}</field>
            <field name="body_html"><![CDATA[<html>
                <head></head>
                % set record = ctx.get('record')
                % set company = record and record.company_id or user.company_id
                <body >

                <div style="font-family: Open Sans,'Lucida Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 13px; color: rgb(34, 34, 34); background-color: #FFF; ">
                    <h2>Invoice ${object.number}</h2>
                    <br>
                    <p>Dear ${object.partner_id.title.name or ''} ${object.partner_id.name},</p>

                    <p>A new invoice is available for you:</p>

                    <p style="border-left: 1px solid #002852; margin-left: 10px;">
                         <strong>References</strong><br>
                         Invoice number: <strong>${object.number}</strong><br>
                         Invoice total: <strong>${("%.2f" % (object.amount_total)).replace(".", ",")} ${object.currency_id.name}</strong><br>
                         Invoice date:  <strong>${object.date_invoice} </strong><br>
                       % if object.origin:
                         Order reference:  <strong>${object.origin} </strong><br>
                       % endif
                       % if object.user_id:
                         Your contact: ${object.user_id.title.name if object.user_id.title.name else ""} <a href="mailto:${object.user_id.email or ''}?subject=Invoice%20${object.number}"> ${object.user_id.name}</a>
                       % endif
                    </p>


                    <br>
                    <p>If you have any question, do not hesitate to contact us.</p>
                    <p>Thank you for choosing ${object.company_id.name or 'us'}!</p>
                    <br>
                    <br>
                    <!--<div style="width: auto; margin: 0px; padding: 0px;">
                        <h3 style="margin: 0px; padding: 2px 14px; font-size: 16px;">
                            <strong>${object.company_id.name}</strong></h3>
                    </div>
                    <div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #FFF;">
                        <span style="color: #000; margin-bottom: 5px; display: block; ">
                        % if object.company_id.street:
                            ${object.company_id.street}
                        % endif
                        % if object.company_id.eq_house_no:
                           ${object.company_id.eq_house_no}<br>
                        % endif
                        % if object.company_id.street2:
                            ${object.company_id.street2}<br>
                        % endif
                        % if object.company_id.city or object.company_id.zip:
                            ${object.company_id.zip} ${object.company_id.city}<br>
                        % endif
                        % if object.company_id.country_id:
                            ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}<br>
                        % endif
                        </span>
                        % if object.company_id.phone:
                            <div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
                                Phone:  ${object.company_id.phone}
                            </div>
                        % endif
                        % if object.company_id.website:
                            <div>
                                Web : <a href="${object.company_id.website}">${object.company_id.website}</a>
                            </div>
                        %endif
                        <p></p>-->
                    </div>
                </div>
            </body>
                </html>
            ]]></field>
        </record>

Der nachfolgende Quellcodeblock um die einzigartige record id 'eq_invoice_mail_template_de' definiert die Übersetzung des Bodys des E-Mail Templates. Der wichtigste Bestandteil des folgenden Eintrags ist aber die Referenz auf das E-Mail Template, welches übersetzt werden soll. 'account.email_template_edi_invoice' ist der Verweiß auf das oben eingefügte E-Mail Template.

Body:

<record id="eq_invoice_mail_template_de" model="ir.translation">
            <field name="name">mail.template,body_html</field>
            <!--<field name="res_id">21</field>-->
			<field name="res_id" ref="account.email_template_edi_invoice"/>
            <field name="lang">de_DE</field>
        <field name="value"><![CDATA[<html>
                <head></head>
                % set record = ctx.get('record')
                % set company = record and record.company_id or user.company_id
                <body >
                  <div style="font-family:Open Sans, 'Lucida Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 13px; color: rgb(34, 34, 34); background-color: rgb(255, 255, 255); ">
                    <h2>Rechnung ${object.number}</h2>
                    <br/>
                     <p>Sehr geehrte(r) ${object.partner_id.title.name or ''} ${object.partner_id.name},</p>

                    <p>Ihre Rechnung im PDF-Format senden wir Ihnen anbei.  </p>

                    <p>
                  <strong><u>Ihre Rechnungsinformationen</u></strong><br>
                <br>
                          Rechnungsnummer: <strong>${object.number}</strong><br>
                          Rechnungsbetrag: <strong>${("%.2f" % (object.amount_total)).replace(".", ",")} ${object.currency_id.name}</strong><br>
                          Rechnungsdatum: <strong>${object.date_invoice}</strong><br>
                        % if object.origin:
                          Bestellnummer: <strong>${object.origin}</strong><br>
                        % endif
                        % if object.user_id:
                          Ihr Ansprechpartner:  ${object.user_id.title.name if object.user_id.title.name else ""}<a href="mailto:${object.user_id.email or ''}?subject=Invoice%20${object.number}">${object.user_id.name}</a>
                        % endif
                    </p>

                    <br>
                    <br>
                    <br>
                    <p>Bei Fragen stehen wir Ihnen sehr gerne zur Verfügung.</p>
                    <p>Danke, dass Sie sich für ${object.company_id.name or 'uns'} entschieden haben!</p>
                    <br>
                    <br>
                    <!--<div style="width: auto; margin: 0px; padding: 0px;">
                        <h3 style="margin: 0px; padding: 2px 0px; font-size: 16px;">
                            <strong>${object.company_id.name}</strong></h3>
                    </div>
                    <div style="width: 347px; margin: 0px;padding: 5px 0px line-height: 16px; background-color: #FFF;">
                        <span style="color: #000; margin-bottom: 5px; display: block; ">
                        % if object.company_id.street:
                            ${object.company_id.street}
                        % endif
                        % if object.company_id.eq_house_no:
                           ${object.company_id.eq_house_no}<br>
                        % endif
                        % if object.company_id.street2:
                            ${object.company_id.street2}<br>
                        % endif
                        % if object.company_id.city or object.company_id.zip:
                            ${object.company_id.zip} ${object.company_id.city}<br>
                        % endif
                        % if object.company_id.country_id:
                            ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}<br>
                        % endif
                        </span>
                        % if object.company_id.phone:
                            <div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
                                Telefon:  ${object.company_id.phone}
                            </div>
                        % endif
                        % if object.company_id.website:
                            <div>
                                Web : <a href="${object.company_id.website}">${object.company_id.website}</a>
                            </div>
                        %endif
                        <p></p>
                    </div>-->
                </div>



                </body>
                </html>
            ]]></field>
          </record>

Nach dem Einfügen des Bodys des E-Mail Templates werden nachfolgend noch die übersetzte Betitelung und der Betreff in die Übersetzungstabelle 'ir.translation' eingefügt. Hierfür gibt es in unserem Entwickler-Wiki bereits eine Anleitung, wie die Struktur des XML-Eintrags auszusehen hat (Arbeiten mit XML Einträgen von Odoo).

Betitelung (Name):

<record id="eq_mail_invoice_template_name" model="ir.translation" >
            <field name="name">mail.template,name</field>
			<field name="res_id" ref="account.email_template_edi_invoice"/>
            <field name="lang">de_DE</field>
            <field name="type">model</field>
            <field name="state">translated</field>
           <field name="value">Rechnung</field></record>

Betreff (Subject):

<record id="eq_mail_invoice_template_subject" model="ir.translation">
             <field name="name">mail.template,subject</field>
			 <field name="res_id" ref="account.email_template_edi_invoice"/>
             <field name="lang">de_DE</field>
             <field name="state">translated</field>
            <field name="value">${object.company_id.name} Invoice (Ref ${object.number or 'n/a'})</field>
         </record>

Die Python-Datei 'eq_email_template_new.py' enthält das Datenmodell 'eq_install_func' um die Funktion '_eq_delete_default_templates'. Diese Funktion wird bei einem Update des Moduls ausgeführt und überprüft, ob das Standardtemplate wieder eingefügt wurde und wenn ja wird dieses wiederum entfernt.

Funktion '_eq_delete_default_templates':

    def _eq_delete_default_templates(self):
        """
        Wir löschen hier Default E-Mail Vorlage für die Rechnung, die wir durch unsere Version ersetzen
        """
        _logger.info("** Deleting default email templates **")
        email_templates = self.env['mail.template'].sudo().search([('eq_email_template_version','=',False),('name','=','Invoice - Send by Email')])
        for record in email_templates:
            record.unlink()


Aufruf über die xml-Datei 'email_template_function.xml':

<?xml version="1.0" encoding="utf-8"?>
<odoo>
	<data>
        <function model="eq_install_func" name="_eq_delete_default_templates" eval="[('eq_account')]"/>
    </data>
</odoo>


Wichtige Links:

Arbeiten mit XML Einträgen von Odoo