summaryrefslogtreecommitdiff
path: root/addons/website_event_track_quiz/models
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_track_quiz/models
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_event_track_quiz/models')
-rw-r--r--addons/website_event_track_quiz/models/__init__.py7
-rw-r--r--addons/website_event_track_quiz/models/event_event.py19
-rw-r--r--addons/website_event_track_quiz/models/event_quiz.py71
-rw-r--r--addons/website_event_track_quiz/models/event_track.py66
-rw-r--r--addons/website_event_track_quiz/models/event_track_visitor.py12
5 files changed, 175 insertions, 0 deletions
diff --git a/addons/website_event_track_quiz/models/__init__.py b/addons/website_event_track_quiz/models/__init__.py
new file mode 100644
index 00000000..07848823
--- /dev/null
+++ b/addons/website_event_track_quiz/models/__init__.py
@@ -0,0 +1,7 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import event_event
+from . import event_track
+from . import event_track_visitor
+from . import event_quiz
diff --git a/addons/website_event_track_quiz/models/event_event.py b/addons/website_event_track_quiz/models/event_event.py
new file mode 100644
index 00000000..9ef2a289
--- /dev/null
+++ b/addons/website_event_track_quiz/models/event_event.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models
+
+
+class Event(models.Model):
+ _inherit = "event.event"
+
+ @api.depends("event_type_id", "website_menu", "community_menu")
+ def _compute_community_menu(self):
+ """ At type onchange: synchronize. At website_menu update: synchronize. """
+ for event in self:
+ if event.event_type_id and event.event_type_id != event._origin.event_type_id:
+ event.community_menu = event.event_type_id.community_menu
+ elif event.website_menu and (event.website_menu != event._origin.website_menu or not event.community_menu):
+ event.community_menu = True
+ elif not event.website_menu:
+ event.community_menu = False
diff --git a/addons/website_event_track_quiz/models/event_quiz.py b/addons/website_event_track_quiz/models/event_quiz.py
new file mode 100644
index 00000000..8ba65f70
--- /dev/null
+++ b/addons/website_event_track_quiz/models/event_quiz.py
@@ -0,0 +1,71 @@
+# -*- 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 ValidationError
+
+
+class Quiz(models.Model):
+ _name = "event.quiz"
+ _description = "Quiz"
+
+ name = fields.Char('Name', required=True, translate=True)
+ question_ids = fields.One2many('event.quiz.question', 'quiz_id', string="Questions")
+ event_track_ids = fields.One2many('event.track', 'quiz_id', string="Tracks")
+ event_track_id = fields.Many2one(
+ 'event.track', compute='_compute_event_track_id',
+ readonly=True, store=True)
+ event_id = fields.Many2one(
+ 'event.event', related='event_track_id.event_id',
+ readonly=True, store=True)
+
+ @api.depends('event_track_ids.quiz_id')
+ def _compute_event_track_id(self):
+ for quiz in self:
+ quiz.event_track_id = quiz.event_track_ids[0] if quiz.event_track_ids else False
+
+
+class QuizQuestion(models.Model):
+ _name = "event.quiz.question"
+ _description = "Content Quiz Question"
+ _order = "quiz_id, sequence, id"
+
+ name = fields.Char("Question", required=True, translate=True)
+ sequence = fields.Integer("Sequence")
+ quiz_id = fields.Many2one("event.quiz", "Quiz", required=True, ondelete='cascade')
+ awarded_points = fields.Integer("Number of Points", compute='_compute_awarded_points')
+ answer_ids = fields.One2many('event.quiz.answer', 'question_id', string="Answer")
+
+ @api.depends('answer_ids.awarded_points')
+ def _compute_awarded_points(self):
+ for question in self:
+ question.awarded_points = sum(question.answer_ids.mapped('awarded_points'))
+
+ @api.constrains('answer_ids')
+ def _check_answers_integrity(self):
+ for question in self:
+ if len(question.answer_ids.filtered(lambda answer: answer.awarded_points)) != 1:
+ raise ValidationError(_('Question "%s" must have 1 correct answer', question.name))
+ if len(question.answer_ids) < 2:
+ raise ValidationError(_('Question "%s" must have 1 correct answer and at least 1 incorrect answer', question.name))
+
+
+class QuizAnswer(models.Model):
+ _name = "event.quiz.answer"
+ _rec_name = "text_value"
+ _description = "Question's Answer"
+ _order = 'question_id, sequence, id'
+
+ sequence = fields.Integer("Sequence")
+ question_id = fields.Many2one('event.quiz.question', string="Question", required=True, ondelete='cascade')
+ text_value = fields.Char("Answer", required=True, translate=True)
+ is_correct = fields.Boolean("Is correct answer", compute='_compute_is_correct')
+ comment = fields.Text("Comment", translate=True,
+ help='''This comment will be displayed to the user if he selects this answer, after submitting the quiz.
+ It is used as a small informational text helping to understand why this answer is correct / incorrect.''')
+ awarded_points = fields.Integer('Number of Points')
+
+ @api.depends('awarded_points')
+ def _compute_is_correct(self):
+ for answer in self:
+ answer.is_correct = bool(answer.awarded_points)
diff --git a/addons/website_event_track_quiz/models/event_track.py b/addons/website_event_track_quiz/models/event_track.py
new file mode 100644
index 00000000..3011b98a
--- /dev/null
+++ b/addons/website_event_track_quiz/models/event_track.py
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models
+from odoo.osv import expression
+
+
+class EventTrack(models.Model):
+ _inherit = ['event.track']
+
+ quiz_id = fields.Many2one('event.quiz', string="Quiz", groups="event.group_event_user")
+ quiz_questions_count = fields.Integer(string="# Quiz Questions", compute='_compute_quiz_questions_count', groups="event.group_event_user")
+ is_quiz_completed = fields.Boolean('Is Quiz Done', compute='_compute_quiz_data')
+ quiz_points = fields.Integer('Quiz Points', compute='_compute_quiz_data')
+
+ @api.depends('quiz_id.question_ids')
+ def _compute_quiz_questions_count(self):
+ for track in self:
+ track.quiz_questions_count = len(track.quiz_id.question_ids)
+
+ @api.depends('quiz_id', 'event_track_visitor_ids.visitor_id',
+ 'event_track_visitor_ids.partner_id', 'event_track_visitor_ids.quiz_completed',
+ 'event_track_visitor_ids.quiz_points')
+ @api.depends_context('uid')
+ def _compute_quiz_data(self):
+ tracks_quiz = self.filtered(lambda track: track.quiz_id)
+ (self - tracks_quiz).is_quiz_completed = False
+ (self - tracks_quiz).quiz_points = 0
+ if tracks_quiz:
+ current_visitor = self.env['website.visitor']._get_visitor_from_request(force_create=False)
+ if self.env.user._is_public() and not current_visitor:
+ for track in tracks_quiz:
+ track.is_quiz_completed = False
+ track.quiz_points = 0
+ else:
+ if self.env.user._is_public():
+ domain = [('visitor_id', '=', current_visitor.id)]
+ elif current_visitor:
+ domain = [
+ '|',
+ ('partner_id', '=', self.env.user.partner_id.id),
+ ('visitor_id', '=', current_visitor.id)
+ ]
+ else:
+ domain = [('partner_id', '=', self.env.user.partner_id.id)]
+
+ event_track_visitors = self.env['event.track.visitor'].sudo().search_read(
+ expression.AND([
+ domain,
+ [('track_id', 'in', tracks_quiz.ids)]
+ ]), fields=['track_id', 'quiz_completed', 'quiz_points']
+ )
+
+ quiz_visitor_map = {
+ track_visitor['track_id'][0]: {
+ 'quiz_completed': track_visitor['quiz_completed'],
+ 'quiz_points': track_visitor['quiz_points']
+ } for track_visitor in event_track_visitors
+ }
+ for track in tracks_quiz:
+ if quiz_visitor_map.get(track.id):
+ track.is_quiz_completed = quiz_visitor_map[track.id]['quiz_completed']
+ track.quiz_points = quiz_visitor_map[track.id]['quiz_points']
+ else:
+ track.is_quiz_completed = False
+ track.quiz_points = 0
diff --git a/addons/website_event_track_quiz/models/event_track_visitor.py b/addons/website_event_track_quiz/models/event_track_visitor.py
new file mode 100644
index 00000000..73376504
--- /dev/null
+++ b/addons/website_event_track_quiz/models/event_track_visitor.py
@@ -0,0 +1,12 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models
+
+
+class TrackVisitor(models.Model):
+ _name = 'event.track.visitor'
+ _inherit = ['event.track.visitor']
+
+ quiz_completed = fields.Boolean('Completed')
+ quiz_points = fields.Integer("Quiz Points", default=0)