diff --git a/addons/event/models/event.py b/addons/event/models/event.py index 1e35e4d29eb..2fa2a56fbfb 100644 --- a/addons/event/models/event.py +++ b/addons/event/models/event.py @@ -364,15 +364,22 @@ class EventRegistration(models.Model): _inherit = ['mail.thread', 'mail.activity.mixin'] _order = 'name, create_date desc' + # event origin = fields.Char( string='Source Document', readonly=True, help="Reference of the document that created the registration, for example a sales order") event_id = fields.Many2one( 'event.event', string='Event', required=True, readonly=True, states={'draft': [('readonly', False)]}) + # attendee partner_id = fields.Many2one( 'res.partner', string='Contact', states={'done': [('readonly', True)]}) + name = fields.Char(string='Attendee Name', index=True) + email = fields.Char(string='Email') + phone = fields.Char(string='Phone') + mobile = fields.Char(string='Mobile') + # organization date_open = fields.Datetime(string='Registration Date', readonly=True, default=lambda self: fields.Datetime.now()) # weird crash is directly now date_closed = fields.Datetime(string='Attended Date', readonly=True) event_begin_date = fields.Datetime(string="Event Start Date", related='event_id.date_begin', readonly=True) @@ -384,9 +391,6 @@ class EventRegistration(models.Model): ('draft', 'Unconfirmed'), ('cancel', 'Cancelled'), ('open', 'Confirmed'), ('done', 'Attended')], string='Status', default='draft', readonly=True, copy=False, tracking=True) - email = fields.Char(string='Email') - phone = fields.Char(string='Phone') - name = fields.Char(string='Attendee Name', index=True) @api.constrains('event_id', 'state') def _check_seats_limit(self): @@ -421,6 +425,7 @@ class EventRegistration(models.Model): data = { 'name': registration.get('name', partner_id.name), 'phone': registration.get('phone', partner_id.phone), + 'mobile': registration.get('mobile', partner_id.mobile), 'email': registration.get('email', partner_id.email), 'partner_id': partner_id.id, 'event_id': event_id and event_id.id or False, @@ -462,6 +467,7 @@ class EventRegistration(models.Model): self.name = contact.name or self.name self.email = contact.email or self.email self.phone = contact.phone or self.phone + self.mobile = contact.mobile or self.mobile def _message_get_suggested_recipients(self): recipients = super(EventRegistration, self)._message_get_suggested_recipients() diff --git a/addons/event/models/event_mail.py b/addons/event/models/event_mail.py index eb423012af5..da3f876c22e 100644 --- a/addons/event/models/event_mail.py +++ b/addons/event/models/event_mail.py @@ -29,6 +29,7 @@ class EventTypeMail(models.Model): event_type_id = fields.Many2one( 'event.type', string='Event Type', ondelete='cascade', required=True) + notification_type = fields.Selection([('mail', 'Mail')], string='Send', default='mail', required=True) interval_nbr = fields.Integer('Interval', default=1) interval_unit = fields.Selection([ ('now', 'Immediately'), @@ -42,7 +43,7 @@ class EventTypeMail(models.Model): string='Trigger', default="before_event", required=True) template_id = fields.Many2one( 'mail.template', string='Email Template', - domain=[('model', '=', 'event.registration')], required=True, ondelete='restrict', + domain=[('model', '=', 'event.registration')], ondelete='restrict', help='This field contains the template of the mail that will be automatically sent') @@ -56,6 +57,7 @@ class EventMailScheduler(models.Model): event_id = fields.Many2one('event.event', string='Event', required=True, ondelete='cascade') sequence = fields.Integer('Display order') + notification_type = fields.Selection([('mail', 'Mail')], string='Send', default='mail', required=True) interval_nbr = fields.Integer('Interval', default=1) interval_unit = fields.Selection([ ('now', 'Immediately'), @@ -69,7 +71,7 @@ class EventMailScheduler(models.Model): string='Trigger ', default="before_event", required=True) template_id = fields.Many2one( 'mail.template', string='Email Template', - domain=[('model', '=', 'event.registration')], required=True, ondelete='restrict', + domain=[('model', '=', 'event.registration')], ondelete='restrict', help='This field contains the template of the mail that will be automatically sent') scheduled_date = fields.Datetime('Scheduled Sent Mail', compute='_compute_scheduled_date', store=True) mail_registration_ids = fields.One2many('event.mail.registration', 'scheduler_id') @@ -113,7 +115,7 @@ class EventMailScheduler(models.Model): mail.mail_registration_ids.filtered(lambda reg: reg.scheduled_date and reg.scheduled_date <= now).execute() else: # Do not send emails if the mailing was scheduled before the event but the event is over - if not mail.mail_sent and (mail.interval_type != 'before_event' or mail.event_id.date_end > now): + if not mail.mail_sent and (mail.interval_type != 'before_event' or mail.event_id.date_end > now) and mail.notification_type == 'mail': mail.event_id.mail_attendees(mail.template_id.id) mail.write({'mail_sent': True}) return True @@ -180,7 +182,7 @@ class EventMailRegistration(models.Model): def execute(self): for mail in self: - if mail.registration_id.state in ['open', 'done'] and not mail.mail_sent: + if mail.registration_id.state in ['open', 'done'] and not mail.mail_sent and mail.scheduler_id.notification_type == 'mail': mail.scheduler_id.template_id.send_mail(mail.registration_id.id) mail.write({'mail_sent': True}) diff --git a/addons/event/tests/common.py b/addons/event/tests/common.py index dbd142a08be..06de8639651 100644 --- a/addons/event/tests/common.py +++ b/addons/event/tests/common.py @@ -6,47 +6,54 @@ from odoo import fields from odoo.tests import common -class TestEventCommon(common.TransactionCase): +class TestEventCommon(common.SavepointCase): - def setUp(self): - super(TestEventCommon, self).setUp() - - # Usefull models - self.Users = self.env['res.users'] - self.Event = self.env['event.event'] - self.Registration = self.env['event.registration'] - self.EventMail = self.env['event.mail'] + @classmethod + def setUpClass(cls): + super(TestEventCommon, cls).setUpClass() # User groups - self.group_employee_id = self.env['ir.model.data'].xmlid_to_res_id('base.group_user') - self.group_event_user_id = self.env['ir.model.data'].xmlid_to_res_id('event.group_event_user') - self.group_event_manager_id = self.env['ir.model.data'].xmlid_to_res_id('event.group_event_manager') - group_system = self.env.ref('base.group_system') + cls.group_employee_id = cls.env.ref('base.group_user').id + cls.group_event_user_id = cls.env.ref('event.group_event_user').id + cls.group_event_manager_id = cls.env.ref('event.group_event_manager').id + cls.group_system_id = cls.env.ref('base.group_system').id # Test users to use through the various tests - self.user_eventuser = self.Users.with_context({'no_reset_password': True}).create({ + cls.user_eventuser = cls.env['res.users'].with_context({'no_reset_password': True}).create({ 'name': 'Armande EventUser', 'login': 'Armande', 'email': 'armande.eventuser@example.com', 'tz': 'Europe/Brussels', - 'groups_id': [(6, 0, [self.group_employee_id, self.group_event_user_id])] + 'groups_id': [(6, 0, [cls.group_employee_id, cls.group_event_user_id])] }) - self.user_eventmanager = self.Users.with_context({'no_reset_password': True}).create({ + cls.user_eventmanager = cls.env['res.users'].with_context({'no_reset_password': True}).create({ 'name': 'Bastien EventManager', 'login': 'bastien', 'email': 'bastien.eventmanager@example.com', 'tz': 'Europe/Brussels', 'groups_id': [(6, 0, [ - self.group_employee_id, - self.group_event_manager_id, - group_system.id])] + cls.group_employee_id, + cls.group_event_manager_id, + cls.group_system_id])] }) - self.event_0 = self.env['event.event'].create({ + cls.event_0 = cls.env['event.event'].create({ 'name': 'TestEvent', + 'auto_confirm': True, 'date_begin': fields.Datetime.to_string(datetime.today() + timedelta(days=1)), 'date_end': fields.Datetime.to_string(datetime.today() + timedelta(days=15)), - 'registration_ids': [(0, 0, { - 'partner_id': self.user_eventuser.partner_id.id, - })] }) + + # set country in order to format belgium numbers + cls.event_0.company_id.write({'country_id': cls.env.ref('base.be').id}) + + @classmethod + def _create_registrations(cls, event, reg_count): + # create some registrations + registrations = cls.env['event.registration'].create([{ + 'event_id': event.id, + 'name': 'Test Registration %s' % x, + 'email': '_test_reg_%s@example.com' % x, + 'phone': '04560000%s%s' % (x, x), + } for x in range(0, reg_count)]) + return registrations diff --git a/addons/event/tests/test_event_flow.py b/addons/event/tests/test_event_flow.py index 08ac4654877..7a2364ac4c9 100644 --- a/addons/event/tests/test_event_flow.py +++ b/addons/event/tests/test_event_flow.py @@ -19,7 +19,7 @@ class TestEventFlow(TestEventCommon): def test_00_basic_event_auto_confirm(self): """ Basic event management with auto confirmation """ # EventUser creates a new event: ok - test_event = self.Event.with_user(self.user_eventmanager).create({ + test_event = self.env['event.event'].with_user(self.user_eventmanager).create({ 'name': 'TestEvent', 'auto_confirm': True, 'date_begin': datetime.datetime.now() + relativedelta(days=-1), @@ -30,13 +30,13 @@ class TestEventFlow(TestEventCommon): self.assertEqual(test_event.state, 'confirm', 'Event: auto_confirmation of event failed') # EventUser create registrations for this event - test_reg1 = self.Registration.with_user(self.user_eventuser).create({ + test_reg1 = self.env['event.registration'].with_user(self.user_eventuser).create({ 'name': 'TestReg1', 'event_id': test_event.id, }) self.assertEqual(test_reg1.state, 'open', 'Event: auto_confirmation of registration failed') self.assertEqual(test_event.seats_reserved, 1, 'Event: wrong number of reserved seats after confirmed registration') - test_reg2 = self.Registration.with_user(self.user_eventuser).create({ + test_reg2 = self.env['event.registration'].with_user(self.user_eventuser).create({ 'name': 'TestReg2', 'event_id': test_event.id, }) @@ -45,7 +45,7 @@ class TestEventFlow(TestEventCommon): # EventUser create registrations for this event: too much registrations with self.assertRaises(ValidationError): - self.Registration.with_user(self.user_eventuser).create({ + self.env['event.registration'].with_user(self.user_eventuser).create({ 'name': 'TestReg3', 'event_id': test_event.id, }) @@ -70,7 +70,7 @@ class TestEventFlow(TestEventCommon): """ Avanced event flow: no auto confirmation, manage minimum / maximum seats, ... """ # EventUser creates a new event: ok - test_event = self.Event.with_user(self.user_eventmanager).create({ + test_event = self.env['event.event'].with_user(self.user_eventmanager).create({ 'name': 'TestEvent', 'date_begin': datetime.datetime.now() + relativedelta(days=-1), 'date_end': datetime.datetime.now() + relativedelta(days=1), @@ -81,7 +81,7 @@ class TestEventFlow(TestEventCommon): 'Event: new event should be in draft state, no auto confirmation') # EventUser create registrations for this event -> no auto confirmation - test_reg1 = self.Registration.with_user(self.user_eventuser).create({ + test_reg1 = self.env['event.registration'].with_user(self.user_eventuser).create({ 'name': 'TestReg1', 'event_id': test_event.id, }) @@ -92,7 +92,7 @@ class TestEventFlow(TestEventCommon): def test_event_access_rights(self): # EventManager required to create or update events with self.assertRaises(AccessError): - self.Event.with_user(self.user_eventuser).create({ + self.env['event.event'].with_user(self.user_eventuser).create({ 'name': 'TestEvent', 'date_begin': datetime.datetime.now() + relativedelta(days=-1), 'date_end': datetime.datetime.now() + relativedelta(days=1), @@ -114,9 +114,11 @@ class TestEventFlow(TestEventCommon): event_config.execute() def test_event_data(self): + self.event_0.write({'registration_ids': [(0, 0, {'partner_id': self.user_eventuser.partner_id.id})]}) self.assertEqual(self.event_0.registration_ids.get_date_range_str(), u'tomorrow') def test_event_date_range(self): + self.event_0.write({'registration_ids': [(0, 0, {'partner_id': self.user_eventuser.partner_id.id})]}) self.patcher = patch('odoo.addons.event.models.event.fields.Datetime', wraps=Datetime) self.mock_datetime = self.patcher.start() diff --git a/addons/event/tests/test_mail_schedule.py b/addons/event/tests/test_mail_schedule.py index 1210c33f2ac..7dcc446dc9c 100644 --- a/addons/event/tests/test_mail_schedule.py +++ b/addons/event/tests/test_mail_schedule.py @@ -17,7 +17,7 @@ class TestMailSchedule(TestEventCommon): event_date_begin = now + relativedelta(days=1) event_date_end = now + relativedelta(days=3) - test_event = self.Event.with_user(self.user_eventmanager).create({ + test_event = self.env['event.event'].with_user(self.user_eventmanager).create({ 'name': 'TestEventMail', 'auto_confirm': True, 'date_begin': event_date_begin, @@ -37,19 +37,19 @@ class TestMailSchedule(TestEventCommon): }) # create some registrations - self.Registration.with_user(self.user_eventuser).create({ + self.env['event.registration'].with_user(self.user_eventuser).create({ 'event_id': test_event.id, 'name': 'Reg0', 'email': 'reg0@example.com', }) - self.Registration.with_user(self.user_eventuser).create({ + self.env['event.registration'].with_user(self.user_eventuser).create({ 'event_id': test_event.id, 'name': 'Reg1', 'email': 'reg1@example.com', }) # check subscription scheduler - schedulers = self.EventMail.search([('event_id', '=', test_event.id), ('interval_type', '=', 'after_sub')]) + schedulers = self.env['event.mail'].search([('event_id', '=', test_event.id), ('interval_type', '=', 'after_sub')]) self.assertEqual(len(schedulers), 1, 'event: wrong scheduler creation') self.assertEqual(schedulers[0].scheduled_date, test_event.create_date, 'event: incorrect scheduled date for checking controller') @@ -63,7 +63,7 @@ class TestMailSchedule(TestEventCommon): self.assertTrue(registration.mail_sent, 'event: wrongly confirmed mailing on registration') # check before event scheduler - schedulers = self.EventMail.search([('event_id', '=', test_event.id), ('interval_type', '=', 'before_event')]) + schedulers = self.env['event.mail'].search([('event_id', '=', test_event.id), ('interval_type', '=', 'before_event')]) self.assertEqual(len(schedulers), 1, 'event: wrong scheduler creation') self.assertEqual(schedulers[0].scheduled_date, event_date_begin + relativedelta(days=-1), 'event: incorrect scheduled date') @@ -75,5 +75,3 @@ class TestMailSchedule(TestEventCommon): mails = self.env['mail.mail'].search([('subject', 'ilike', 'TestEventMail'), ('date', '>=', now)], order='date DESC', limit=3) self.assertEqual(len(mails), 3, 'event: wrong number of reminders in outgoing mail queue') - - diff --git a/addons/event/views/event_views.xml b/addons/event/views/event_views.xml index a27715955ba..a0d0c684458 100644 --- a/addons/event/views/event_views.xml +++ b/addons/event/views/event_views.xml @@ -60,8 +60,9 @@