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.
161 lines
5.3 KiB
161 lines
5.3 KiB
import logging
|
|
import itertools
|
|
|
|
from odoo import models, fields, api, _
|
|
from odoo.osv.expression import normalize_domain, AND
|
|
from odoo.tools import email_normalize_all
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ResPartner(models.Model):
|
|
_inherit = "res.partner"
|
|
|
|
answer_count = fields.Integer(
|
|
string="Sent survey count",
|
|
compute="_compute_answer_count",
|
|
compute_sudo=True,
|
|
)
|
|
answer_done_count = fields.Integer(
|
|
string="Completed sent survey count",
|
|
compute="_compute_answer_count",
|
|
compute_sudo=True,
|
|
)
|
|
answer_done_ratio = fields.Integer(
|
|
string="Completed sent survey ratio",
|
|
compute="_compute_answer_count",
|
|
compute_sudo=True,
|
|
)
|
|
|
|
# COMPUTES
|
|
|
|
@api.depends("email")
|
|
def _compute_answer_count(self):
|
|
default_vals = {
|
|
"answer_count": 0,
|
|
"answer_done_count": 0,
|
|
"answer_done_ratio": 0,
|
|
}
|
|
stats = dict((pid, default_vals) for pid in self.ids)
|
|
read_group_res = (
|
|
self.env["survey.user_input"]
|
|
.sudo()
|
|
._read_group(
|
|
[
|
|
("invite_token", "!=", False),
|
|
("partner_id", "in", self.ids),
|
|
],
|
|
["partner_id", "state"],
|
|
["partner_id", "state"],
|
|
lazy=False,
|
|
)
|
|
)
|
|
|
|
_logger.info(read_group_res)
|
|
for item in read_group_res:
|
|
stats[item["partner_id"][0]]["answer_count"] += item["__count"]
|
|
if item["state"] == "done":
|
|
stats[item["partner_id"][0]]["answer_done_count"] += item["__count"]
|
|
|
|
for partner_stats in stats.values():
|
|
partner_stats["answer_done_ratio"] = round(
|
|
(
|
|
partner_stats["answer_done_count"]
|
|
/ (partner_stats["answer_count"] or 1)
|
|
)
|
|
* 100,
|
|
0,
|
|
)
|
|
|
|
for partner in self:
|
|
partner.update(stats.get(partner._origin.id, default_vals))
|
|
|
|
# def _count_survey_input(self):
|
|
# UserInput = self.env["survey.user_input"]
|
|
# partners_survey = UserInput
|
|
# in_onchange = self.env.context.get("in_onchange", False)
|
|
# origin = in_onchange and self._origin or False
|
|
# if in_onchange:
|
|
# domain = [
|
|
# ("partner_id", "=", self._origin.id),
|
|
# "|",
|
|
# ("invite_token", "!=", False),
|
|
# ("state", "=", "dones"),
|
|
# ]
|
|
# if self.email:
|
|
# domain = ["|", ("email", "=", self.email)] + domain
|
|
# partners_survey = UserInput.search(domain)
|
|
# else:
|
|
# partners_survey = UserInput.search(
|
|
# [
|
|
# "|",
|
|
# ("partner_id", "in", self.ids),
|
|
# ("email", "in", self.filtered("email").mapped("email")),
|
|
# "|",
|
|
# ("invite_token", "!=", False),
|
|
# ("state", "=", "done"),
|
|
# ]
|
|
# )
|
|
# for partner in self:
|
|
# done = partners_survey.filtered(
|
|
# lambda sui: (
|
|
# sui.partner_id == (origin or partner)
|
|
# or partner.email
|
|
# and sui.email == partner.email
|
|
# )
|
|
# and sui.state == "done"
|
|
# )
|
|
# link = partners_survey.filtered(
|
|
# lambda sui: (
|
|
# sui.partner_id == (origin or partner)
|
|
# or partner.email
|
|
# and sui.email == partner.email
|
|
# )
|
|
# and sui.invite_token
|
|
# )
|
|
# partner.answer_count = len(link)
|
|
# partner.answer_done_all = len(done)
|
|
# partner.answer_done_count = len(link & done)
|
|
|
|
# @api.depends("answer_done_count", "answer_count")
|
|
# def _get_answer_done_ratio(self):
|
|
# for survey in self:
|
|
# if survey.answer_count == 0:
|
|
# survey.answer_done_ratio = 0
|
|
# else:
|
|
# survey.answer_done_ratio = int(
|
|
# round(100 * survey.answer_done_count / survey.answer_count, 0)
|
|
# )
|
|
|
|
# ACTIONS
|
|
|
|
def action_survey_user_input(self):
|
|
self.ensure_one()
|
|
action = self.env["ir.actions.act_window"]._for_xml_id(
|
|
"survey.action_survey_user_input"
|
|
)
|
|
action["display_name"] += _(" from {}").format(self.display_name)
|
|
# manage domain to filter on the good partner
|
|
domain = action.get("domain") or list()
|
|
if isinstance(domain, str):
|
|
domain = eval(domain)
|
|
if len(domain) > 1:
|
|
domain = AND(
|
|
[
|
|
["|", ("partner_id", "=", self.id), ("email", "ilike", self.email)],
|
|
normalize_domain(domain),
|
|
]
|
|
)
|
|
else:
|
|
domain = ["|", ("partner_id", "=", self.id), ("email", "ilike", self.email)]
|
|
action["domain"] = domain
|
|
# return updated action
|
|
return action
|
|
|
|
# ONCHANGES
|
|
|
|
@api.onchange("email")
|
|
def onchange_email(self):
|
|
self.ensure_one()
|
|
if isinstance(self._origin.id, int):
|
|
self.with_context(in_onchange=True)._compute_answer_count()
|