# -*- 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