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.

161 lines
5.3 KiB

  1. import logging
  2. import itertools
  3. from odoo import models, fields, api, _
  4. from odoo.osv.expression import normalize_domain, AND
  5. from odoo.tools import email_normalize_all
  6. _logger = logging.getLogger(__name__)
  7. class ResPartner(models.Model):
  8. _inherit = "res.partner"
  9. answer_count = fields.Integer(
  10. string="Sent survey count",
  11. compute="_compute_answer_count",
  12. compute_sudo=True,
  13. )
  14. answer_done_count = fields.Integer(
  15. string="Completed sent survey count",
  16. compute="_compute_answer_count",
  17. compute_sudo=True,
  18. )
  19. answer_done_ratio = fields.Integer(
  20. string="Completed sent survey ratio",
  21. compute="_compute_answer_count",
  22. compute_sudo=True,
  23. )
  24. # COMPUTES
  25. @api.depends("email")
  26. def _compute_answer_count(self):
  27. default_vals = {
  28. "answer_count": 0,
  29. "answer_done_count": 0,
  30. "answer_done_ratio": 0,
  31. }
  32. stats = dict((pid, default_vals) for pid in self.ids)
  33. read_group_res = (
  34. self.env["survey.user_input"]
  35. .sudo()
  36. ._read_group(
  37. [
  38. ("invite_token", "!=", False),
  39. ("partner_id", "in", self.ids),
  40. ],
  41. ["partner_id", "state"],
  42. ["partner_id", "state"],
  43. lazy=False,
  44. )
  45. )
  46. _logger.info(read_group_res)
  47. for item in read_group_res:
  48. stats[item["partner_id"][0]]["answer_count"] += item["__count"]
  49. if item["state"] == "done":
  50. stats[item["partner_id"][0]]["answer_done_count"] += item["__count"]
  51. for partner_stats in stats.values():
  52. partner_stats["answer_done_ratio"] = round(
  53. (
  54. partner_stats["answer_done_count"]
  55. / (partner_stats["answer_count"] or 1)
  56. )
  57. * 100,
  58. 0,
  59. )
  60. for partner in self:
  61. partner.update(stats.get(partner._origin.id, default_vals))
  62. # def _count_survey_input(self):
  63. # UserInput = self.env["survey.user_input"]
  64. # partners_survey = UserInput
  65. # in_onchange = self.env.context.get("in_onchange", False)
  66. # origin = in_onchange and self._origin or False
  67. # if in_onchange:
  68. # domain = [
  69. # ("partner_id", "=", self._origin.id),
  70. # "|",
  71. # ("invite_token", "!=", False),
  72. # ("state", "=", "dones"),
  73. # ]
  74. # if self.email:
  75. # domain = ["|", ("email", "=", self.email)] + domain
  76. # partners_survey = UserInput.search(domain)
  77. # else:
  78. # partners_survey = UserInput.search(
  79. # [
  80. # "|",
  81. # ("partner_id", "in", self.ids),
  82. # ("email", "in", self.filtered("email").mapped("email")),
  83. # "|",
  84. # ("invite_token", "!=", False),
  85. # ("state", "=", "done"),
  86. # ]
  87. # )
  88. # for partner in self:
  89. # done = partners_survey.filtered(
  90. # lambda sui: (
  91. # sui.partner_id == (origin or partner)
  92. # or partner.email
  93. # and sui.email == partner.email
  94. # )
  95. # and sui.state == "done"
  96. # )
  97. # link = partners_survey.filtered(
  98. # lambda sui: (
  99. # sui.partner_id == (origin or partner)
  100. # or partner.email
  101. # and sui.email == partner.email
  102. # )
  103. # and sui.invite_token
  104. # )
  105. # partner.answer_count = len(link)
  106. # partner.answer_done_all = len(done)
  107. # partner.answer_done_count = len(link & done)
  108. # @api.depends("answer_done_count", "answer_count")
  109. # def _get_answer_done_ratio(self):
  110. # for survey in self:
  111. # if survey.answer_count == 0:
  112. # survey.answer_done_ratio = 0
  113. # else:
  114. # survey.answer_done_ratio = int(
  115. # round(100 * survey.answer_done_count / survey.answer_count, 0)
  116. # )
  117. # ACTIONS
  118. def action_survey_user_input(self):
  119. self.ensure_one()
  120. action = self.env["ir.actions.act_window"]._for_xml_id(
  121. "survey.action_survey_user_input"
  122. )
  123. action["display_name"] += _(" from {}").format(self.display_name)
  124. # manage domain to filter on the good partner
  125. domain = action.get("domain") or list()
  126. if isinstance(domain, str):
  127. domain = eval(domain)
  128. if len(domain) > 1:
  129. domain = AND(
  130. [
  131. ["|", ("partner_id", "=", self.id), ("email", "ilike", self.email)],
  132. normalize_domain(domain),
  133. ]
  134. )
  135. else:
  136. domain = ["|", ("partner_id", "=", self.id), ("email", "ilike", self.email)]
  137. action["domain"] = domain
  138. # return updated action
  139. return action
  140. # ONCHANGES
  141. @api.onchange("email")
  142. def onchange_email(self):
  143. self.ensure_one()
  144. if isinstance(self._origin.id, int):
  145. self.with_context(in_onchange=True)._compute_answer_count()