From 21cdbd82e90dfb48c5a6711f40b0751e444d20f0 Mon Sep 17 00:00:00 2001 From: David Beguin Date: Mon, 4 Nov 2019 12:25:31 +0000 Subject: [PATCH] [IMP] website_slides_survey: keep challenge category updated Purpose of this commit is to ensure challenge linked to surveys linked to slides have ``slides`` category, while challenge linked to surveys not linked to slides (if changing survey_id for example) have ``certification`` category. With this patch challenges are correctly categorized, allowing to accurately filter them based on their category. Task ID : 1961053 PR #32594 --- addons/survey/models/survey_survey.py | 4 ++- .../models/slide_slide.py | 26 +++++++++++++++++++ .../models/survey_survey.py | 4 +++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/addons/survey/models/survey_survey.py b/addons/survey/models/survey_survey.py index d11a83fd663..92030be9cf8 100644 --- a/addons/survey/models/survey_survey.py +++ b/addons/survey/models/survey_survey.py @@ -705,6 +705,8 @@ class Survey(models.Model): # ------------------------------------------------------------ # GAMIFICATION / BADGES # ------------------------------------------------------------ + def _prepare_challenge_category(self): + return 'certification' def _create_certification_badge_trigger(self): self.ensure_one() @@ -725,7 +727,7 @@ class Survey(models.Model): 'reward_id': self.certification_badge_id.id, 'state': 'inprogress', 'period': 'once', - 'challenge_category': 'certification', + 'challenge_category': self._prepare_challenge_category(), 'reward_realtime': True, 'report_message_frequency': 'never', 'user_domain': [('karma', '>', 0)], diff --git a/addons/website_slides_survey/models/slide_slide.py b/addons/website_slides_survey/models/slide_slide.py index 6bc157b1ac6..3b3ceadefa7 100644 --- a/addons/website_slides_survey/models/slide_slide.py +++ b/addons/website_slides_survey/models/slide_slide.py @@ -57,8 +57,34 @@ class Slide(models.Model): rec = super(Slide, self).create(values) if rec.survey_id: rec.slide_type = 'certification' + if 'survey_id' in values: + rec._ensure_challenge_category() return rec + def write(self, values): + old_surveys = self.mapped('survey_id') + result = super(Slide, self).write(values) + if 'survey_id' in values: + self._ensure_challenge_category(old_surveys=old_surveys - self.mapped('survey_id')) + return result + + def unlink(self): + old_surveys = self.mapped('survey_id') + result = super(Slide, self).unlink() + self._ensure_challenge_category(old_surveys=old_surveys, unlink=True) + return result + + def _ensure_challenge_category(self, old_surveys=None, unlink=False): + """ If a slide is linked to a survey that gives a badge, the challenge category of this badge must be + set to 'slides' in order to appear under the certification badge list on ranks_badges page. + If the survey is unlinked from the slide, the challenge category must be reset to 'certification'""" + if old_surveys: + old_certification_challenges = old_surveys.mapped('certification_badge_id').challenge_ids + old_certification_challenges.write({'challenge_category': 'certification'}) + if not unlink: + certification_challenges = self.mapped('survey_id').mapped('certification_badge_id').challenge_ids + certification_challenges.write({'challenge_category': 'slides'}) + def _generate_certification_url(self): """ get a map of certification url for certification slide from `self`. The url will come from the survey user input: 1/ existing and not done user_input for member of the course diff --git a/addons/website_slides_survey/models/survey_survey.py b/addons/website_slides_survey/models/survey_survey.py index dc8c91e1599..7f4e0c48bce 100644 --- a/addons/website_slides_survey/models/survey_survey.py +++ b/addons/website_slides_survey/models/survey_survey.py @@ -14,3 +14,7 @@ class Survey(models.Model): return True return super(Survey, self)._check_answer_creation(user, partner, email, test_entry=test_entry, check_attempts=check_attempts, invite_token=invite_token) + + def _prepare_challenge_category(self): + slide_survey = self.env['slide.slide'].search([('survey_id', '=', self.id)]) + return 'slides' if slide_survey else 'certification'