From 50caae5bc02bc6eaa1b4a4dfd965c84c940bb84b Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Thu, 28 Mar 2019 16:46:44 +0000 Subject: [PATCH] [REF] survey: replace dynamic survey.stage by a static state on survey.survey Stages modification through the clickable statusbar wasn't very intuitive. By fixing default behavior through states (and corresponding buttons), default user experience is simplified. 3 static states available : draft, open, closed Form view: navigation through states with buttons Kanban view: disabled modification of survey state Task ID : 1949110 closes odoo/odoo#32325 Signed-off-by: Thibault Delavallee (tde) --- .../data/survey_demo.xml | 2 +- addons/survey/__manifest__.py | 2 - addons/survey/controllers/main.py | 2 +- addons/survey/data/survey_data.xml | 24 ----------- .../survey/data/survey_demo_certification.xml | 2 +- addons/survey/data/survey_demo_feedback.xml | 4 +- addons/survey/models/__init__.py | 1 - addons/survey/models/survey_stage.py | 19 --------- addons/survey/models/survey_survey.py | 41 ++++++++++++------- addons/survey/security/ir.model.access.csv | 4 -- addons/survey/security/survey_security.xml | 22 ---------- addons/survey/tests/common.py | 2 +- .../survey/tests/test_certification_flow.py | 2 +- .../test_survey_compute_pages_questions.py | 2 +- addons/survey/tests/test_survey_flow.py | 2 +- addons/survey/tests/test_survey_invite.py | 2 +- addons/survey/views/survey_stage_views.xml | 19 --------- addons/survey/views/survey_survey_views.xml | 24 +++++++---- .../data/survey_demo.xml | 2 +- .../test_course_certification_failure.py | 2 +- 20 files changed, 53 insertions(+), 127 deletions(-) delete mode 100644 addons/survey/data/survey_data.xml delete mode 100644 addons/survey/models/survey_stage.py delete mode 100644 addons/survey/views/survey_stage_views.xml diff --git a/addons/hr_recruitment_survey/data/survey_demo.xml b/addons/hr_recruitment_survey/data/survey_demo.xml index 08b93472297..71678f56c3c 100644 --- a/addons/hr_recruitment_survey/data/survey_demo.xml +++ b/addons/hr_recruitment_survey/data/survey_demo.xml @@ -2,7 +2,7 @@ Recruitment Form - + open token hr_recruitment diff --git a/addons/survey/__manifest__.py b/addons/survey/__manifest__.py index 63fa068f150..c67a1123fd5 100644 --- a/addons/survey/__manifest__.py +++ b/addons/survey/__manifest__.py @@ -25,13 +25,11 @@ sent mails with personal token for the invitation of the survey. 'views/survey_report_templates.xml', 'views/survey_reports.xml', 'data/mail_template_data.xml', - 'data/survey_data.xml', 'data/ir_actions_data.xml', 'security/survey_security.xml', 'security/ir.model.access.csv', 'views/assets.xml', 'views/survey_menus.xml', - 'views/survey_stage_views.xml', 'views/survey_survey_views.xml', 'views/survey_user_views.xml', 'views/survey_question_views.xml', diff --git a/addons/survey/controllers/main.py b/addons/survey/controllers/main.py index f576e971061..770a8c20a1d 100644 --- a/addons/survey/controllers/main.py +++ b/addons/survey/controllers/main.py @@ -69,7 +69,7 @@ class Survey(http.Controller): if survey_sudo.users_login_required and request.env.user._is_public(): return 'survey_auth' - if (survey_sudo.is_closed or not survey_sudo.active) and (not answer_sudo or not answer_sudo.test_entry): + if (survey_sudo.state == 'closed' or survey_sudo.state == 'draft' or not survey_sudo.active) and (not answer_sudo or not answer_sudo.test_entry): return 'survey_closed' if (not survey_sudo.page_ids and survey_sudo.questions_layout == 'page_per_section') or not survey_sudo.question_ids: diff --git a/addons/survey/data/survey_data.xml b/addons/survey/data/survey_data.xml deleted file mode 100644 index a900d03ce8a..00000000000 --- a/addons/survey/data/survey_data.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Draft - - - - - - In progress - - - - - - Closed - - - - - - diff --git a/addons/survey/data/survey_demo_certification.xml b/addons/survey/data/survey_demo_certification.xml index b2696793449..59dacd12703 100644 --- a/addons/survey/data/survey_demo_certification.xml +++ b/addons/survey/data/survey_demo_certification.xml @@ -5,7 +5,7 @@ MyCompany Vendor Certification 4ead4bc8-b8f2-4760-a682-1fde8ddb95ac - + open public diff --git a/addons/survey/data/survey_demo_feedback.xml b/addons/survey/data/survey_demo_feedback.xml index 4b6dd5440f8..18a013888f3 100644 --- a/addons/survey/data/survey_demo_feedback.xml +++ b/addons/survey/data/survey_demo_feedback.xml @@ -4,7 +4,7 @@ User Feedback Form b137640d-14d4-4748-9ef6-344ca256531e - + open public page_per_section @@ -233,4 +233,4 @@ skip - \ No newline at end of file + diff --git a/addons/survey/models/__init__.py b/addons/survey/models/__init__.py index 7b04b95e1cc..982f7817af9 100644 --- a/addons/survey/models/__init__.py +++ b/addons/survey/models/__init__.py @@ -4,5 +4,4 @@ from . import ir_autovacuum from . import survey_survey from . import survey_question -from . import survey_stage from . import survey_user diff --git a/addons/survey/models/survey_stage.py b/addons/survey/models/survey_stage.py deleted file mode 100644 index f2d415340fd..00000000000 --- a/addons/survey/models/survey_stage.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import fields, models - - -class SurveyStage(models.Model): - _name = 'survey.stage' - _description = 'Survey Stage' - _order = 'sequence,id' - - name = fields.Char(required=True, translate=True) - sequence = fields.Integer(default=1) - closed = fields.Boolean(help="If closed, people won't be able to answer to surveys in this column.") - fold = fields.Boolean(string="Folded in kanban view") - - _sql_constraints = [ - ('positive_sequence', 'CHECK(sequence >= 0)', 'Sequence number MUST be a natural') - ] diff --git a/addons/survey/models/survey_survey.py b/addons/survey/models/survey_survey.py index c2452b55524..3f6410c6899 100644 --- a/addons/survey/models/survey_survey.py +++ b/addons/survey/models/survey_survey.py @@ -21,9 +21,6 @@ class Survey(models.Model): _rec_name = 'title' _inherit = ['mail.thread', 'mail.activity.mixin'] - def _get_default_stage_id(self): - return self.env['survey.stage'].search([], limit=1).id - def _get_default_access_token(self): return str(uuid.uuid4()) @@ -37,9 +34,15 @@ class Survey(models.Model): question_and_page_ids = fields.One2many('survey.question', 'survey_id', string='Sections and Questions', copy=True) page_ids = fields.One2many('survey.question', string='Pages', compute="_compute_page_and_question_ids") question_ids = fields.One2many('survey.question', string='Questions', compute="_compute_page_and_question_ids") - stage_id = fields.Many2one('survey.stage', string="Stage", default=lambda self: self._get_default_stage_id(), - ondelete="restrict", copy=False, group_expand='_read_group_stage_ids') - is_closed = fields.Boolean("Is closed", related='stage_id.closed', readonly=True) + state = fields.Selection( + string="Survey Stage", + selection=[ + ('draft', 'Draft'), + ('open', 'In Progress'), + ('closed', 'Closed'), + ], default='draft', required=True, + group_expand='_read_group_states' + ) questions_layout = fields.Selection([ ('one_page', 'One page with all the questions'), ('page_per_section', 'One page per section'), @@ -174,13 +177,9 @@ class Survey(models.Model): if self.is_time_limited and (not self.time_limit or self.time_limit <= 0): self.time_limit = 10 - @api.model - def _read_group_stage_ids(self, stages, domain, order): - """ Read group customization in order to display all the stages in the - kanban view, even if they are empty - """ - stage_ids = stages._search([], order=order, access_rights_uid=SUPERUSER_ID) - return stages.browse(stage_ids) + def _read_group_states(self, values, domain, order): + selection = self.env['survey.survey'].fields_get(allfields=['state'])['state']['selection'] + return [s[0] for s in selection] # Public methods # def copy_data(self, default=None): @@ -245,7 +244,7 @@ class Survey(models.Model): else: if not self.active: raise UserError(_('Creating token for archived surveys is not allowed.')) - elif self.is_closed: + elif self.state == 'closed': raise UserError(_('Creating token for closed surveys is not allowed.')) if self.access_mode == 'authentication': # signup possible -> should have at least a partner to create an account @@ -437,6 +436,18 @@ class Survey(models.Model): # Actions + @api.multi + def action_draft(self): + self.write({'state': 'draft'}) + + @api.multi + def action_open(self): + self.write({'state': 'open'}) + + @api.multi + def action_close(self): + self.write({'state': 'closed'}) + @api.multi def action_start_survey(self): """ Open the website page with the survey form """ @@ -457,7 +468,7 @@ class Survey(models.Model): if (not self.page_ids and self.questions_layout == 'page_per_section') or not self.question_ids: raise UserError(_('You cannot send an invitation for a survey that has no questions.')) - if self.stage_id.closed: + if self.state == 'closed': raise UserError(_("You cannot send invitations for closed surveys.")) template = self.env.ref('survey.mail_template_user_input_invite', raise_if_not_found=False) diff --git a/addons/survey/security/ir.model.access.csv b/addons/survey/security/ir.model.access.csv index a7bba66e8c2..907823200d4 100644 --- a/addons/survey/security/ir.model.access.csv +++ b/addons/survey/security/ir.model.access.csv @@ -3,10 +3,6 @@ access_survey_all,survey.survey.all,model_survey_survey,,0,0,0,0 access_survey_user,survey.survey.user,model_survey_survey,base.group_user,0,0,0,0 access_survey_survey_user,survey.survey.survey.user,model_survey_survey,group_survey_user,1,1,1,1 access_survey_survey_manager,survey.survey.survey.manager,model_survey_survey,group_survey_manager,1,1,1,1 -access_survey_stage_all,survey.stage.all,model_survey_stage,,0,0,0,0 -access_survey_stage_user,survey.stage.user,model_survey_stage,base.group_user,0,0,0,0 -access_survey_stage_survey_user,survey.stage.survey.user,model_survey_stage,group_survey_user,1,0,0,0 -access_survey_stage_survey_manager,survey.stage.survey.manager,model_survey_stage,group_survey_manager,1,1,1,1 access_survey_question_all,survey.question.all,model_survey_question,,0,0,0,0 access_survey_question_user,survey.question.user,model_survey_question,base.group_user,0,0,0,0 access_survey_question_survey_user,survey.question.survey.user,model_survey_question,group_survey_user,1,1,1,1 diff --git a/addons/survey/security/survey_security.xml b/addons/survey/security/survey_security.xml index c2025b7017e..46bf54e53ac 100644 --- a/addons/survey/security/survey_security.xml +++ b/addons/survey/security/survey_security.xml @@ -56,28 +56,6 @@ - - Survey stage: manager: all - - [(1, '=', 1)] - - - - - - - - - Survey stage: officer: read all - - [(1, '=', 1)] - - - - - - - Survey question: manager: all diff --git a/addons/survey/tests/common.py b/addons/survey/tests/common.py index d0a7942ade7..71af5d8d4d0 100644 --- a/addons/survey/tests/common.py +++ b/addons/survey/tests/common.py @@ -68,7 +68,7 @@ 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, + 'state': 'open', }) self.page_0 = self.env['survey.question'].sudo(self.survey_manager).create({ 'title': 'First page', diff --git a/addons/survey/tests/test_certification_flow.py b/addons/survey/tests/test_certification_flow.py index e596e34fa7d..b1db33ec215 100644 --- a/addons/survey/tests/test_certification_flow.py +++ b/addons/survey/tests/test_certification_flow.py @@ -51,7 +51,7 @@ class TestCertificationFlow(common.SurveyCase, HttpCase): 'certification_mail_template_id': self.env.ref('survey.mail_template_certification').id, 'is_time_limited': True, 'time_limit': 10, - 'stage_id': self.env['survey.stage'].search([('closed', '=', False)]).id + 'state': 'open', }) q01 = self._add_question( diff --git a/addons/survey/tests/test_survey_compute_pages_questions.py b/addons/survey/tests/test_survey_compute_pages_questions.py index 3b48fb509f3..3fd54cc00fa 100644 --- a/addons/survey/tests/test_survey_compute_pages_questions.py +++ b/addons/survey/tests/test_survey_compute_pages_questions.py @@ -9,7 +9,7 @@ class TestSurveyComputePagesQuestions(common.SurveyCase): 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 + 'state': 'open', }) page_0 = self.env['survey.question'].create({ diff --git a/addons/survey/tests/test_survey_flow.py b/addons/survey/tests/test_survey_flow.py index b2d8c6f09c6..35247902c76 100644 --- a/addons/survey/tests/test_survey_flow.py +++ b/addons/survey/tests/test_survey_flow.py @@ -34,7 +34,7 @@ class TestSurveyFlow(common.SurveyCase, HttpCase): 'access_mode': 'public', 'users_login_required': False, 'questions_layout': 'page_per_section', - 'stage_id': self.env['survey.stage'].search([('closed', '=', False)]).id + 'state': 'open' }) # First page is about customer data diff --git a/addons/survey/tests/test_survey_invite.py b/addons/survey/tests/test_survey_invite.py index 5b530c15734..4f5224e6872 100644 --- a/addons/survey/tests/test_survey_invite.py +++ b/addons/survey/tests/test_survey_invite.py @@ -34,7 +34,7 @@ class TestSurveyInvite(common.SurveyCase): # closed self.env['survey.survey'].sudo(self.survey_manager).create({ 'title': 'S0', - 'stage_id': self.env['survey.stage'].search([('sequence', '=', 3)]).id, + 'state': 'closed', 'question_and_page_ids': [ (0, 0, {'is_page': True, 'title': 'P0', 'sequence': 1}), (0, 0, {'title': 'Q0', 'sequence': 2, 'question_type': 'free_text'}) diff --git a/addons/survey/views/survey_stage_views.xml b/addons/survey/views/survey_stage_views.xml deleted file mode 100644 index f536981b260..00000000000 --- a/addons/survey/views/survey_stage_views.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Form view for survey stage - survey.stage - -
- - - - - - -
-
-
-
-
\ No newline at end of file diff --git a/addons/survey/views/survey_survey_views.xml b/addons/survey/views/survey_survey_views.xml index 196425b5350..3319f518623 100644 --- a/addons/survey/views/survey_survey_views.xml +++ b/addons/survey/views/survey_survey_views.xml @@ -7,13 +7,16 @@
-
-
@@ -115,11 +118,14 @@ - - + + + +