52 lines
2.6 KiB
Python
52 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
from odoo import api, fields, models
|
|
|
|
class SurveyUserInput(models.Model):
|
|
_inherit = 'survey.user_input'
|
|
|
|
scoring_formula = fields.Selection(related='survey_id.scoring_formula')
|
|
scoring_average = fields.Float("Average Score", compute='_compute_scoring_values', store=True)
|
|
|
|
@api.depends('user_input_line_ids.answer_score', 'user_input_line_ids.question_id', 'predefined_question_ids.answer_score', 'survey_id.scoring_formula')
|
|
def _compute_scoring_values(self):
|
|
super()._compute_scoring_values()
|
|
for user_input in self:
|
|
# Re-calculate total_possible_score to include scale questions
|
|
scored_questions = user_input.predefined_question_ids.filtered(lambda q: q.is_scored_question)
|
|
|
|
# Recalculate max possible score (sum of max points for each scored question)
|
|
new_max = 0
|
|
for question in scored_questions:
|
|
if question.question_type == 'scale':
|
|
new_max += question.scale_max * question.scale_multiplier
|
|
elif question.question_type == 'simple_choice':
|
|
new_max += max([score for score in question.mapped('suggested_answer_ids.answer_score') if score > 0], default=0)
|
|
elif question.question_type == 'multiple_choice':
|
|
new_max += sum(score for score in question.mapped('suggested_answer_ids.answer_score') if score > 0)
|
|
else:
|
|
new_max += question.answer_score
|
|
|
|
# Calculate total score obtained
|
|
total_score = sum(user_input.user_input_line_ids.mapped('answer_score'))
|
|
|
|
# Update fields
|
|
user_input.scoring_total = total_score
|
|
user_input.scoring_average = total_score / (len(scored_questions) or 1)
|
|
|
|
if new_max > 0:
|
|
user_input.scoring_percentage = round((total_score / new_max) * 100, 2)
|
|
else:
|
|
user_input.scoring_percentage = 0
|
|
|
|
class SurveyUserInputLine(models.Model):
|
|
_inherit = 'survey.user_input.line'
|
|
|
|
@api.depends('answer_type', 'value_text_box', 'value_numerical_box', 'value_date', 'value_datetime', 'value_scale',
|
|
'suggested_answer_id', 'user_input_id')
|
|
def _compute_answer_score(self):
|
|
super()._compute_answer_score()
|
|
for line in self:
|
|
if line.answer_type == 'scale' and line.question_id.is_scored_question:
|
|
line.answer_score = line.value_scale * line.question_id.scale_multiplier
|
|
line.answer_is_correct = True # Scale answers are considered "correct" if they provide points
|