survey_scoring_extended/models/survey_user_input.py
2026-05-15 17:34:29 +07:00

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