# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from datetime import datetime, timedelta from odoo.fields import Datetime as FieldsDatetime from odoo.tests.common import users from odoo.addons.website.tools import MockRequest from odoo.addons.website_event.controllers.main import WebsiteEventController from odoo.addons.website_event.tests.common import TestEventQuestionCommon class TestEventData(TestEventQuestionCommon): @users('user_eventmanager') def test_event_type_configuration_from_type(self): """ Enure configuration & translations are copied from Event Type on Event creation """ self.env['res.lang'].sudo()._activate_lang('nl_NL') event_type = self.event_type_questions.with_user(self.env.user) event_type_question_nl = self.event_question_1.with_context(lang='nl_NL') event_type_question_nl.title = "Vraag1" event_type_question_nl.answer_ids[0].name = "V1-Antwoord1" event = self.env['event.event'].create({ 'name': 'Event Update Type', 'event_type_id': event_type.id, 'date_begin': FieldsDatetime.to_string(datetime.today() + timedelta(days=1)), 'date_end': FieldsDatetime.to_string(datetime.today() + timedelta(days=15)), }) self.assertEqual( event.question_ids.mapped('question_type'), ['name', 'email', 'phone', 'simple_choice', 'simple_choice', 'text_box']) self.assertEqual(event.specific_question_ids.filtered( lambda q: q.question_type in ['simple_choice', 'text_box']).title, 'Question1') self.assertEqual(event.specific_question_ids.filtered( lambda q: q.question_type in ['name', 'email', 'phone', 'company_name']) .mapped('title'), ['Name', 'Email', 'Phone']) self.assertEqual( set(event.specific_question_ids.filtered( lambda q: q.question_type in ['simple_choice', 'text_box']).mapped('answer_ids.name')), set(['Q1-Answer1', 'Q1-Answer2'])) self.assertEqual(len(event.general_question_ids), 2) self.assertEqual(event.general_question_ids[0].title, 'Question2') self.assertEqual(event.general_question_ids[1].title, 'Question3') self.assertEqual( set(event.general_question_ids[0].mapped('answer_ids.name')), set(['Q2-Answer1', 'Q2-Answer2'])) # verify translations event_question_nl = event.specific_question_ids.filtered_domain([ ('title', '=', self.event_question_1.title), ]).with_context(lang='nl_NL') self.assertNotEqual(event_question_nl.title, self.event_question_1.title, "Translated title should differ from untranslated title.") self.assertEqual(event_question_nl.title, event_type_question_nl.title, "Translated title should be copied.") self.assertEqual( set(event_question_nl.answer_ids.mapped('name')), set(event_type_question_nl.answer_ids.mapped('name')), "Translated answer names should be copied.") def test_process_attendees_form(self): event = self.env['event.event'].create({ 'name': 'Event Update Type', 'event_type_id': self.event_type_questions.with_user(self.env.user).id, 'date_begin': FieldsDatetime.to_string(datetime.today() + timedelta(days=1)), 'date_end': FieldsDatetime.to_string(datetime.today() + timedelta(days=15)), }) ticket_id_1 = self.env['event.event.ticket'].create([{ 'name': 'Regular', 'event_id': event.id, 'seats_max': 200, }]) ticket_id_2 = self.env['event.event.ticket'].create([{ 'name': 'VIP', 'event_id': event.id, 'seats_max': 200, }]) [name_question, email_question, phone_question] = event.question_ids.filtered( lambda q: q.question_type in ('name', 'email', 'phone', 'company_name')) [second_phone_question, company_name_question] = self.env['event.question'].create([{ 'title': 'Second Phone', 'question_type': 'phone', 'event_id': event.id, }, { 'title': 'Company Name', 'question_type': 'company_name', 'event_id': event.id, }]) form_details = { '1-name-%s' % name_question.id: 'Pixis', '1-email-%s' % email_question.id: 'pixis@gmail.com', '1-phone-%s' % phone_question.id: '+32444444444', '1-phone-%s' % second_phone_question.id: '+32555555555', '1-event_ticket_id': ticket_id_1.id, '2-name-%s' % name_question.id: 'Geluchat', '2-email-%s' % email_question.id: 'geluchat@gmail.com', '2-phone-%s' % phone_question.id: '+32777777777', '2-company_name-%s' % company_name_question.id: 'My Company', '2-event_ticket_id': ticket_id_2.id, '1-simple_choice-%s' % self.event_question_1.id: '5', '2-simple_choice-%s' % self.event_question_1.id: '9', '0-simple_choice-%s' % self.event_question_2.id: '7', '0-text_box-%s' % self.event_question_3.id: 'Free Text', } with MockRequest(self.env): registrations = WebsiteEventController()._process_attendees_form(event, form_details) self.assertEqual(registrations, [ {'name': 'Pixis', 'email': 'pixis@gmail.com', 'phone': '+32444444444', 'event_ticket_id': ticket_id_1.id, 'registration_answer_ids': [ (0, 0, {'question_id': name_question.id, 'value_text_box': 'Pixis'}), (0, 0, {'question_id': email_question.id, 'value_text_box': 'pixis@gmail.com'}), (0, 0, {'question_id': phone_question.id, 'value_text_box': '+32444444444'}), (0, 0, {'question_id': second_phone_question.id, 'value_text_box': '+32555555555'}), (0, 0, {'question_id': self.event_question_1.id, 'value_answer_id': 5}), (0, 0, {'question_id': self.event_question_2.id, 'value_answer_id': 7}), (0, 0, {'question_id': self.event_question_3.id, 'value_text_box': 'Free Text'})]}, {'name': 'Geluchat', 'email': 'geluchat@gmail.com', 'phone': '+32777777777', 'company_name': 'My Company', 'event_ticket_id': ticket_id_2.id, 'registration_answer_ids': [ (0, 0, {'question_id': name_question.id, 'value_text_box': 'Geluchat'}), (0, 0, {'question_id': email_question.id, 'value_text_box': 'geluchat@gmail.com'}), (0, 0, {'question_id': phone_question.id, 'value_text_box': '+32777777777'}), (0, 0, {'question_id': company_name_question.id, 'value_text_box': 'My Company'}), (0, 0, {'question_id': self.event_question_1.id, 'value_answer_id': 9}), (0, 0, {'question_id': self.event_question_2.id, 'value_answer_id': 7}), (0, 0, {'question_id': self.event_question_3.id, 'value_text_box': 'Free Text'})]} ]) def test_process_attendees_form_no_tickets(self): """Check that registering with no ticket works.""" event = self.env['event.event'].create({ 'name': 'Test Event', 'event_type_id': self.event_type_questions.id, 'date_begin': FieldsDatetime.to_string(datetime.today() + timedelta(days=1)), 'date_end': FieldsDatetime.to_string(datetime.today() + timedelta(days=15)), }) name_question, email_question = event.question_ids.filtered( lambda q: q.question_type in ('name', 'email')) form_details = { '1-name-%s' % name_question.id: 'Attendee Name', '1-email-%s' % email_question.id: 'attendee@example.com', '1-event_ticket_id': '0', } with MockRequest(self.env): registrations = WebsiteEventController()._process_attendees_form(event, form_details) self.assertEqual(len(registrations), 1) self.assertDictEqual(registrations[0], { 'name': 'Attendee Name', 'email': 'attendee@example.com', 'event_ticket_id': False, 'registration_answer_ids': [ (0, 0, {'question_id': name_question.id, 'value_text_box': 'Attendee Name'}), (0, 0, {'question_id': email_question.id, 'value_text_box': 'attendee@example.com'}) ] }) self.assertTrue(registrations[0]['event_ticket_id'] is False, f'Falsy string ids should be False, not {registrations[0]["event_ticket_id"]}') def test_registration_answer_search(self): """ Test our custom name_search implementation in 'event.registration.answer'. We search on both the 'value_answer_id' and 'value_text_box' fields to allow users to easily filter registrations based on the selected answers of the attendees. """ event = self.env['event.event'].create({ 'name': 'Test Event', 'event_type_id': self.event_type_questions.id, 'date_begin': FieldsDatetime.to_string(datetime.today() + timedelta(days=1)), 'date_end': FieldsDatetime.to_string(datetime.today() + timedelta(days=15)), }) [registration_1, registration_2, registration_3] = self.env['event.registration'].create([{ 'event_id': event.id, 'partner_id': self.env.user.partner_id.id, 'registration_answer_ids': [ (0, 0, { 'question_id': self.event_question_1.id, 'value_answer_id': self.event_question_1.answer_ids[0].id, }), ] }, { 'event_id': event.id, 'partner_id': self.env.user.partner_id.id, 'registration_answer_ids': [ (0, 0, { 'question_id': self.event_question_1.id, 'value_answer_id': self.event_question_1.answer_ids[1].id, }), (0, 0, { 'question_id': self.event_question_3.id, 'value_text_box': "My Answer", }), ] }, { 'event_id': event.id, 'partner_id': self.env.user.partner_id.id, 'registration_answer_ids': [ (0, 0, { 'question_id': self.event_question_3.id, 'value_text_box': "Answer2", }), ] }]) search_res = self.env['event.registration'].search([ ('registration_answer_ids', 'ilike', 'Answer1') ]) # should fetch "registration_1" because the answer to the first question is "Q1-Answer1" self.assertEqual(search_res, registration_1) search_res = self.env['event.registration'].search([ ('registration_answer_ids', 'ilike', 'Answer2') ]) # should fetch "registration_2" because the answer to the first question is "Q1-Answer2" # should fetch "registration_3" because the answer to the third question is "Answer2" (as free text) self.assertEqual(search_res, registration_2 | registration_3)