From 96d20559030094a195430d158335ce9519062c48 Mon Sep 17 00:00:00 2001 From: clementthomas Date: Wed, 27 Sep 2023 18:49:32 +0200 Subject: [PATCH] [IMP] survey_event_registration_generation: several dependant event questions in the same page (ajax) --- .../controllers/main.py | 9 ++++ .../models/survey_user_input.py | 10 ++++- .../static/src/js/survey_form.js | 45 ++++++++++++++++++- .../views/survey_templates.xml | 16 +++++-- 4 files changed, 73 insertions(+), 7 deletions(-) diff --git a/survey_event_registration_generation/controllers/main.py b/survey_event_registration_generation/controllers/main.py index cf1f0b6..21e6197 100644 --- a/survey_event_registration_generation/controllers/main.py +++ b/survey_event_registration_generation/controllers/main.py @@ -3,8 +3,17 @@ from odoo.addons.survey.controllers import main from odoo.http import request +from odoo import http class Survey(main.Survey): + + @http.route(['/survey_event/get_events_from_product'], type='json', auth="public", methods=['POST']) + def get_events_from_product(self, product_id, **kw): + tickets = request.env['event.event.ticket'].sudo().search([('product_id','=',product_id)]) + events = set([ticket.event_id for ticket in tickets]) + return [{'id':event.id,'name':event.name} for event in events] + + def _prepare_survey_data(self, survey_sudo, answer_sudo, **post): result = super(Survey, self)._prepare_survey_data(survey_sudo, answer_sudo, **post) result['event_products'] = request.env['product.product'].sudo().search([('detailed_type','=','event')]) diff --git a/survey_event_registration_generation/models/survey_user_input.py b/survey_event_registration_generation/models/survey_user_input.py index faada9d..eb241f0 100644 --- a/survey_event_registration_generation/models/survey_user_input.py +++ b/survey_event_registration_generation/models/survey_user_input.py @@ -40,7 +40,10 @@ class SurveyUserInput(models.Model): Save event product to user_input.line """ vals = self._get_line_answer_values(question, answer, question.question_type) - vals['value_event_product'] = int(vals['value_event_product']) + if 'value_event_product' in vals and vals['value_event_product'].isnumeric(): + vals['value_event_product'] = int(vals['value_event_product']) + else: + vals['value_event_product'] = 0 if old_answers: old_answers.write(vals) return old_answers @@ -52,7 +55,10 @@ class SurveyUserInput(models.Model): Save event to user_input.line """ vals = self._get_line_answer_values(question, answer, question.question_type) - vals['value_event'] = int(vals['value_event']) + if 'value_event' in vals and vals['value_event'].isnumeric(): + vals['value_event'] = int(vals['value_event']) + else: + vals['value_event'] = 0 if old_answers: old_answers.write(vals) return old_answers diff --git a/survey_event_registration_generation/static/src/js/survey_form.js b/survey_event_registration_generation/static/src/js/survey_form.js index cc5d0a4..a9662d5 100644 --- a/survey_event_registration_generation/static/src/js/survey_form.js +++ b/survey_event_registration_generation/static/src/js/survey_form.js @@ -2,6 +2,11 @@ odoo.define('survey_event_registration_generation.survey.form', function (requir 'use strict'; var SurveyFormWidget = require('survey.form'); +var ajax = require('web.ajax'); +var core = require('web.core'); + +var _t = core._t; +var _lt = core._lt; SurveyFormWidget.include({ @@ -18,7 +23,45 @@ SurveyFormWidget.include({ return result; }, - + + _onChangeChoiceItem: function (event) { + var event_select = $('select[data-question-type="event"]:visible') + + //Check if event product selection change + if ($(event.currentTarget).data('questionType') == 'event_product') { + //Check if event selection visible + if (event_select) { + //Disable event selection + event_select.prop('disabled', 'disabled'); + + //Get event product id + var eventProductId = parseInt($(event.currentTarget).find(":selected").val()) + + //Ajax : get new events + ajax.jsonRpc('/survey_event/get_events_from_product', 'call', { + 'product_id': eventProductId, + }).then((new_events) => { + // Delete old events + $(event_select).find('option').remove() + + $(event_select).append(new Option(_t('Please select...'))) + + //Populate new events + for (var i in new_events) { + $(event_select).append(new Option(new_events[i].name, new_events[i].id)) + } + + //Enable event selection + event_select.prop('disabled', false); + }); + + } + } + + + var result = this._super.apply(this, arguments); + return result; + } }) }); diff --git a/survey_event_registration_generation/views/survey_templates.xml b/survey_event_registration_generation/views/survey_templates.xml index f1df3da..3d95181 100644 --- a/survey_event_registration_generation/views/survey_templates.xml +++ b/survey_event_registration_generation/views/survey_templates.xml @@ -15,8 +15,12 @@