diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/website_slides/wizard | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/website_slides/wizard')
| -rw-r--r-- | addons/website_slides/wizard/__init__.py | 4 | ||||
| -rw-r--r-- | addons/website_slides/wizard/slide_channel_invite.py | 129 | ||||
| -rw-r--r-- | addons/website_slides/wizard/slide_channel_invite_views.xml | 37 |
3 files changed, 170 insertions, 0 deletions
diff --git a/addons/website_slides/wizard/__init__.py b/addons/website_slides/wizard/__init__.py new file mode 100644 index 00000000..40209889 --- /dev/null +++ b/addons/website_slides/wizard/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import slide_channel_invite diff --git a/addons/website_slides/wizard/slide_channel_invite.py b/addons/website_slides/wizard/slide_channel_invite.py new file mode 100644 index 00000000..737651e6 --- /dev/null +++ b/addons/website_slides/wizard/slide_channel_invite.py @@ -0,0 +1,129 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import logging +import re + +from odoo import api, fields, models, _ +from odoo.exceptions import UserError +from odoo.tools import formataddr + +_logger = logging.getLogger(__name__) + +emails_split = re.compile(r"[;,\n\r]+") + + +class SlideChannelInvite(models.TransientModel): + _name = 'slide.channel.invite' + _description = 'Channel Invitation Wizard' + + # composer content + subject = fields.Char('Subject', compute='_compute_subject', readonly=False, store=True) + body = fields.Html('Contents', sanitize_style=True, compute='_compute_body', readonly=False, store=True) + attachment_ids = fields.Many2many('ir.attachment', string='Attachments') + template_id = fields.Many2one( + 'mail.template', 'Use template', + domain="[('model', '=', 'slide.channel.partner')]") + # recipients + partner_ids = fields.Many2many('res.partner', string='Recipients') + # slide channel + channel_id = fields.Many2one('slide.channel', string='Slide channel', required=True) + + @api.depends('template_id') + def _compute_subject(self): + for invite in self: + if invite.template_id: + invite.subject = invite.template_id.subject + elif not invite.subject: + invite.subject = False + + @api.depends('template_id') + def _compute_body(self): + for invite in self: + if invite.template_id: + invite.body = invite.template_id.body_html + elif not invite.body: + invite.body = False + + @api.onchange('partner_ids') + def _onchange_partner_ids(self): + if self.partner_ids: + signup_allowed = self.env['res.users'].sudo()._get_signup_invitation_scope() == 'b2c' + if not signup_allowed: + invalid_partners = self.env['res.partner'].search([ + ('user_ids', '=', False), + ('id', 'in', self.partner_ids.ids) + ]) + if invalid_partners: + raise UserError(_( + 'The following recipients have no user account: %s. You should create user accounts for them or allow external sign up in configuration.', + ', '.join(invalid_partners.mapped('name')) + )) + + @api.model + def create(self, values): + if values.get('template_id') and not (values.get('body') or values.get('subject')): + template = self.env['mail.template'].browse(values['template_id']) + if not values.get('subject'): + values['subject'] = template.subject + if not values.get('body'): + values['body'] = template.body_html + return super(SlideChannelInvite, self).create(values) + + def action_invite(self): + """ Process the wizard content and proceed with sending the related + email(s), rendering any template patterns on the fly if needed """ + self.ensure_one() + + if not self.env.user.email: + raise UserError(_("Unable to post message, please configure the sender's email address.")) + + mail_values = [] + for partner_id in self.partner_ids: + slide_channel_partner = self.channel_id._action_add_members(partner_id) + if slide_channel_partner: + mail_values.append(self._prepare_mail_values(slide_channel_partner)) + + # TODO awa: change me to create multi when mail.mail supports it + for mail_value in mail_values: + self.env['mail.mail'].sudo().create(mail_value) + + return {'type': 'ir.actions.act_window_close'} + + def _prepare_mail_values(self, slide_channel_partner): + """ Create mail specific for recipient """ + subject = self.env['mail.render.mixin']._render_template(self.subject, 'slide.channel.partner', slide_channel_partner.ids, post_process=True)[slide_channel_partner.id] + body = self.env['mail.render.mixin']._render_template(self.body, 'slide.channel.partner', slide_channel_partner.ids, post_process=True)[slide_channel_partner.id] + # post the message + mail_values = { + 'email_from': self.env.user.email_formatted, + 'author_id': self.env.user.partner_id.id, + 'model': None, + 'res_id': None, + 'subject': subject, + 'body_html': body, + 'attachment_ids': [(4, att.id) for att in self.attachment_ids], + 'auto_delete': True, + 'recipient_ids': [(4, slide_channel_partner.partner_id.id)] + } + + # optional support of notif_layout in context + notif_layout = self.env.context.get('notif_layout', self.env.context.get('custom_layout')) + if notif_layout: + try: + template = self.env.ref(notif_layout, raise_if_not_found=True) + except ValueError: + _logger.warning('QWeb template %s not found when sending slide channel mails. Sending without layouting.' % (notif_layout)) + else: + # could be great to use _notify_prepare_template_context someday + template_ctx = { + 'message': self.env['mail.message'].sudo().new(dict(body=mail_values['body_html'], record_name=self.channel_id.name)), + 'model_description': self.env['ir.model']._get('slide.channel').display_name, + 'record': slide_channel_partner, + 'company': self.env.company, + 'signature': self.channel_id.user_id.signature, + } + body = template._render(template_ctx, engine='ir.qweb', minimal_qcontext=True) + mail_values['body_html'] = self.env['mail.render.mixin']._replace_local_links(body) + + return mail_values diff --git a/addons/website_slides/wizard/slide_channel_invite_views.xml b/addons/website_slides/wizard/slide_channel_invite_views.xml new file mode 100644 index 00000000..d5c8e34b --- /dev/null +++ b/addons/website_slides/wizard/slide_channel_invite_views.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <data> + <record id="slide_channel_invite_view_form" model="ir.ui.view"> + <field name="name">slide.channel.invite.view.form</field> + <field name="model">slide.channel.invite</field> + <field name="arch" type="xml"> + <form string="Compose Email"> + <group col="1"> + <group col="2"> + <field name="partner_ids" + widget="many2many_tags_email" + placeholder="Add existing contacts..." + context="{'force_email':True, 'show_email':True, 'no_create_edit': True}"/> + </group> + <group col="2"> + <field name="subject" placeholder="Subject..."/> + </group> + <field name="body" options="{'style-inline': true}"/> + <group> + <group> + <field name="attachment_ids" widget="many2many_binary"/> + </group> + <group> + <field name="template_id" label="Use template" context="{'default_model': 'slide.channel.partner'}"/> + </group> + </group> + </group> + <footer> + <button string="Send" name="action_invite" type="object" class="btn-primary"/> + <button string="Cancel" class="btn-secondary" special="cancel"/> + </footer> + </form> + </field> + </record> + </data> +</odoo> |
