diff options
| author | Aurélien Warnon <awa@odoo.com> | 2019-02-06 09:37:59 +0000 |
|---|---|---|
| committer | Aurélien Warnon <awa@odoo.com> | 2019-02-06 09:37:59 +0000 |
| commit | dba478332681dd21a39c4a183c002b1cf6e046d2 (patch) | |
| tree | 81b302664d0af480965d66ecfdb279684113a90a /addons/survey/tests | |
| parent | eacaf02544fe3b2c51e48234bffcf86aff6841f1 (diff) | |
[REF] survey: convert survey.page to survey.question -> is_page=True
Task #1902306
Purpose
=======
survey.question is now also the model used for the survey's pages (with the "is_page" field set to True).
This allows to put all the pages and questions together in a o2m field on the view side and
easily reorganize your survey by dragging the items around.
It also removes one level of encoding by directly having 'Add a page' and 'Add a question'
links on the tree view of questions, enabling a faster encoding.
However, this has the downside of making the code reading a little bit more complicated.
Efforts were made at the model level to create computed fields so that the use of these models
still seems somewhat logical. That means:
- A survey still has "page_ids" (question_and_page_ids filtered on is_page = True)
- These "page_ids" still have question_ids (questions located between this page and the next)
- These "question_ids" still have a "page_id"
That makes the use and display of these information at view and controller levels easier to understand.
Diffstat (limited to 'addons/survey/tests')
| -rw-r--r-- | addons/survey/tests/__init__.py | 1 | ||||
| -rw-r--r-- | addons/survey/tests/common.py | 19 | ||||
| -rw-r--r-- | addons/survey/tests/test_survey_compute_pages_questions.py | 69 | ||||
| -rw-r--r-- | addons/survey/tests/test_survey_flow.py | 18 | ||||
| -rw-r--r-- | addons/survey/tests/test_survey_invite.py | 9 | ||||
| -rw-r--r-- | addons/survey/tests/test_survey_security.py | 28 |
6 files changed, 113 insertions, 31 deletions
diff --git a/addons/survey/tests/__init__.py b/addons/survey/tests/__init__.py index 0f0a3bd31ca..bc51dec7bcf 100644 --- a/addons/survey/tests/__init__.py +++ b/addons/survey/tests/__init__.py @@ -7,3 +7,4 @@ from . import test_survey_flow from . import test_survey_invite from . import test_survey_security from . import test_survey_ui +from . import test_survey_compute_pages_questions diff --git a/addons/survey/tests/common.py b/addons/survey/tests/common.py index f5be81b7f0e..a37b7cd6b91 100644 --- a/addons/survey/tests/common.py +++ b/addons/survey/tests/common.py @@ -67,19 +67,24 @@ class SurveyCase(common.SavepointCase): 'access_mode': 'public', 'users_login_required': True, 'users_can_go_back': False, + 'stage_id': self.env['survey.stage'].search([('closed', '=', False)]).id, }) - self.page_0 = self.env['survey.page'].sudo(self.survey_manager).create({ + self.page_0 = self.env['survey.question'].sudo(self.survey_manager).create({ 'title': 'First page', 'survey_id': self.survey.id, + 'sequence': 1, + 'is_page': True, }) self.question_ft = self.env['survey.question'].sudo(self.survey_manager).create({ - 'question': 'Test Free Text', - 'page_id': self.page_0.id, + 'title': 'Test Free Text', + 'survey_id': self.survey.id, + 'sequence': 2, 'question_type': 'free_text', }) self.question_num = self.env['survey.question'].sudo(self.survey_manager).create({ - 'question': 'Test NUmerical Box', - 'page_id': self.page_0.id, + 'title': 'Test NUmerical Box', + 'survey_id': self.survey.id, + 'sequence': 3, 'question_type': 'numerical_box', }) @@ -143,8 +148,8 @@ class SurveyCase(common.SavepointCase): constr_mandatory = kwargs.pop('constr_mandatory', True) constr_error_msg = kwargs.pop('constr_error_msg', 'TestError') base_qvalues = { - 'page_id': page.id, - 'question': name, + 'sequence': page.question_ids[-1].sequence + 1 if page.question_ids else page.sequence + 1, + 'title': name, 'question_type': qtype, 'constr_mandatory': constr_mandatory, 'constr_error_msg': constr_error_msg, diff --git a/addons/survey/tests/test_survey_compute_pages_questions.py b/addons/survey/tests/test_survey_compute_pages_questions.py new file mode 100644 index 00000000000..3b48fb509f3 --- /dev/null +++ b/addons/survey/tests/test_survey_compute_pages_questions.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.survey.tests import common + + +class TestSurveyComputePagesQuestions(common.SurveyCase): + def test_compute_pages_questions(self): + with self.sudo(self.survey_manager): + survey = self.env['survey.survey'].create({ + 'title': 'Test compute survey', + 'stage_id': self.env['survey.stage'].search([('closed', '=', False)]).id + }) + + page_0 = self.env['survey.question'].create({ + 'is_page': True, + 'sequence': 1, + 'title': 'P1', + 'survey_id': survey.id + }) + page0_q0 = self._add_question(page_0, 'Q1', 'free_text', survey_id=survey.id) + page0_q1 = self._add_question(page_0, 'Q2', 'free_text', survey_id=survey.id) + page0_q2 = self._add_question(page_0, 'Q3', 'free_text', survey_id=survey.id) + page0_q3 = self._add_question(page_0, 'Q4', 'free_text', survey_id=survey.id) + page0_q4 = self._add_question(page_0, 'Q5', 'free_text', survey_id=survey.id) + + page_1 = self.env['survey.question'].create({ + 'is_page': True, + 'sequence': 7, + 'title': 'P2', + 'survey_id': survey.id, + }) + page1_q0 = self._add_question(page_1, 'Q6', 'free_text', survey_id=survey.id) + page1_q1 = self._add_question(page_1, 'Q7', 'free_text', survey_id=survey.id) + page1_q2 = self._add_question(page_1, 'Q8', 'free_text', survey_id=survey.id) + page1_q3 = self._add_question(page_1, 'Q9', 'free_text', survey_id=survey.id) + + self.assertEqual(len(survey.page_ids), 2, "Survey should have 2 pages") + self.assertIn(page_0, survey.page_ids, "Page 1 should be contained in survey's page_ids") + self.assertIn(page_1, survey.page_ids, "Page 2 should be contained in survey's page_ids") + + self.assertEqual(len(page_0.question_ids), 5, "Page 1 should have 5 questions") + self.assertIn(page0_q0, page_0.question_ids, "Question 1 should be in page 1") + self.assertIn(page0_q1, page_0.question_ids, "Question 2 should be in page 1") + self.assertIn(page0_q2, page_0.question_ids, "Question 3 should be in page 1") + self.assertIn(page0_q3, page_0.question_ids, "Question 4 should be in page 1") + self.assertIn(page0_q4, page_0.question_ids, "Question 5 should be in page 1") + + self.assertEqual(len(page_1.question_ids), 4, "Page 2 should have 4 questions") + self.assertIn(page1_q0, page_1.question_ids, "Question 6 should be in page 2") + self.assertIn(page1_q1, page_1.question_ids, "Question 7 should be in page 2") + self.assertIn(page1_q2, page_1.question_ids, "Question 8 should be in page 2") + self.assertIn(page1_q3, page_1.question_ids, "Question 9 should be in page 2") + + self.assertEqual(page0_q0.page_id, page_0, "Question 1 should belong to page 1") + self.assertEqual(page0_q1.page_id, page_0, "Question 2 should belong to page 1") + self.assertEqual(page0_q2.page_id, page_0, "Question 3 should belong to page 1") + self.assertEqual(page0_q3.page_id, page_0, "Question 4 should belong to page 1") + self.assertEqual(page0_q4.page_id, page_0, "Question 5 should belong to page 1") + + self.assertEqual(page1_q0.page_id, page_1, "Question 6 should belong to page 2") + self.assertEqual(page1_q1.page_id, page_1, "Question 7 should belong to page 2") + self.assertEqual(page1_q2.page_id, page_1, "Question 8 should belong to page 2") + self.assertEqual(page1_q3.page_id, page_1, "Question 9 should belong to page 2") + + # move 1 question from page 1 to page 2 + page0_q2.write({'sequence': 12}) + page0_q2._compute_page_id() + self.assertEqual(page0_q2.page_id, page_1, "Question 3 should now belong to page 2") diff --git a/addons/survey/tests/test_survey_flow.py b/addons/survey/tests/test_survey_flow.py index 85c36621816..f83352800da 100644 --- a/addons/survey/tests/test_survey_flow.py +++ b/addons/survey/tests/test_survey_flow.py @@ -52,21 +52,25 @@ class TestSurveyFlow(common.SurveyCase, HttpCase): }) # First page is about customer data - page_0 = self.env['survey.page'].create({ + page_0 = self.env['survey.question'].create({ + 'is_page': True, + 'sequence': 1, 'title': 'Page1: Your Data', 'survey_id': survey.id, }) page0_q0 = self._add_question( page_0, 'What is your name', 'free_text', comments_allowed=False, - constr_mandatory=True, constr_error_msg='Please enter your name') + constr_mandatory=True, constr_error_msg='Please enter your name', survey_id=survey.id) page0_q1 = self._add_question( page_0, 'What is your age', 'numerical_box', comments_allowed=False, - constr_mandatory=True, constr_error_msg='Please enter your name') + constr_mandatory=True, constr_error_msg='Please enter your name', survey_id=survey.id) # Second page is about tarte al djotte - page_1 = self.env['survey.page'].create({ + page_1 = self.env['survey.question'].create({ + 'is_page': True, + 'sequence': 4, 'title': 'Page2: Tarte Al Djotte', 'survey_id': survey.id, }) @@ -75,7 +79,7 @@ class TestSurveyFlow(common.SurveyCase, HttpCase): labels=[{'value': 'The gras'}, {'value': 'The bette'}, {'value': 'The tout'}, - {'value': 'The regime is fucked up'}]) + {'value': 'The regime is fucked up'}], survey_id=survey.id) # fetch starting data to check only newly created data during this flow answers = self.env['survey.user_input'].search([('survey_id', '=', survey.id)]) @@ -95,12 +99,12 @@ class TestSurveyFlow(common.SurveyCase, HttpCase): self.assertEqual(len(answers), 1) answer_token = answers.token self.assertTrue(answer_token) - self.assertAnswer(answers, 'new', self.env['survey.page']) + self.assertAnswer(answers, 'new', self.env['survey.question']) # Customer begins survey with first page r = self._access_page(survey, answer_token) self.assertResponse(r, 200) - self.assertAnswer(answers, 'new', self.env['survey.page']) + self.assertAnswer(answers, 'new', self.env['survey.question']) csrf_token = self._find_csrf_token(r.text) # Customer submit first page answers diff --git a/addons/survey/tests/test_survey_invite.py b/addons/survey/tests/test_survey_invite.py index 3b977d0221d..5b530c15734 100644 --- a/addons/survey/tests/test_survey_invite.py +++ b/addons/survey/tests/test_survey_invite.py @@ -30,12 +30,15 @@ class TestSurveyInvite(common.SurveyCase): # no page self.env['survey.survey'].create({'title': 'Test survey'}), # no questions - self.env['survey.survey'].create({'title': 'Test survey', 'page_ids': [(0, 0, {'title': 'P0'})]}), + self.env['survey.survey'].create({'title': 'Test survey', 'question_and_page_ids': [(0, 0, {'is_page': True, 'title': 'P0', 'sequence': 1})]}), # closed self.env['survey.survey'].sudo(self.survey_manager).create({ 'title': 'S0', - 'stage_id': self.env['survey.stage'].search([('closed', '=', True)]).id, - 'page_ids': [(0, 0, {'title': 'P0', 'question_ids': [(0, 0, {'question': 'Q0', 'question_type': 'free_text'})]})] + 'stage_id': self.env['survey.stage'].search([('sequence', '=', 3)]).id, + 'question_and_page_ids': [ + (0, 0, {'is_page': True, 'title': 'P0', 'sequence': 1}), + (0, 0, {'title': 'Q0', 'sequence': 2, 'question_type': 'free_text'}) + ] }) ] for survey in surveys: diff --git a/addons/survey/tests/test_survey_security.py b/addons/survey/tests/test_survey_security.py index 7ac3db41382..b2473029f7a 100644 --- a/addons/survey/tests/test_survey_security.py +++ b/addons/survey/tests/test_survey_security.py @@ -25,9 +25,9 @@ class TestAccess(common.SurveyCase): with self.assertRaises(AccessError): self.env['survey.survey'].create({'title': 'Test Survey 2'}) with self.assertRaises(AccessError): - self.env['survey.page'].create({'title': 'My Page', 'survey_id': self.survey.id}) + self.env['survey.question'].create({'title': 'My Page', 'sequence': 0, 'is_page': True, 'survey_id': self.survey.id}) with self.assertRaises(AccessError): - self.env['survey.question'].create({'question': 'My Question', 'page_id': self.page_0.id}) + self.env['survey.question'].create({'title': 'My Question', 'sequence': 1, 'page_id': self.page_0.id}) # Read: nope with self.assertRaises(AccessError): @@ -58,9 +58,9 @@ class TestAccess(common.SurveyCase): with self.assertRaises(AccessError): self.env['survey.survey'].create({'title': 'Test Survey 2'}) with self.assertRaises(AccessError): - self.env['survey.page'].create({'title': 'My Page', 'survey_id': self.survey.id}) + self.env['survey.question'].create({'title': 'My Page', 'sequence': 0, 'is_page': True, 'survey_id': self.survey.id}) with self.assertRaises(AccessError): - self.env['survey.question'].create({'question': 'My Question', 'page_id': self.page_0.id}) + self.env['survey.question'].create({'title': 'My Question', 'sequence': 1, 'page_id': self.page_0.id}) # Read: nope with self.assertRaises(AccessError): @@ -91,9 +91,9 @@ class TestAccess(common.SurveyCase): with self.assertRaises(AccessError): self.env['survey.survey'].create({'title': 'Test Survey 2'}) with self.assertRaises(AccessError): - self.env['survey.page'].create({'title': 'My Page', 'survey_id': self.survey.id}) + self.env['survey.question'].create({'title': 'My Page', 'sequence': 0, 'is_page': True, 'survey_id': self.survey.id}) with self.assertRaises(AccessError): - self.env['survey.question'].create({'question': 'My Question', 'page_id': self.page_0.id}) + self.env['survey.question'].create({'title': 'My Question', 'sequence': 1, 'page_id': self.page_0.id}) # Read: nope with self.assertRaises(AccessError): @@ -121,8 +121,8 @@ class TestAccess(common.SurveyCase): def test_access_survey_survey_manager(self): # Create: all survey = self.env['survey.survey'].create({'title': 'Test Survey 2'}) - page = self.env['survey.page'].create({'title': 'My Page', 'survey_id': survey.id}) - self.env['survey.question'].create({'question': 'My Question', 'page_id': page.id}) + self.env['survey.question'].create({'title': 'My Page', 'sequence': 0, 'is_page': True, 'survey_id': survey.id}) + self.env['survey.question'].create({'title': 'My Question', 'sequence': 1, 'survey_id': survey.id}) # Read: all surveys = self.env['survey.survey'].search([('title', 'ilike', 'Test')]) @@ -140,8 +140,8 @@ class TestAccess(common.SurveyCase): def test_access_survey_survey_user(self): # Create: own only survey = self.env['survey.survey'].create({'title': 'Test Survey 2'}) - page = self.env['survey.page'].create({'title': 'My Page', 'survey_id': survey.id}) - self.env['survey.question'].create({'question': 'My Question', 'page_id': page.id}) + self.env['survey.question'].create({'title': 'My Page', 'sequence': 0, 'is_page': True, 'survey_id': survey.id}) + self.env['survey.question'].create({'title': 'My Question', 'sequence': 1, 'survey_id': survey.id}) # Read: all surveys = self.env['survey.survey'].search([('title', 'ilike', 'Test')]) @@ -249,8 +249,8 @@ class TestAccess(common.SurveyCase): @users('survey_user') def test_access_answers_survey_user(self): survey_own = self.env['survey.survey'].create({'title': 'Other'}) - page_own = self.env['survey.page'].create({'title': 'Other', 'survey_id': survey_own.id}) - question_own = self.env['survey.question'].create({'question': 'Other Question', 'page_id': page_own.id}) + self.env['survey.question'].create({'title': 'Other', 'sequence': 0, 'is_page': True, 'survey_id': survey_own.id}) + question_own = self.env['survey.question'].create({'title': 'Other Question', 'sequence': 1, 'survey_id': survey_own.id}) # Create: own survey only answer_own = self.env['survey.user_input'].create({'survey_id': survey_own.id}) @@ -293,8 +293,8 @@ class TestAccess(common.SurveyCase): admin = self.env.ref('base.user_admin') with self.sudo(admin): survey_other = self.env['survey.survey'].create({'title': 'Other'}) - page_other = self.env['survey.page'].create({'title': 'Other', 'survey_id': survey_other.id}) - question_other = self.env['survey.question'].create({'question': 'Other Question', 'page_id': page_other.id}) + self.env['survey.question'].create({'title': 'Other', 'sequence': 0, 'is_page': True, 'survey_id': survey_other.id}) + question_other = self.env['survey.question'].create({'title': 'Other Question', 'sequence': 1, 'survey_id': survey_other.id}) self.assertEqual(survey_other.create_uid, admin) self.assertEqual(question_other.create_uid, admin) |
