[IMP] website_event_track_quiz: improve ux for quizzes on tracks

Right now, if we want to add a quiz to the event track, we need to
create it from the m2o field available in the form view. But it is
not very intuitive as user will have to select 'Create and Edit'
option from the m2o drop-down. Quick create is not really helpful
here. Also, trying to add question for the quiz will pile up the
modals which looks messy.

With this commit, in the event track's form view, we:

 - Remove the m2o for `quiz_id` (from the track form view, not from model)
 - Introduce "Add Quiz" header button, which redirects user to form view
   of the quiz, with no option to create new quiz directly as only one quiz
   should be linked to quiz. Also, once the quiz is added, this button will
   be hidden.
 - Introduce new stat button "Go to Quiz", which redirects user to the form
   view of quiz (again, does not allow creation from the same reason). This
   button is visible only if the quiz is already added for the track.

Apart from that,  re-arrage the quiz form view  `event_quiz_view_form` by
putting 'Event' and 'Event Track' fields on the same line, and we utilize
the same view while creating / updating quiz from the track.

Note:

Since the creation of quiz is now done in its own form view (with action button
"Add Quiz" from track's form view), we are passing the default `event_track_id`
while creating the quiz. It means that we don't need to compute it anymore.
Instead, now we need to compute the `quiz_id` on the track, based on the
`event_track_id` field alreay set on the quiz.

So, we introduce new One2Many `quiz_ids` field to compute the `quiz_id` on the
track, and we remove `event_track_ids` from the quiz. Basically, the logic of
setting `quiz_id` (on the track) and `event_track_id` (on the quiz) is inverted
with the commit, and the demo data is updated accordinlgy.

TaskID-2486552

closes odoo/odoo#70067

Related: odoo/upgrade#2522
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
aaj-odoo
2021-06-24 04:34:39 +00:00
committed by Dharmraj Jhala
parent fdd86433c6
commit 0c6ce6cf44
5 changed files with 59 additions and 41 deletions
@@ -3,6 +3,7 @@
<record id="event_7_track_1_quiz" model="event.quiz">
<field name="name">What This Event Is All About</field>
<field name="event_track_id" ref="website_event_track.event_7_track_1"/>
</record>
<record id="event_7_track_1_question_0" model="event.quiz.question">
@@ -48,12 +49,9 @@
<field name="question_id" ref="event_7_track_1_question_1"/>
</record>
<record id="website_event_track.event_7_track_1" model="event.track">
<field name="quiz_id" ref="website_event_track_quiz.event_7_track_1_quiz"/>
</record>
<record id="event_7_track_5_quiz" model="event.quiz">
<field name="name">Securing your Lumber during transport</field>
<field name="event_track_id" ref="website_event_track.event_7_track_5"/>
</record>
<record id="event_7_track_5_question_0" model="event.quiz.question">
@@ -99,12 +97,9 @@
<field name="question_id" ref="event_7_track_5_question_1"/>
</record>
<record id="website_event_track.event_7_track_5" model="event.track">
<field name="quiz_id" ref="website_event_track_quiz.event_7_track_5_quiz"/>
</record>
<record id="event_7_track_13_quiz" model="event.quiz">
<field name="name">Pretty. Ugly. Lovely.</field>
<field name="event_track_id" ref="website_event_track.event_7_track_13"/>
</record>
<record id="event_7_track_13_question_0" model="event.quiz.question">
@@ -132,9 +127,6 @@
<field name="question_id" ref="event_7_track_13_question_0"/>
</record>
<record id="website_event_track.event_7_track_13" model="event.track">
<field name="quiz_id" ref="website_event_track_quiz.event_7_track_13_quiz"/>
</record>
<record id="event.event_7" model="event.event">
<field name="community_menu" eval="True"/>
</record>
@@ -11,19 +11,11 @@ class Quiz(models.Model):
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_track_id = fields.Many2one('event.track', readonly=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"
@@ -8,11 +8,17 @@ 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_id = fields.Many2one('event.quiz', string="Quiz", compute='_compute_quiz_id', store=True, groups="event.group_event_user")
quiz_ids = fields.One2many('event.quiz', 'event_track_id', string="Quizzes")
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_ids.event_track_id')
def _compute_quiz_id(self):
for track in self:
track.quiz_id = track.quiz_ids[0] if track.quiz_ids else False
@api.depends('quiz_id.question_ids')
def _compute_quiz_questions_count(self):
for track in self:
@@ -64,3 +70,31 @@ class EventTrack(models.Model):
else:
track.is_quiz_completed = False
track.quiz_points = 0
def action_add_quiz(self):
self.ensure_one()
event_quiz_form = self.env.ref('website_event_track_quiz.event_quiz_view_form')
return {
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'event.quiz',
'view_id': event_quiz_form.id,
'context': {
'default_event_track_id': self.id,
'create': False,
},
}
def action_view_quiz(self):
self.ensure_one()
event_quiz_form = self.env.ref('website_event_track_quiz.event_quiz_view_form')
return {
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'event.quiz',
'res_id' : self.quiz_id.id,
'view_id': event_quiz_form.id,
'context': {
'create': False,
}
}
@@ -39,10 +39,14 @@
placeholder="e.g. Test your Knowledge"/>
</h1>
<group>
<field name="event_track_id"/>
<field name="event_id"/>
<group>
<field name="event_id"/>
</group>
<group>
<field name="event_track_id"/>
</group>
</group>
<group name="questions" string="Questions">
<group name="questions">
<field name="question_ids" nolabel="1"
context="{
'tree_view_ref': 'website_event_track_quiz.event_quiz_question_view_tree_from_quiz',
@@ -54,17 +58,6 @@
</field>
</record>
<record id="event_quiz_view_form_from_track" model="ir.ui.view">
<field name="name">event.quiz.view.form</field>
<field name="model">event.quiz</field>
<field name="inherit_id" ref="website_event_track_quiz.event_quiz_view_form"/>
<field name="mode">primary</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='event_track_id']" position="replace"></xpath>
<xpath expr="//field[@name='event_id']" position="replace"></xpath>
</field>
</record>
<record id="event_quiz_action" model="ir.actions.act_window">
<field name="name">Event Quizzes</field>
<field name="res_model">event.quiz</field>
@@ -5,12 +5,19 @@
<field name="model">event.track</field>
<field name="inherit_id" ref="website_event_track.view_event_track_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='event_track_cta_group']" position="after">
<group name="event_track_quiz_group">
<field name="quiz_id"
context="{'form_view_ref': 'website_event_track_quiz.event_quiz_view_form_from_track'}"/>
</group>
</xpath>
<field name='stage_id' position="before">
<field name="quiz_id" invisible="1"/>
<button name="action_add_quiz"
type="object" class="btn btn-primary" string="Add Quiz"
attrs="{'invisible': [('quiz_id', '!=', False)]}" >
</button>
</field>
<field name='is_published' position="before">
<button name="action_view_quiz" type="object" class="oe_stat_button"
string="Go to Quiz" icon="fa-question-circle" widget="stat_info"
attrs="{'invisible': [('quiz_id', '=', False)]}">
</button>
</field>
</field>
</record>
</odoo>