Files
odoo_source/addons/website_event/tests/test_event_internals.py
T
Levi Siuzdak (sile) 4e8d835b80 [FIX] website_event: copy template question translations
Versions:
---------
- 15.0+

Steps to reproduce:
-------------------
1. Have multiple languages and Studio enabled;
2. create an event template;
3. add a question;
4. add translation to question;
5. use template to create event.

Issue:
------
Translation doesn't get copied from template to event.

Cause:
------
The `_compute_question_ids` method copied the questions by *manually*
recreating them. It didn't use the `copy_translations` method like the
regular `copy` methods does.

The reason the questions were recreated is because question records
cannot link directly from event template to event, as changes to the
event shouldn't affect the template.

Solution:
---------
Use the `copy` method instead while setting `event_type_id` to `False`
to satisfy the restriction.

opw-3572599

closes odoo/odoo#144451

X-original-commit: 73d603b65fca33773557012c4ba38da1bc98271d
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
Signed-off-by: Levi Siuzdak <sile@odoo.com>
2023-12-01 14:23:45 +00:00

227 lines
11 KiB
Python

# -*- 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)