event_track.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. # -*- coding: utf-8 -*-
  2. # Part of Odoo. See LICENSE file for full copyright and licensing details.
  3. from odoo import api, fields, models
  4. from odoo.osv import expression
  5. class EventTrack(models.Model):
  6. _inherit = ['event.track']
  7. quiz_id = fields.Many2one('event.quiz', string="Quiz", compute='_compute_quiz_id', store=True, groups="event.group_event_user")
  8. quiz_ids = fields.One2many('event.quiz', 'event_track_id', string="Quizzes")
  9. quiz_questions_count = fields.Integer(string="# Quiz Questions", compute='_compute_quiz_questions_count', groups="event.group_event_user")
  10. is_quiz_completed = fields.Boolean('Is Quiz Done', compute='_compute_quiz_data')
  11. quiz_points = fields.Integer('Quiz Points', compute='_compute_quiz_data')
  12. @api.depends('quiz_ids.event_track_id')
  13. def _compute_quiz_id(self):
  14. for track in self:
  15. track.quiz_id = track.quiz_ids[0] if track.quiz_ids else False
  16. @api.depends('quiz_id.question_ids')
  17. def _compute_quiz_questions_count(self):
  18. for track in self:
  19. track.quiz_questions_count = len(track.quiz_id.question_ids)
  20. @api.depends('quiz_id', 'event_track_visitor_ids.visitor_id',
  21. 'event_track_visitor_ids.partner_id', 'event_track_visitor_ids.quiz_completed',
  22. 'event_track_visitor_ids.quiz_points')
  23. @api.depends_context('uid')
  24. def _compute_quiz_data(self):
  25. tracks_quiz = self.filtered(lambda track: track.quiz_id)
  26. (self - tracks_quiz).is_quiz_completed = False
  27. (self - tracks_quiz).quiz_points = 0
  28. if tracks_quiz:
  29. current_visitor = self.env['website.visitor']._get_visitor_from_request(force_create=False)
  30. if self.env.user._is_public() and not current_visitor:
  31. for track in tracks_quiz:
  32. track.is_quiz_completed = False
  33. track.quiz_points = 0
  34. else:
  35. if self.env.user._is_public():
  36. domain = [('visitor_id', '=', current_visitor.id)]
  37. elif current_visitor:
  38. domain = [
  39. '|',
  40. ('partner_id', '=', self.env.user.partner_id.id),
  41. ('visitor_id', '=', current_visitor.id)
  42. ]
  43. else:
  44. domain = [('partner_id', '=', self.env.user.partner_id.id)]
  45. event_track_visitors = self.env['event.track.visitor'].sudo().search_read(
  46. expression.AND([
  47. domain,
  48. [('track_id', 'in', tracks_quiz.ids)]
  49. ]), fields=['track_id', 'quiz_completed', 'quiz_points']
  50. )
  51. quiz_visitor_map = {
  52. track_visitor['track_id'][0]: {
  53. 'quiz_completed': track_visitor['quiz_completed'],
  54. 'quiz_points': track_visitor['quiz_points']
  55. } for track_visitor in event_track_visitors
  56. }
  57. for track in tracks_quiz:
  58. if quiz_visitor_map.get(track.id):
  59. track.is_quiz_completed = quiz_visitor_map[track.id]['quiz_completed']
  60. track.quiz_points = quiz_visitor_map[track.id]['quiz_points']
  61. else:
  62. track.is_quiz_completed = False
  63. track.quiz_points = 0
  64. def action_add_quiz(self):
  65. self.ensure_one()
  66. event_quiz_form = self.env.ref('website_event_track_quiz.event_quiz_view_form')
  67. return {
  68. 'type': 'ir.actions.act_window',
  69. 'view_mode': 'form',
  70. 'res_model': 'event.quiz',
  71. 'view_id': event_quiz_form.id,
  72. 'context': {
  73. 'default_event_track_id': self.id,
  74. 'create': False,
  75. },
  76. }
  77. def action_view_quiz(self):
  78. self.ensure_one()
  79. event_quiz_form = self.env.ref('website_event_track_quiz.event_quiz_view_form')
  80. return {
  81. 'type': 'ir.actions.act_window',
  82. 'view_mode': 'form',
  83. 'res_model': 'event.quiz',
  84. 'res_id' : self.quiz_id.id,
  85. 'view_id': event_quiz_form.id,
  86. 'context': {
  87. 'create': False,
  88. }
  89. }