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()