summaryrefslogtreecommitdiff
path: root/addons/website_event_questions/models/event_question.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/website_event_questions/models/event_question.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_event_questions/models/event_question.py')
-rw-r--r--addons/website_event_questions/models/event_question.py65
1 files changed, 65 insertions, 0 deletions
diff --git a/addons/website_event_questions/models/event_question.py b/addons/website_event_questions/models/event_question.py
new file mode 100644
index 00000000..4d058569
--- /dev/null
+++ b/addons/website_event_questions/models/event_question.py
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models, _
+from odoo.exceptions import UserError
+
+
+class EventQuestion(models.Model):
+ _name = 'event.question'
+ _rec_name = 'title'
+ _order = 'sequence,id'
+ _description = 'Event Question'
+
+ title = fields.Char(required=True, translate=True)
+ question_type = fields.Selection([
+ ('simple_choice', 'Selection'),
+ ('text_box', 'Text Input')], default='simple_choice', string="Question Type", required=True)
+ event_type_id = fields.Many2one('event.type', 'Event Type', ondelete='cascade')
+ event_id = fields.Many2one('event.event', 'Event', ondelete='cascade')
+ answer_ids = fields.One2many('event.question.answer', 'question_id', "Answers", copy=True)
+ sequence = fields.Integer(default=10)
+ once_per_order = fields.Boolean('Ask only once per order',
+ help="If True, this question will be asked only once and its value will be propagated to every attendees."
+ "If not it will be asked for every attendee of a reservation.")
+
+ @api.constrains('event_type_id', 'event_id')
+ def _constrains_event(self):
+ if any(question.event_type_id and question.event_id for question in self):
+ raise UserError(_('Question cannot belong to both the event category and itself.'))
+
+ def write(self, vals):
+ """ We add a check to prevent changing the question_type of a question that already has answers.
+ Indeed, it would mess up the event.registration.answer (answer type not matching the question type). """
+
+ if 'question_type' in vals:
+ questions_new_type = self.filtered(lambda question: question.question_type != vals['question_type'])
+ if questions_new_type:
+ answer_count = self.env['event.registration.answer'].search_count([('question_id', 'in', questions_new_type.ids)])
+ if answer_count > 0:
+ raise UserError(_("You cannot change the question type of a question that already has answers!"))
+ return super(EventQuestion, self).write(vals)
+
+ def action_view_question_answers(self):
+ """ Allow analyzing the attendees answers to event questions in a convenient way:
+ - A graph view showing counts of each suggestions for simple_choice questions
+ (Along with secondary pivot and tree views)
+ - A tree view showing textual answers values for text_box questions. """
+ self.ensure_one()
+ action = self.env["ir.actions.actions"]._for_xml_id("website_event_questions.action_event_registration_report")
+ action['domain'] = [('question_id', '=', self.id)]
+ if self.question_type == 'simple_choice':
+ action['views'] = [(False, 'graph'), (False, 'pivot'), (False, 'tree')]
+ elif self.question_type == 'text_box':
+ action['views'] = [(False, 'tree')]
+ return action
+
+class EventQuestionAnswer(models.Model):
+ """ Contains suggested answers to a 'simple_choice' event.question. """
+ _name = 'event.question.answer'
+ _order = 'sequence,id'
+ _description = 'Event Question Answer'
+
+ name = fields.Char('Answer', required=True, translate=True)
+ question_id = fields.Many2one('event.question', required=True, ondelete='cascade')
+ sequence = fields.Integer(default=10)