diff --git a/addons/account/data/account_data.xml b/addons/account/data/account_data.xml index 949d03324f3..9d2e65a3a4c 100644 --- a/addons/account/data/account_data.xml +++ b/addons/account/data/account_data.xml @@ -30,7 +30,6 @@ - 15 Days balance @@ -48,7 +47,6 @@ - 30 Net Days balance diff --git a/addons/account/demo/account_demo.xml b/addons/account/demo/account_demo.xml index 6918ad44702..8a450c0b6aa 100644 --- a/addons/account/demo/account_demo.xml +++ b/addons/account/demo/account_demo.xml @@ -135,7 +135,6 @@ 30 Days End of Month - 30 Days End of Month balance @@ -147,16 +146,13 @@ 30% Advance End 30 Days - 30% Advance procent - - Remaining Balance balance diff --git a/addons/account/edi/invoice_action_data.xml b/addons/account/edi/invoice_action_data.xml index 18ac71f55ce..b3fe8362b8b 100644 --- a/addons/account/edi/invoice_action_data.xml +++ b/addons/account/edi/invoice_action_data.xml @@ -24,7 +24,7 @@ Invoice - Send by Email ${object.user_id.email or object.company_id.email or 'noreply@localhost'} ${object.company_id.name} Invoice (Ref ${object.number or 'n/a'}) - ${object.partner_id.id} + ${object.partner_id.id} diff --git a/addons/account_analytic_analysis/account_analytic_analysis_view.xml b/addons/account_analytic_analysis/account_analytic_analysis_view.xml index 3c477b5556f..6f670b2c6b9 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis_view.xml +++ b/addons/account_analytic_analysis/account_analytic_analysis_view.xml @@ -276,7 +276,7 @@ form tree,form [('invoice_id','=',False)] - {'search_default_to_invoice': 1, 'search_default_sales': 1} + {'search_default_to_invoice': 1}

diff --git a/addons/account_payment/__openerp__.py b/addons/account_payment/__openerp__.py index 66d0201b2fe..4c3c8f045e3 100644 --- a/addons/account_payment/__openerp__.py +++ b/addons/account_payment/__openerp__.py @@ -53,7 +53,6 @@ have a new option to import payment orders as bank statement lines. 'account_payment_view.xml', 'account_payment_workflow.xml', 'account_payment_sequence.xml', - 'account_invoice_view.xml', 'account_payment_report.xml', ], 'demo': ['account_payment_demo.xml'], diff --git a/addons/account_payment/account_invoice.py b/addons/account_payment/account_invoice.py index 7c8560fc9e8..bcce77a54ce 100644 --- a/addons/account_payment/account_invoice.py +++ b/addons/account_payment/account_invoice.py @@ -19,9 +19,8 @@ # ############################################################################## -from datetime import datetime from openerp.tools.translate import _ -from openerp.osv import fields, osv +from openerp.osv import osv class Invoice(osv.osv): _inherit = 'account.invoice' @@ -43,28 +42,6 @@ class Invoice(osv.osv): raise osv.except_osv(_('Error!'), _("You cannot cancel an invoice which has already been imported in a payment order. Remove it from the following payment order : %s."%(payment_order_name))) return super(Invoice, self).action_cancel(cr, uid, ids, context=context) - def _amount_to_pay(self, cursor, user, ids, name, args, context=None): - '''Return the amount still to pay regarding all the payment orders''' - if not ids: - return {} - res = {} - for invoice in self.browse(cursor, user, ids, context=context): - res[invoice.id] = 0.0 - if invoice.move_id: - for line in invoice.move_id.line_id: - if not line.date_maturity or \ - datetime.strptime(line.date_maturity, '%Y-%m-%d') \ - < datetime.today(): - res[invoice.id] += line.amount_to_pay - return res - - _columns = { - 'amount_to_pay': fields.function(_amount_to_pay, - type='float', string='Amount to be paid', - help='The amount which should be paid at the current date\n' \ - 'minus the amount which is already in payment order'), - } - Invoice() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_payment/account_invoice_view.xml b/addons/account_payment/account_invoice_view.xml deleted file mode 100644 index ebb6bcbf965..00000000000 --- a/addons/account_payment/account_invoice_view.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - account.invoice.supplier.form.inherit - account.invoice - - - - - - - - - diff --git a/addons/account_payment/account_move_line.py b/addons/account_payment/account_move_line.py index 35c30c686e8..c601d9e8da3 100644 --- a/addons/account_payment/account_move_line.py +++ b/addons/account_payment/account_move_line.py @@ -19,65 +19,12 @@ # ############################################################################## -from operator import itemgetter -from openerp.osv import fields, osv +from openerp.osv import osv from openerp.tools.translate import _ class account_move_line(osv.osv): _inherit = "account.move.line" - def amount_to_pay(self, cr, uid, ids, name, arg=None, context=None): - """ Return the amount still to pay regarding all the payemnt orders - (excepting cancelled orders)""" - if not ids: - return {} - cr.execute("""SELECT ml.id, - CASE WHEN ml.amount_currency < 0 - THEN - ml.amount_currency - ELSE ml.credit - END - - (SELECT coalesce(sum(amount_currency),0) - FROM payment_line pl - INNER JOIN payment_order po - ON (pl.order_id = po.id) - WHERE move_line_id = ml.id - AND po.state != 'cancel') AS amount - FROM account_move_line ml - WHERE id IN %s""", (tuple(ids),)) - r = dict(cr.fetchall()) - return r - - def _to_pay_search(self, cr, uid, obj, name, args, context=None): - if not args: - return [] - line_obj = self.pool.get('account.move.line') - query = line_obj._query_get(cr, uid, context={}) - where = ' and '.join(map(lambda x: '''(SELECT - CASE WHEN l.amount_currency < 0 - THEN - l.amount_currency - ELSE l.credit - END - coalesce(sum(pl.amount_currency), 0) - FROM payment_line pl - INNER JOIN payment_order po ON (pl.order_id = po.id) - WHERE move_line_id = l.id - AND po.state != 'cancel' - ) %(operator)s %%s ''' % {'operator': x[1]}, args)) - sql_args = tuple(map(itemgetter(2), args)) - - cr.execute(('''SELECT id - FROM account_move_line l - WHERE account_id IN (select id - FROM account_account - WHERE type=%s AND active) - AND reconcile_id IS null - AND credit > 0 - AND ''' + where + ' and ' + query), ('payable',)+sql_args ) - - res = cr.fetchall() - if not res: - return [('id', '=', '0')] - return [('id', 'in', map(lambda x:x[0], res))] - def line2bank(self, cr, uid, ids, payment_type=None, context=None): """ Try to return for each Ledger Posting line a corresponding bank @@ -110,11 +57,6 @@ class account_move_line(osv.osv): raise osv.except_osv(_('Error!'), _('There is no partner defined on the entry line.')) return line2bank - _columns = { - 'amount_to_pay': fields.function(amount_to_pay, - type='float', string='Amount to pay', fnct_search=_to_pay_search), - } - account_move_line() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_payment/account_payment.py b/addons/account_payment/account_payment.py index bf0377111a8..2b0fe1271d2 100644 --- a/addons/account_payment/account_payment.py +++ b/addons/account_payment/account_payment.py @@ -352,7 +352,7 @@ class payment_line(osv.osv): if move_line_id: line = move_line_obj.browse(cr, uid, move_line_id, context=context) - data['amount_currency'] = line.amount_to_pay + data['amount_currency'] = line.amount_residual_currency res = self.onchange_amount(cr, uid, ids, data['amount_currency'], currency, company_currency, context) diff --git a/addons/account_payment/account_payment_view.xml b/addons/account_payment/account_payment_view.xml index c2f27a576a2..aa52d1d443e 100644 --- a/addons/account_payment/account_payment_view.xml +++ b/addons/account_payment/account_payment_view.xml @@ -2,29 +2,6 @@ - - - account.move.line.form.inherit - account.move.line - - - - - - - - - - @@ -116,7 +93,7 @@ - +

+ - -
  • + +
  • Google Apps Domain
  • -
  • +
  • -
  • +
  • Username
  • -
  • +
  • -
  • +
  • OpenID URL
  • -
  • +
  • - + + this.each(function() { + var $i = $(this); + $i.add($i.prev()).attr('data-provider', 'password'); + }); + + this.each(function() { var $i = $(this), - dp = $i.find('input').attr('name'); - $i.add($i.prev()).attr('class', 'auth_choice').attr('data-provider', dp); + dp = $i.find('input').attr('name'), + $p = $i.prev(); + // $p may not be the correct label when auth_signup is installed. + while(($p.attr('data-modes') || 'default') !== 'default') { $p = $p.prev(); } + $i.add($p).attr('data-provider', dp); }); diff --git a/addons/auth_signup/res_users.py b/addons/auth_signup/res_users.py index 4e86de5b474..b5383e41775 100644 --- a/addons/auth_signup/res_users.py +++ b/addons/auth_signup/res_users.py @@ -161,14 +161,12 @@ class res_users(osv.Model): def _get_state(self, cr, uid, ids, name, arg, context=None): res = {} for user in self.browse(cr, uid, ids, context): - res[user.id] = ('reset' if user.signup_valid else - 'active' if user.login_date else - 'new') + res[user.id] = ('active' if user.login_date else 'new') return res _columns = { 'state': fields.function(_get_state, string='Status', type='selection', - selection=[('new', 'New'), ('active', 'Active'), ('reset', 'Resetting Password')]), + selection=[('new', 'Never Connected'), ('active', 'Activated')]), } def signup(self, cr, uid, values, token=None, context=None): @@ -270,16 +268,7 @@ class res_users(osv.Model): if mail_state and mail_state['state'] == 'exception': raise self.pool.get('res.config.settings').get_config_warning(cr, _("Cannot send email: no outgoing email server configured.\nYou can configure it under %(menu:base_setup.menu_general_configuration)s."), context) else: - return { - 'type': 'ir.actions.client', - 'name': '_(Server Notification)', - 'tag': 'action_notify', - 'params': { - 'title': 'Mail Sent to: %s' % user.name, - 'text': 'You can reset the password by yourself using this link' % user.partner_id.signup_url, - 'sticky': True, - } - } + return True def create(self, cr, uid, values, context=None): # overridden to automatically invite user to sign up diff --git a/addons/auth_signup/res_users_view.xml b/addons/auth_signup/res_users_view.xml index 11a5315cbb7..28f66eb101d 100644 --- a/addons/auth_signup/res_users_view.xml +++ b/addons/auth_signup/res_users_view.xml @@ -17,13 +17,25 @@
    +
    +

    + A password reset has been requested for this user. An email containing the following link has been sent: +

    +

    + An invitation email containing the following subscription link has been sent: +

    +

    + +
    - -
    +
    + type="object" name="action_reset_password" + attrs="{'invisible': [('state', '!=', 'active')]}"/> +
    diff --git a/addons/mail/tests/test_invite.py b/addons/mail/tests/test_invite.py index fe4b8ed10df..faa9fd55793 100644 --- a/addons/mail/tests/test_invite.py +++ b/addons/mail/tests/test_invite.py @@ -31,18 +31,18 @@ class test_invite(TestMailBase): # Do: create a mail_wizard_invite, validate it self._init_mock_build_email() context = {'default_res_model': 'mail.group', 'default_res_id': self.group_pigs_id} - mail_invite_id = mail_invite.create(cr, self.user_raoul_id, {'partner_ids': [(4, self.partner_bert_id)]}, context) + mail_invite_id = mail_invite.create(cr, self.user_raoul_id, {'partner_ids': [(4, self.partner_bert_id)], 'send_mail': True}, context) mail_invite.add_followers(cr, self.user_raoul_id, [mail_invite_id], {'default_model': 'mail.group', 'default_res_id': 0}) # Test: Pigs followers should contain Admin, Bert self.group_pigs.refresh() follower_ids = [follower.id for follower in self.group_pigs.message_follower_ids] - self.assertEqual(set(follower_ids), set([self.partner_admin_id, self.partner_bert_id]), 'Pigs followers after invite is incorrect') + self.assertEqual(set(follower_ids), set([self.partner_admin_id, self.partner_bert_id]), 'invite: Pigs followers after invite is incorrect') # Test: (pretend to) send email and check subject, body self.assertEqual(len(self._build_email_kwargs_list), 1, 'sent email number incorrect, should be only for Bert') for sent_email in self._build_email_kwargs_list: - self.assertEqual(sent_email.get('subject'), 'Invitation to follow Pigs', - 'subject of invitation email is incorrect') - self.assertTrue('You have been invited to follow Pigs' in sent_email.get('body'), - 'body of invitation email is incorrect') + self.assertEqual(sent_email.get('subject'), 'Invitation to follow Discussion group: Pigs', + 'invite: subject of invitation email is incorrect') + self.assertIn('Raoul Grosbedon invited you to follow Discussion group document: Pigs', sent_email.get('body'), + 'invite: body of invitation email is incorrect') diff --git a/addons/mail/tests/test_mail_features.py b/addons/mail/tests/test_mail_features.py index b327bd33d98..da7f2ae351c 100644 --- a/addons/mail/tests/test_mail_features.py +++ b/addons/mail/tests/test_mail_features.py @@ -20,7 +20,7 @@ ############################################################################## from openerp.addons.mail.tests.test_mail_base import TestMailBase -from openerp.tools.mail import html_sanitize, append_content_to_html +from openerp.tools.mail import html_sanitize MAIL_TEMPLATE = """Return-Path: To: {to} @@ -84,23 +84,6 @@ Sylvie class test_mail(TestMailBase): - def _mock_send_get_mail_body(self, *args, **kwargs): - # def _send_get_mail_body(self, cr, uid, mail, partner=None, context=None) - body = append_content_to_html(args[2].body_html, kwargs.get('partner').name if kwargs.get('partner') else 'No specific partner', plaintext=False) - return body - - def setUp(self): - super(test_mail, self).setUp() - - # Mock send_get_mail_body to test its functionality without other addons override - self._send_get_mail_body = self.registry('mail.mail').send_get_mail_body - self.registry('mail.mail').send_get_mail_body = self._mock_send_get_mail_body - - def tearDown(self): - # Remove mocks - self.registry('mail.mail').send_get_mail_body = self._send_get_mail_body - super(test_mail, self).tearDown() - def test_00_message_process(self): """ Testing incoming emails processing. """ cr, uid, user_raoul = self.cr, self.uid, self.user_raoul @@ -329,7 +312,7 @@ class test_mail(TestMailBase): self.res_users.write(cr, uid, [uid], {'signature': 'Admin', 'email': 'a@a'}) # 1 - Bert Tartopoils, with email, should receive emails for comments and emails p_b_id = self.res_partner.create(cr, uid, {'name': 'Bert Tartopoils', 'email': 'b@b'}) - # 2 - Carine Poilvache, with email, should never receive emails + # 2 - Carine Poilvache, with email, should receive emails for emails p_c_id = self.res_partner.create(cr, uid, {'name': 'Carine Poilvache', 'email': 'c@c', 'notification_email_send': 'email'}) # 3 - Dédé Grosbedon, without email, to test email verification; should receive emails for every message p_d_id = self.res_partner.create(cr, uid, {'name': 'Dédé Grosbedon', 'notification_email_send': 'all'}) @@ -341,11 +324,15 @@ class test_mail(TestMailBase): _subject = 'Pigs' _mail_subject = 'Re: %s' % (group_pigs.name) _body1 = '

    Pigs rules

    ' - _mail_body1 = '

    Pigs rules

    \n

    Raoul

    \n' - _mail_bodyalt1 = 'Pigs rules\nRaoul\n' + _mail_body1 = '

    Pigs rules

    ' + _mail_signature1 = '

    Raoul

    ' + _mail_bodyalt1 = 'Pigs rules\n' + _mail_signaturealt1 = '\nRaoul\n' _body2 = 'Pigs rules' - _mail_body2 = '

    Pigs rules

    \n

    Raoul

    ' - _mail_bodyalt2 = 'Pigs rules\nRaoul' + _mail_body2 = '

    Pigs rules

    ' + _mail_signature2 = '

    Raoul

    ' + _mail_bodyalt2 = 'Pigs rules\n' + _mail_signaturealt2 = '\nRaoul\n' _attachments = [('First', 'My first attachment'), ('Second', 'My second attachment')] # ---------------------------------------- @@ -366,12 +353,14 @@ class test_mail(TestMailBase): self.assertEqual(len(sent_emails), 2, 'sent_email number of sent emails incorrect') for sent_email in sent_emails: self.assertEqual(sent_email['subject'], _subject, 'sent_email subject incorrect') - self.assertTrue(sent_email['body'] in [_mail_body1 + '\nBert Tartopoils\n', _mail_body1 + '\nAdministrator\n'], - 'sent_email body incorrect') + self.assertIn(_mail_body1, sent_email['body'], 'sent_email body incorrect') + self.assertIn(_mail_signature1, sent_email['body'], 'sent_email body incorrect (no signature)') + self.assertIn("OpenERP", sent_email['body'], 'sent_email body incorrect (no OpenERP company)') # the html2plaintext uses etree or beautiful soup, so the result may be slighly different # depending if you have installed beautiful soup. - self.assertTrue(sent_email['body_alternative'] in [_mail_bodyalt1 + '\nBert Tartopoils\n', _mail_bodyalt1 + '\nAdministrator\n'], - 'sent_email body_alternative is incorrect') + self.assertIn(_mail_bodyalt1, sent_email['body_alternative'], 'sent_email body_alternative is incorrect') + self.assertIn(_mail_signaturealt1, sent_email['body_alternative'], 'sent_email body_alternative is incorrect (no signature)') + self.assertIn("OpenERP", sent_email['body_alternative'], 'sent_email body incorrect (no OpenERP company)') # Test: mail_message: notified_partner_ids = group followers message_pids = set([partner.id for partner in message1.notified_partner_ids]) test_pids = set([self.partner_admin_id, p_b_id, p_c_id]) @@ -405,7 +394,12 @@ class test_mail(TestMailBase): for sent_email in sent_emails: self.assertEqual(sent_email['subject'], _mail_subject, 'sent_email subject incorrect') self.assertIn(_mail_body2, sent_email['body'], 'sent_email body incorrect') - self.assertIn(_mail_bodyalt2, sent_email['body_alternative'], 'sent_email body_alternative incorrect') + self.assertIn(_mail_signature2, sent_email['body'], 'sent_email body incorrect (no signature)') + self.assertIn("OpenERP", sent_email['body'], 'sent_email body incorrect (no OpenERP company)') + # body_alternative + self.assertIn(_mail_bodyalt2, sent_email['body_alternative'], 'sent_email body_alternative is incorrect') + self.assertIn(_mail_signaturealt2, sent_email['body_alternative'], 'sent_email body_alternative is incorrect (no signature)') + self.assertIn("OpenERP", sent_email['body'], 'sent_email body incorrect (no OpenERP company)') # Test: mail_message: notified_partner_ids = group followers message_pids = set([partner.id for partner in message2.notified_partner_ids]) test_pids = set([self.partner_admin_id, p_b_id, p_c_id, p_d_id]) @@ -462,7 +456,7 @@ class test_mail(TestMailBase): # 2 - Carine Poilvache, with email, should never receive emails p_c_id = self.res_partner.create(cr, uid, {'name': 'Carine Poilvache', 'email': 'c@c', 'notification_email_send': 'email'}) # 3 - Dédé Grosbedon, without email, to test email verification; should receive emails for every message - p_d_id = self.res_partner.create(cr, uid, {'name': 'Dédé Grosbedon', 'notification_email_send': 'all'}) + p_d_id = self.res_partner.create(cr, uid, {'name': 'Dédé Grosbedon', 'email': 'd@d', 'notification_email_send': 'all'}) # Subscribe #1 group_pigs.message_subscribe([p_b_id]) @@ -525,7 +519,7 @@ class test_mail(TestMailBase): # 1. mass_mail on pigs and bird compose_id = mail_compose.create(cr, uid, {'subject': _subject, 'body': '${object.description}'}, - {'default_composition_mode': 'mass_mail', 'default_model': 'mail.group', 'default_res_id': False, + {'default_composition_mode': 'mass_mail', 'default_model': 'mail.group', 'default_res_id': False, 'default_notify': True, 'active_ids': [self.group_pigs_id, group_bird_id]}) compose = mail_compose.browse(cr, uid, compose_id) diff --git a/addons/mail/wizard/invite.py b/addons/mail/wizard/invite.py index a7cdc237a60..2eb48f3d998 100644 --- a/addons/mail/wizard/invite.py +++ b/addons/mail/wizard/invite.py @@ -32,12 +32,19 @@ class invite_wizard(osv.osv_memory): def default_get(self, cr, uid, fields, context=None): result = super(invite_wizard, self).default_get(cr, uid, fields, context=context) - if 'message' in fields and result.get('res_model') and result.get('res_id'): - document_name = self.pool.get(result.get('res_model')).name_get(cr, uid, [result.get('res_id')], context=context)[0][1] - message = _('
    You have been invited to follow %s.
    ' % document_name) + user_name = self.pool.get('res.users').name_get(cr, uid, [uid], context=context)[0][1] + model = result.get('res_model') + res_id = result.get('res_id') + if 'message' in fields and model and res_id: + ir_model = self.pool.get('ir.model') + model_ids = ir_model.search(cr, uid, [('model', '=', self.pool.get(model)._name)], context=context) + model_name = ir_model.name_get(cr, uid, model_ids, context=context)[0][1] + + document_name = self.pool.get(model).name_get(cr, uid, [res_id], context=context)[0][1] + message = _('

    Hello,

    %s invited you to follow %s document: %s.

    ') % (user_name, model_name, document_name) result['message'] = message elif 'message' in fields: - result['message'] = _('
    You have been invited to follow a new document.
    ') + result['message'] = _('

    Hello,

    %s invited you to follow a new document.

    ') % user_name return result _columns = { @@ -46,8 +53,12 @@ class invite_wizard(osv.osv_memory): help='Model of the followed resource'), 'res_id': fields.integer('Related Document ID', select=1, help='Id of the followed resource'), - 'partner_ids': fields.many2many('res.partner', string='Partners'), + 'partner_ids': fields.many2many('res.partner', string='Recipients', + help="List of partners that will be added as follower of the current document."), 'message': fields.html('Message'), + 'send_mail': fields.boolean('Send Email', + help="If checked, the partners will receive an email warning they have been " + "added in the document's followers."), } def add_followers(self, cr, uid, ids, context=None): @@ -59,23 +70,27 @@ class invite_wizard(osv.osv_memory): new_follower_ids = [p.id for p in wizard.partner_ids if p not in document.message_follower_ids] model_obj.message_subscribe(cr, uid, [wizard.res_id], new_follower_ids, context=context) - # send an email - if wizard.message: + ir_model = self.pool.get('ir.model') + model_ids = ir_model.search(cr, uid, [('model', '=', model_obj._name)], context=context) + model_name = ir_model.name_get(cr, uid, model_ids, context=context)[0][1] + + # send an email if option checked and if a message exists (do not send void emails) + if wizard.send_mail and wizard.message: # add signature - user_id = self.pool.get("res.users").read(cr, uid, [uid], fields=["signature"], context=context)[0] - signature = user_id and user_id["signature"] or '' - if signature: - wizard.message = tools.append_content_to_html(wizard.message, signature, plaintext=True, container_tag='div') # FIXME 8.0: use notification_email_send, send a wall message and let mail handle email notification + message box - for follower_id in new_follower_ids: - mail_mail = self.pool.get('mail.mail') - # the invite wizard should create a private message not related to any object -> no model, no res_id - mail_id = mail_mail.create(cr, uid, { - 'model': wizard.res_model, - 'res_id': wizard.res_id, - 'subject': 'Invitation to follow %s' % document.name_get()[0][1], - 'body_html': '%s' % wizard.message, - 'auto_delete': True, - }, context=context) - mail_mail.send(cr, uid, [mail_id], recipient_ids=[follower_id], context=context) + signature_company = self.pool.get('mail.notification').get_signature_footer(cr, uid, user_id=uid, res_model=wizard.res_model, res_id=wizard.res_id, context=context) + wizard.message = tools.append_content_to_html(wizard.message, signature_company, plaintext=False, container_tag='div') + + # send mail to new followers + # the invite wizard should create a private message not related to any object -> no model, no res_id + mail_mail = self.pool.get('mail.mail') + mail_id = mail_mail.create(cr, uid, { + 'model': wizard.res_model, + 'res_id': wizard.res_id, + 'subject': _('Invitation to follow %s: %s') % (model_name, document.name_get()[0][1]), + 'body_html': '%s' % wizard.message, + 'auto_delete': True, + 'recipient_ids': [(4, id) for id in new_follower_ids] + }, context=context) + mail_mail.send(cr, uid, [mail_id], context=context) return {'type': 'ir.actions.act_window_close'} diff --git a/addons/mail/wizard/invite_view.xml b/addons/mail/wizard/invite_view.xml index e957d546d37..2d550da2ecd 100644 --- a/addons/mail/wizard/invite_view.xml +++ b/addons/mail/wizard/invite_view.xml @@ -14,7 +14,8 @@ - + +