[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:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user