Уведомлять членов группы обслуживания о новом запросе, унаследовав модель MaintenanceRequest

Я хочу уведомить всех членов группы обслуживания, когда внутри этой конкретной команды создается новый запрос.

На данный момент у меня эта функция обрабатывается автоматическим действием, например следующим:

введите здесь описание изображения

Код Python:

body_html = """
    ...
""" + record.name + """
    ...
"""

num_of_members = len(record.maintenance_team_id.member_ids)

if num_of_members:
  members_emails = []

  for i in range(num_of_members):
    members_emails.append(record.maintenance_team_id.member_ids[i].email)

  email_to = ",".join(members_emails)

  mail_pool = env['mail.mail']
  values={}
  values.update({'subject': 'New maintenance request - ' + record.company_id.name})
  values.update({'email_to': email_to})
  values.update({'body_html': body_html})
  msg_id = mail_pool.create(values)

  if msg_id:
    mail_pool.send([msg_id])

Но теперь я хотел бы преобразовать это решение в специальный модуль. Как правильно это сделать?

Должен ли я унаследовать maintenance.request, переопределить метод создания и каким-то образом (как именно?) Отправить свое электронное письмо с жестко заданным телом?

class MaintenanceRequest(models.Model):
    _inherit = 'maintenance.request'

    @api.model
    def create(self, vals):
        req = super(MaintenanceRequest, self).create(vals)

        body_html = """
            ...
        """ + req.name + """
            ...
        """
        # ...
        if msg_id:
            mail_pool.send([msg_id])

        return req

Или есть способ подключиться к готовой функции для отправки уведомления и просто сказать, чтобы она запускалась также для членов команды? Я не хочу добавлять их всех в качестве подписчиков (потому что они получат спам с ненужными обновлениями о запросе) - только для того, чтобы уведомить их о новом запросе, а затем они могут следовать за ним, если им нужно.


person AnJ    schedule 16.08.2019    source источник


Ответы (1)


Я бы создал mail.template в настраиваемом модуле и динамически установил бы в нем список адресов электронной почты. В Odoo уже есть несколько простых примеров почтовых шаблонов, на которые стоит обратить внимание.

В коде вам просто нужно отправить письмо, используя этот шаблон.

<record id="my_mail_template" model="mail.template">
    <field name="name">My Mail Template</field>
    <field name="partner_to">${",".join(map(str, object.maintenance_team_id.member_ids.mapped('partner_id').ids))}</field>
    <!-- add all other required fields -->
</record>
@api.model
def create(self, values):
    record = super().create(values)
    template_id = self.env.ref('my_module.my_mail_template').id
    if template_id:
        record.message_post_with_template(template_id)
    return record
person CZoellner    schedule 16.08.2019
comment
Спасибо за ответ! Но у меня проблемы с тем, чтобы заставить этот код работать. Электронная почта с ним не отправляется. Почему вы оставили super () пустым? Вот мой models.py: pastebin.com/G5AYAPXu. Вот mail_template.xml: pastebin.com/wCXy6zNq. А вот и манифест: pastebin.com/6xC1XyTH - person AnJ; 16.08.2019
comment
Пустой super() возможен, начиная с Python 3. Вызовите свой класс MaintenanceRequest и полностью удалите _name. Остальное мне кажется нормальным. - person CZoellner; 16.08.2019
comment
Я так и сделал, но, к сожалению, электронное письмо до сих пор не создается. Это мой models.py сейчас: pastebin.com/a3T8VgDW. Новый шаблон электронной почты отображается в пользовательском интерфейсе разработчика. - person AnJ; 19.08.2019
comment
Вы проверяли настройки / технические / электронная почта / электронные письма? Может что-то не так с сгенерированной почтой? - person CZoellner; 19.08.2019
comment
Да, электронной почты там нет. - person AnJ; 19.08.2019
comment
После повторного перезапуска службы Odoo я получаю сообщение об ошибке при попытке создать новый запрос: pastebin.com/1V3mSmGJ - person AnJ; 19.08.2019
comment
Посмотрите журнал, чтобы получить полную информацию об ошибке. Но по крайней мере Odoo попытался отобразить его, так что вы на правильном пути. - person CZoellner; 19.08.2019
comment
Ты прав. Внутри журналов /var/log/odoo/odoo-server.log я увидел это: jinja2.exceptions.UndefinedError: 'odoo.api.maintenance.request object' has no attribute 'partner_id'. Оказалось, что проблема связана с этой строкой кода внутри почтового шаблона: <field name="lang">${object.partner_id.lang}</field>. Я удалил его, и теперь он работает нормально (мне также пришлось удалить ранее созданный шаблон, а затем снова загрузить модуль). - person AnJ; 19.08.2019