Odoo 10-用于替换邮件模板的自定义模块

Odoo 10-用于替换邮件模板的自定义模块,odoo,odoo-10,Odoo,Odoo 10,我想编写一个自定义模块来替换邮件模板 这些模板包含在基本Odoo插件中,例如销售: sale.ordertemplateì由文件/sale/data/mail_template_data.xml 该模板如下所示: 销售订单-通过电子邮件发送 ... 由于自定义模块希望替换此标准基本模板: 自定义模块能否提供具有相同id的记录来替换此邮件模板 在中应该写什么 如果模块销售更新,会发生什么情况 Odoo 10社区版。要替换电子邮件模板,只需在模板名称前添加加载项名称,后跟点(.),并确保从前

我想编写一个自定义模块来替换邮件模板

这些模板包含在基本Odoo插件中,例如销售:

sale.order
templateì由文件
/sale/data/mail_template_data.xml

该模板如下所示:


销售订单-通过电子邮件发送
...
由于自定义模块希望替换此标准基本模板:

  • 自定义模块能否提供具有相同id的记录来替换此邮件模板
  • 中应该写什么
  • 如果模块
    销售
    更新,会发生什么情况

Odoo 10社区版。

要替换电子邮件模板,只需在模板名称前添加加载项名称,后跟点(.),并确保从前端删除默认电子邮件模板。然后更新您的自定义插件。这将替换旧模板

例如:


销售报价单
${(object.user_id.email和“%s%s%”(object.user_id.name,object.user_id.email)或“”)| safe}
${object.company_id.name}${object.state in('draft','sent')和'quote'或'Order'}(Ref${object.name或'n/a'})
${object.partner\u invoice\u id.id}
....
....

销售订单-通过电子邮件发送
...
请将您的代码添加到

    <?xml version="1.0" encoding="utf-8"?>
    <odoo>
        <data>
        <delete model="mail.template" search=" 
[('id','=',ref('sale.email_template_edi_sale'))]"/>
        
         <!--Email template -->
        <record id="sale.email_template_edi_sale" model="mail.template">
            <field name="name">Sales Order - Send by Email</field>
    
        ...
    </odoo>

销售订单-通过电子邮件发送
...

这将删除原始邮件模板,并添加一个具有相同ID的新模板,以便不会干扰odoo功能。

如果不删除原始模板,您将丢失原始模块字段,某些内容将停止工作。而是更改模板的ir.model.data中的
noupdate

要在模块更新时自动执行此操作,请执行以下操作:

  • 修改模型“ir.model.data”并添加
    allow\u update
    方法,在models文件夹中创建ir\u model\u data.py(修改uuu init\uuuuu.py以包含新文件):

  • 在记录更新之前,将函数调用元素添加到
    allow_update
    ,并传递原始模块名称、外部\u id和“mail.template”:

      <?xml version="1.0" encoding="utf-8"?>
      <odoo>
        <data noupdate="0">
          <function model='ir.model.data' name='allow_update'>
            <value>sale</value>
            <value>email_template_edi_sale</value>
            <value>mail.template</value>
          </function>
          <record id="sale.email_template_edi_sale" model="mail.template" >
            <field name="body_html" type="html">
              <div style="margin: 0px; padding: 0px;">
                <p style="margin: 0px; padding: 0px; font-size: 13px;">
                    % set doc_name = 'quotation' if object.state in ('draft', 'sent') else 'order'
                    Dear ${object.partner_id.name}
    
    
    销售
    电子邮件\模板\电子数据交换\销售
    邮件模板
    

    %如果object.state在('draft','sent')中,则设置doc_name='quote',否则为'order' 亲爱的${object.partner\u id.name}


有没有办法删除从前端删除旧模板的手动步骤?激活调试模式,然后转到设置-->技术设置-->电子邮件-->模板,搜索销售订单模板并将其删除。我知道,但我想知道是否可以通过自定义模块来完成,这样我就不必在每次安装中手动删除所有旧邮件模板。因此,不要添加新模板,而只是用自定义模块中安装的新模板替换旧模板。在Odoo代码中查找带有
标记的示例。这不起作用。首先,您不能将代码放在
之前,这将不会添加具有完全相同ID的新模板-而不是
sale。email\u template\u edi\u sale将有
自定义模块。email\u template\u edi\u sale
  from odoo import models, fields, api 
  class IrModelData(models.Model):
      _inherit = 'ir.model.data'

      @api.model
      def allow_update(self, module, name, model):
          self.search([('module',  '=', module), ('name', '=', name), ('model', '=', model)])[0].noupdate = False
  <?xml version="1.0" encoding="utf-8"?>
  <odoo>
    <data noupdate="0">
      <function model='ir.model.data' name='allow_update'>
        <value>sale</value>
        <value>email_template_edi_sale</value>
        <value>mail.template</value>
      </function>
      <record id="sale.email_template_edi_sale" model="mail.template" >
        <field name="body_html" type="html">
          <div style="margin: 0px; padding: 0px;">
            <p style="margin: 0px; padding: 0px; font-size: 13px;">
                % set doc_name = 'quotation' if object.state in ('draft', 'sent') else 'order'
                Dear ${object.partner_id.name}