78 lines
3.3 KiB
Python
78 lines
3.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import _, api, fields, models
|
|
from odoo.exceptions import UserError
|
|
|
|
class EventEvent(models.Model):
|
|
_name = "event.event"
|
|
_inherit = "event.event"
|
|
|
|
lead_ids = fields.One2many(
|
|
'crm.lead', 'event_id', string="Leads", groups='sales_team.group_sale_salesman',
|
|
help="Leads generated from this event")
|
|
lead_count = fields.Integer(
|
|
string="# Leads", compute='_compute_lead_count', groups='sales_team.group_sale_salesman')
|
|
has_lead_request = fields.Boolean(
|
|
"Ongoing Generation Request", compute="_compute_has_lead_request", compute_sudo=True,
|
|
help="Set to True when a Lead Generation Request is currently running.")
|
|
|
|
@api.depends('registration_ids')
|
|
def _compute_has_lead_request(self):
|
|
lead_requests_data = self.env['event.lead.request']._read_group(
|
|
[('event_id', 'in', self.ids)],
|
|
['event_id'], ['__count'],
|
|
)
|
|
mapped_data = {event.id: count for event, count in lead_requests_data}
|
|
for event in self:
|
|
event.has_lead_request = mapped_data.get(event.id, 0) != 0
|
|
|
|
@api.depends('lead_ids')
|
|
def _compute_lead_count(self):
|
|
lead_data = self.env['crm.lead']._read_group(
|
|
[('event_id', 'in', self.ids)],
|
|
['event_id'], ['__count'],
|
|
)
|
|
mapped_data = {event.id: count for event, count in lead_data}
|
|
for event in self:
|
|
event.lead_count = mapped_data.get(event.id, 0)
|
|
|
|
def action_generate_leads(self):
|
|
""" Re-generate leads based on event.lead.rules.
|
|
The method is ran synchronously if there is a low amount of registrations, otherwise it
|
|
goes through a CRON job that runs in batches. """
|
|
|
|
if not self.env.user.has_group('event.group_event_manager'):
|
|
raise UserError(_("Only Event Managers are allowed to re-generate all leads."))
|
|
|
|
self.ensure_one()
|
|
registrations_count = self.env['event.registration'].search_count([
|
|
('event_id', '=', self.id),
|
|
('state', 'not in', ['draft', 'cancel']),
|
|
])
|
|
|
|
if registrations_count <= self.env['event.lead.request']._REGISTRATIONS_BATCH_SIZE:
|
|
leads = self.env['event.registration'].search([
|
|
('event_id', '=', self.id),
|
|
('state', 'not in', ['draft', 'cancel']),
|
|
])._apply_lead_generation_rules()
|
|
if leads:
|
|
notification = _("Yee-ha, %(leads_count)s Leads have been created!", leads_count=len(leads))
|
|
else:
|
|
notification = _("Aww! No Leads created, check your Lead Generation Rules and try again.")
|
|
else:
|
|
self.env['event.lead.request'].sudo().create({'event_id': self.id})
|
|
self.env.ref('event_crm.ir_cron_generate_leads')._trigger()
|
|
notification = _("Got it! We've noted your request. Your leads will be created soon!")
|
|
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'type': 'info',
|
|
'sticky': False,
|
|
'message': notification,
|
|
'next': {'type': 'ir.actions.act_window_close'}, # force a form reload
|
|
}
|
|
}
|