diff options
| author | Robot Odoo <xmo+roboto@odoo.com> | 2019-03-11 13:07:38 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-03-11 13:07:38 +0100 |
| commit | 0c1eff0d95869b9b4eab8b34e65be770e49fdd2b (patch) | |
| tree | 6c9129fcb72d3b393e78c22daebd6e62f8d650cb | |
| parent | 57004e22b04264cef9ec1be8fda9a3a0f24b2b70 (diff) | |
| parent | 7070fa32190124b1ca06b6aa3d857ca2ae148d62 (diff) | |
[MERGE][IMP] survey: apply small tweaks on survey views (certification)
Purpose
======
This merge implies several small tweaks on the survey views, mainly to add support for the new certification fields.
Show the quizz_passed field in the answers views
-------------------------------------------------------------------
The quizz_passed field is now more important because it determines whether
a certification has been successfully taken or not.
The quizz_passed field is added in:
- The search view of user_input
- The list view of user_input
- The form view of user_input (along with the score)
Fix survey statistics computation
-------------------------------------------
Fix the shared dict in the survey statistics computation that
causes surveys to incorrectly share the same stats when computed in batch.
Add a stat button on survey to show the certified count
------------------------------------------------------------------------
Add a stat button on the survey form view showing the amount
of answers with the quizz_passed field set to True.
It allows to quickly see people that have been granted the certification.
On click, the stat button redirects to the answers list view with the "Quizz passed"
filter defaulted to True.
Task-1936539
closes odoo/odoo#31467
Signed-off-by: Jérome Maes (jem) <jem@openerp.com>
| -rw-r--r-- | addons/survey/data/mail_template_data.xml | 12 | ||||
| -rw-r--r-- | addons/survey/models/survey_survey.py | 31 | ||||
| -rw-r--r-- | addons/survey/models/survey_user.py | 3 | ||||
| -rw-r--r-- | addons/survey/static/src/js/tour_test_certification_failure.js | 4 | ||||
| -rw-r--r-- | addons/survey/static/src/js/tour_test_certification_success.js | 4 | ||||
| -rw-r--r-- | addons/survey/views/survey_survey_views.xml | 7 | ||||
| -rw-r--r-- | addons/survey/views/survey_templates.xml | 7 | ||||
| -rw-r--r-- | addons/survey/views/survey_user_views.xml | 10 |
8 files changed, 65 insertions, 13 deletions
diff --git a/addons/survey/data/mail_template_data.xml b/addons/survey/data/mail_template_data.xml index de05a6a22d9..222d1fbae11 100644 --- a/addons/survey/data/mail_template_data.xml +++ b/addons/survey/data/mail_template_data.xml @@ -9,11 +9,19 @@ <div style="margin: 0px; padding: 0px; font-size: 13px;"> <p style="margin: 0px; padding: 0px; font-size: 13px;"> Dear ${object.partner_id.name or 'participant'}<br/><br/> - We are conducting a survey and your response would be appreciated. + % if object.survey_id.certificate: + You have been invited to take a new certification. + % else: + We are conducting a survey and your response would be appreciated. + % endif <div style="margin: 16px 0px 16px 0px;"> <a href="${('%s?answer_token=%s' % (object.survey_id.public_url, object.token)) | safe}" style="background-color: #875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: #fff; border-radius: 5px; font-size:13px;"> - Start Survey + % if object.survey_id.certificate: + Start Certification + % else: + Start Survey + % endif </a> </div> % if object.deadline: diff --git a/addons/survey/models/survey_survey.py b/addons/survey/models/survey_survey.py index e486ef9a41c..deb6978d0f7 100644 --- a/addons/survey/models/survey_survey.py +++ b/addons/survey/models/survey_survey.py @@ -70,6 +70,7 @@ class Survey(models.Model): invite_count = fields.Integer("Invite", compute="_compute_survey_statistic") answer_count = fields.Integer("Started", compute="_compute_survey_statistic") answer_done_count = fields.Integer("Completed", compute="_compute_survey_statistic") + certified_count = fields.Integer("Certified", compute="_compute_certified_count") # scoring and certification fields scoring_type = fields.Selection([ @@ -104,7 +105,7 @@ class Survey(models.Model): @api.depends('user_input_ids.state', 'user_input_ids.test_entry') def _compute_survey_statistic(self): - stat = dict.fromkeys(self.ids, {'invite_count': 0, 'answer_count': 0, 'answer_done_count': 0}) + stat = dict((cid, dict(invite_count=0, answer_count=0, answer_done_count=0)) for cid in self.ids) UserInput = self.env['survey.user_input'] base_domain = ['&', ('survey_id', 'in', self.ids), ('test_entry', '!=', True)] @@ -119,6 +120,22 @@ class Survey(models.Model): for survey in self: survey.update(stat[survey.id]) + @api.depends('certificate', 'user_input_ids.quizz_passed', 'user_input_ids.test_entry') + def _compute_certified_count(self): + stat = dict((cid, 0) for cid in self.ids) + certificate_surveys = self.filtered(lambda survey: survey.certificate) + if certificate_surveys: + read_group_res = self.env['survey.user_input'].read_group( + [('survey_id', 'in', certificate_surveys.ids), ('test_entry', '!=', True), ('quizz_passed', '=', True)], + [], + ['survey_id'] + ) + for item in read_group_res: + stat[item['survey_id'][0]] += item['survey_id_count'] + + for survey in self: + survey.certified_count = stat.get(survey.id, 0) + def _compute_survey_url(self): """ Computes a public URL for the survey """ base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') @@ -434,7 +451,7 @@ class Survey(models.Model): def action_send_survey(self): """ Open a window to compose an email, pre-filled with the survey message """ # Ensure that this survey has at least one page with at least one question. - if not self.page_ids or not [page.question_ids for page in self.page_ids if page.question_ids]: + if (not self.page_ids and self.questions_layout != 'page_per_question') or not self.question_ids: raise UserError(_('You cannot send an invitation for a survey that has no questions.')) if self.stage_id.closed: @@ -504,6 +521,16 @@ class Survey(models.Model): return action @api.multi + def action_survey_user_input_certified(self): + action_rec = self.env.ref('survey.action_survey_user_input_notest') + action = action_rec.read()[0] + ctx = dict(self.env.context) + ctx.update({'search_default_survey_id': self.ids[0], + 'search_default_quizz_passed': 1}) + action['context'] = ctx + return action + + @api.multi def action_survey_user_input_invite(self): action_rec = self.env.ref('survey.action_survey_user_input_notest') action = action_rec.read()[0] diff --git a/addons/survey/models/survey_user.py b/addons/survey/models/survey_user.py index 86d810ca588..e49d1314731 100644 --- a/addons/survey/models/survey_user.py +++ b/addons/survey/models/survey_user.py @@ -32,6 +32,7 @@ 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") 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([ @@ -58,7 +59,7 @@ class SurveyUserInput(models.Model): question_ids = fields.Many2many('survey.question', string='Predefined Questions', readonly=True) deadline = fields.Datetime('Deadline', help="Datetime until customer can open the survey and submit answers") - quizz_score = fields.Float("Score for the quiz (%)", compute="_compute_quizz_score", default=0.0) + quizz_score = fields.Float("Score (%)", compute="_compute_quizz_score") # Stored for performance reasons while displaying results page quizz_passed = fields.Boolean('Quizz Passed', compute='_compute_quizz_passed', store=True, compute_sudo=True) diff --git a/addons/survey/static/src/js/tour_test_certification_failure.js b/addons/survey/static/src/js/tour_test_certification_failure.js index 395e6b23990..baebb64864d 100644 --- a/addons/survey/static/src/js/tour_test_certification_failure.js +++ b/addons/survey/static/src/js/tour_test_certification_failure.js @@ -9,8 +9,8 @@ odoo.define('survey.tour_test_certification_failure', function (require) { var tour = require('web_tour.tour'); var failSteps = [{ // Page-1 - content: "Clicking on Start Survey", - trigger: 'a.btn.btn-primary.btn-lg:contains("Start Survey")', + content: "Clicking on Start Certification", + trigger: 'a.btn.btn-primary.btn-lg:contains("Start Certification")', }, { // Question: Do we sell Acoustic Bloc Screens? content: "Selecting answer 'No'", trigger: 'div.js_question-wrapper:contains("Do we sell Acoustic Bloc Screens") select', diff --git a/addons/survey/static/src/js/tour_test_certification_success.js b/addons/survey/static/src/js/tour_test_certification_success.js index 9d0d7d4ec33..39108e1b7a4 100644 --- a/addons/survey/static/src/js/tour_test_certification_success.js +++ b/addons/survey/static/src/js/tour_test_certification_success.js @@ -8,8 +8,8 @@ tour.register('test_certification_success', { url: '/survey/start/4ead4bc8-b8f2-4760-a682-1fde8ddb95ac' }, [{ // Page-1 - content: "Clicking on Start Survey", - trigger: 'a.btn.btn-primary.btn-lg:contains("Start Survey")', + content: "Clicking on Start Certification", + trigger: 'a.btn.btn-primary.btn-lg:contains("Start Certification")', }, { // Question: Do we sell Acoustic Bloc Screens? content: "Selecting answer 'Yes'", trigger: 'div.js_question-wrapper:contains("Do we sell Acoustic Bloc Screens") select', diff --git a/addons/survey/views/survey_survey_views.xml b/addons/survey/views/survey_survey_views.xml index 35833af5fef..43a7a44c26c 100644 --- a/addons/survey/views/survey_survey_views.xml +++ b/addons/survey/views/survey_survey_views.xml @@ -24,6 +24,13 @@ icon="fa-envelope-o"> <field string="Invitations" name="invite_count" widget="statinfo"/> </button> + <button name="action_survey_user_input_certified" + type="object" + class="oe_stat_button" + attrs="{'invisible': [('certificate', '=', False)]}" + icon="fa-trophy"> + <field string="Certified" name="certified_count" widget="statinfo"/> + </button> <button name="action_survey_user_input_completed" type="object" class="oe_stat_button" diff --git a/addons/survey/views/survey_templates.xml b/addons/survey/views/survey_templates.xml index e5f13cf766f..cbef0daac68 100644 --- a/addons/survey/views/survey_templates.xml +++ b/addons/survey/views/survey_templates.xml @@ -178,7 +178,12 @@ </p> </div> <a role="button" class="btn btn-primary btn-lg" t-att-href="'/survey/fill/%s/%s' % (survey.access_token, answer.token)"> - Start Survey + <t t-if="survey.certificate"> + Start Certification + </t> + <t t-else=""> + Start Survey + </t> </a> </div> </div> diff --git a/addons/survey/views/survey_user_views.xml b/addons/survey/views/survey_user_views.xml index f7a58249125..205ba2ee709 100644 --- a/addons/survey/views/survey_user_views.xml +++ b/addons/survey/views/survey_user_views.xml @@ -16,6 +16,7 @@ <separator/> <filter string="Invite" name="invite" domain="[('input_type', '=', 'link')]"/> <separator/> + <filter string="Quizz passed" name="quizz_passed" domain="[('quizz_passed','=', True)]"/> <filter string="Test Entries" name="test" domain="[('test_entry','=', True)]"/> <group expand="0" string="Group By"> <filter name="group_by_survey" string="Survey" domain="[]" context="{'group_by': 'survey_id'}"/> @@ -50,7 +51,9 @@ <field name="partner_id"/> <field name="email" widget="email"/> <field name="test_entry" groups="base.group_no_one"/> - <field name="quizz_score" groups="base.group_no_one"/> + <field name="scoring_type" invisible="1"/> + <field name="quizz_score" attrs="{'invisible': [('scoring_type', '=', 'no_scoring')]}"/> + <field name="quizz_passed" attrs="{'invisible': [('scoring_type', '=', 'no_scoring')]}"/> </group> </group> <field name="user_input_line_ids" mode="tree" attrs="{'readonly': False}"> @@ -76,10 +79,11 @@ <field name="deadline"/> <field name="partner_id"/> <field name="email"/> - <field name="input_type"/> + <field name="input_type" groups="base.group_no_one"/> <field name="state"/> <field name="test_entry" invisible="True"/> - <field name="quizz_score" groups="base.group_no_one"/> + <field name="quizz_passed"/> + <field name="quizz_score"/> </tree> </field> </record> |
