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.
118 lines
4.0 KiB
118 lines
4.0 KiB
from odoo import models, fields, api, _
|
|
from odoo.osv.expression import normalize_domain, AND
|
|
|
|
|
|
class ResPartner(models.Model):
|
|
_inherit = "res.partner"
|
|
|
|
tot_sent_survey = fields.Integer("Sent survey count", compute="_count_survey_input")
|
|
tot_comp_survey = fields.Integer(
|
|
"Completed survey count", compute="_count_survey_input"
|
|
)
|
|
tot_sent_comp_survey = fields.Integer(
|
|
"Completed sent survey count", compute="_count_survey_input"
|
|
)
|
|
sent_comp_ratio = fields.Integer(
|
|
string="Completed sent survey ratio", compute="_get_sent_comp_ratio"
|
|
)
|
|
|
|
# COMPUTES
|
|
|
|
@api.multi
|
|
def _count_survey_input(self):
|
|
UserInput = self.env["survey.user_input"]
|
|
partners_survey = UserInput
|
|
in_onchange = self.env.in_onchange
|
|
origin = in_onchange and self._origin or False
|
|
if in_onchange:
|
|
domain = [
|
|
("partner_id", "=", self._origin.id),
|
|
"|",
|
|
("type", "=", "link"),
|
|
("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")),
|
|
"|",
|
|
("type", "=", "link"),
|
|
("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.type == "link"
|
|
)
|
|
partner.tot_sent_survey = len(link)
|
|
partner.tot_comp_survey = len(done)
|
|
partner.tot_sent_comp_survey = len(link & done)
|
|
|
|
@api.depends("tot_sent_comp_survey", "tot_sent_survey")
|
|
def _get_sent_comp_ratio(self):
|
|
for survey in self:
|
|
if survey.tot_sent_survey == 0:
|
|
survey.sent_comp_ratio = 0
|
|
else:
|
|
survey.sent_comp_ratio = int(
|
|
round(100 * survey.tot_sent_comp_survey / survey.tot_sent_survey, 0)
|
|
)
|
|
|
|
# ACTIONS
|
|
|
|
@api.multi
|
|
def action_survey_user_input(self):
|
|
self.ensure_one()
|
|
action = self.env.ref("survey.action_survey_user_input").read()[0]
|
|
action["display_name"] += _(" from {}").format(self.display_name)
|
|
# manage context
|
|
ctx = dict(self.env.context)
|
|
link_only = ctx.pop("link_only", False)
|
|
action["context"] = ctx
|
|
# manage domain
|
|
domain = action.get("domain") or []
|
|
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)]
|
|
if link_only:
|
|
if len(domain) > 1:
|
|
domain = AND([[("type", "=", "link")], normalize_domain(domain)])
|
|
else:
|
|
domain = [("type", "=", "link")]
|
|
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._count_survey_input()
|