Odoo modules related to surveys
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

95 lines
3.4 KiB

from odoo import models, fields, api, _
from odoo.osv.expression import normalize_domain, AND
class SurveySurvey(models.Model):
_inherit = "survey.survey"
answer_start_count = fields.Integer(
"Started answer count", compute="_compute_answer_statistics"
)
answer_start_ratio = fields.Integer(
string="Started answer ratio", compute="_compute_answer_statistics"
)
answer_done_ratio = fields.Integer(
string="Completed answer ratio", compute="_compute_answer_statistics"
)
# COMPUTES
def _compute_answer_statistics(self):
default_vals = {
"answer_count": 0,
"answer_start_count": 0,
"answer_done_count": 0,
"answer_start_ratio": 0,
"answer_done_ratio": 0,
}
stat = dict((sid, default_vals) for sid in self.ids)
UserInput = self.env["survey.user_input"]
base_domain = [
("survey_id", "in", self.ids),
("invite_token", "!=", False),
]
read_group_res = UserInput._read_group(
base_domain,
["survey_id", "state"],
["survey_id", "state"],
lazy=False,
)
for item in read_group_res:
stat[item["survey_id"][0]]["answer_count"] += item["__count"]
if item["state"] in ["in_progress", "done"]:
stat[item["survey_id"][0]]["answer_start_count"] += item["__count"]
if item["state"] == "done":
stat[item["survey_id"][0]]["answer_done_count"] += item["__count"]
for survey_stats in stat.values():
survey_stats["answer_start_ratio"] = (
survey_stats["answer_start_count"]
/ (survey_stats["answer_count"] or 1)
* 100
)
survey_stats["answer_done_ratio"] = (
survey_stats["answer_done_count"]
/ (survey_stats["answer_count"] or 1)
* 100
)
for survey in self:
survey.update(stat.get(survey._origin.id, default_vals))
@api.depends("answer_start_count", "answer_count")
def _get_answer_start_ratio(self):
for survey in self:
survey.answer_start_ratio = int(
round(100 * (survey.answer_start_count) / (survey.answer_count or 1), 0)
)
@api.depends("answer_done_count", "answer_count")
def _get_answer_done_ratio(self):
for survey in self:
survey.answer_done_ratio = int(
round(100 * survey.answer_done_count / (survey.answer_count or 1), 0)
)
# ACTIONS
def action_survey_user_input(self):
ctx = dict(self.env.context)
search_done = ctx.get("search_default_completed", None)
action = super(SurveySurvey, self).action_survey_user_input()
if ctx.get("search_default_shared_invite", False):
action["display_name"] += _(" (shared)")
if search_done is not None:
act_ctx = action.get("context") or dict()
if isinstance(act_ctx, str):
act_ctx = eval(act_ctx)
if "search_default_completed" in act_ctx and bool(
act_ctx["search_default_completed"]
) is not bool(search_done):
act_ctx["search_default_completed"] = int(bool(search_done))
action["context"] = act_ctx
return action