From 0b1b8f13e110fc0e150fb0553a35a5d6c26e4cbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Warnon?= Date: Mon, 4 Mar 2019 09:10:58 +0000 Subject: [PATCH] [IMP] survey: add attempt number on answer views MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Purpose ======= This commit adds the attempt number on the answer (= survey.user_input) form & tree views. The attempt number is always relative to its "pool" of attempts and depends on the "invite_token" if specified. ex: Attempt n° 2 / 4 (where "4" is the attempts_limit of the related survey). closes odoo/odoo#31771 Signed-off-by: Thibault Delavallee (tde) --- addons/survey/models/survey_user.py | 37 +++++++++++++++++++++++ addons/survey/views/survey_user_views.xml | 8 +++++ 2 files changed, 45 insertions(+) diff --git a/addons/survey/models/survey_user.py b/addons/survey/models/survey_user.py index b4da8b0d4b8..ee291c7b713 100644 --- a/addons/survey/models/survey_user.py +++ b/addons/survey/models/survey_user.py @@ -33,6 +33,8 @@ class SurveyUserInput(models.Model): # description survey_id = fields.Many2one('survey.survey', string='Survey', required=True, readonly=True, ondelete='cascade') scoring_type = fields.Selection(string="Scoring", related="survey_id.scoring_type") + is_attempts_limited = fields.Boolean("Limited number of attempts", related='survey_id.is_attempts_limited') + attempts_limit = fields.Integer("Number of attempts", related='survey_id.attempts_limit') start_datetime = fields.Datetime('Start date and time', readonly=True) is_time_limit_reached = fields.Boolean("Is time limit reached?", compute='_compute_is_time_limit_reached') input_type = fields.Selection([ @@ -50,6 +52,7 @@ class SurveyUserInput(models.Model): invite_token = fields.Char('Invite token', readonly=True, copy=False) partner_id = fields.Many2one('res.partner', string='Partner', readonly=True) email = fields.Char('E-mail', readonly=True) + attempt_number = fields.Integer("Attempt n°", compute='_compute_attempt_number') # Displaying data last_displayed_page_id = fields.Many2one('survey.question', string='Last displayed question/page') @@ -136,6 +139,40 @@ class SurveyUserInput(models.Model): user_input.is_time_limit_reached = user_input.survey_id.is_time_limited and fields.Datetime.now() \ > user_input.start_datetime + relativedelta(minutes=user_input.survey_id.time_limit) + @api.depends('state', 'test_entry', 'survey_id.is_attempts_limited', 'partner_id', 'email', 'invite_token') + def _compute_attempt_number(self): + attempts_to_compute = self.filtered( + lambda user_input: user_input.state == 'done' and not user_input.test_entry and user_input.survey_id.is_attempts_limited + ) + + for user_input in (self - attempts_to_compute): + user_input.attempt_number = 1 + + if attempts_to_compute: + self.env.cr.execute("""SELECT user_input.id, (COUNT(previous_user_input.id) + 1) AS attempt_number + FROM survey_user_input user_input + LEFT OUTER JOIN survey_user_input previous_user_input + ON user_input.survey_id = previous_user_input.survey_id + AND previous_user_input.state = 'done' + AND previous_user_input.test_entry = False + AND previous_user_input.id < user_input.id + AND (user_input.invite_token IS NULL OR user_input.invite_token = previous_user_input.invite_token) + AND (user_input.partner_id = previous_user_input.partner_id OR user_input.email = previous_user_input.email) + WHERE user_input.id IN %s + GROUP BY user_input.id; + """, (tuple(attempts_to_compute.ids),)) + + attempts_count_results = self.env.cr.dictfetchall() + + for user_input in attempts_to_compute: + attempt_number = 1 + for attempts_count_result in attempts_count_results: + if attempts_count_result['id'] == user_input.id: + attempt_number = attempts_count_result['attempt_number'] + break + + user_input.attempt_number = attempt_number + @api.multi def _mark_done(self): """ This method will: diff --git a/addons/survey/views/survey_user_views.xml b/addons/survey/views/survey_user_views.xml index 8a39f8ced84..0725db4ba88 100644 --- a/addons/survey/views/survey_user_views.xml +++ b/addons/survey/views/survey_user_views.xml @@ -44,6 +44,13 @@ + +