144 lines
6.2 KiB
Python
144 lines
6.2 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import fields, models, _
|
|
|
|
|
|
class HrJob(models.Model):
|
|
_inherit = "hr.job"
|
|
|
|
job_open_date = fields.Date('Job Start Recruitment Date', default=fields.Date.today(),
|
|
groups="hr.group_hr_user,hr_recruitment.group_hr_recruitment_user") # never use ?
|
|
utm_campaign_id = fields.Many2one('utm.campaign', 'Campaign', ondelete='restrict')
|
|
max_points = fields.Integer(compute='_compute_max_points')
|
|
direct_clicks = fields.Integer(compute='_compute_clicks')
|
|
facebook_clicks = fields.Integer(compute='_compute_clicks')
|
|
twitter_clicks = fields.Integer("X Clicks", compute='_compute_clicks')
|
|
linkedin_clicks = fields.Integer(compute='_compute_clicks')
|
|
|
|
def _compute_clicks(self):
|
|
if self.env.user.utm_source_id:
|
|
grouped_data = self.env['link.tracker']._read_group([
|
|
('source_id', '=', self.env.user.utm_source_id.id),
|
|
('campaign_id', 'in', self.mapped('utm_campaign_id').ids),
|
|
('medium_id', '!=', False),
|
|
], ['campaign_id', 'medium_id'], ['count:sum'])
|
|
else:
|
|
grouped_data = {}
|
|
medium_direct = self.env.ref('utm.utm_medium_direct', raise_if_not_found=False)
|
|
medium_facebook = self.env.ref('utm.utm_medium_facebook', raise_if_not_found=False)
|
|
medium_twitter = self.env.ref('utm.utm_medium_twitter', raise_if_not_found=False)
|
|
medium_linkedin = self.env.ref('utm.utm_medium_linkedin', raise_if_not_found=False)
|
|
mapped_data = {job.utm_campaign_id.id: {} for job in self}
|
|
for campaign, medium, count in grouped_data:
|
|
mapped_data[campaign.id][medium.id] = count
|
|
for job in self:
|
|
data = mapped_data[job.utm_campaign_id.id]
|
|
job.direct_clicks = data.get(medium_direct.id, 0) if medium_direct else 0
|
|
job.facebook_clicks = data.get(medium_facebook.id, 0) if medium_facebook else 0
|
|
job.twitter_clicks = data.get(medium_twitter.id, 0) if medium_twitter else 0
|
|
job.linkedin_clicks = data.get(medium_linkedin.id, 0) if medium_linkedin else 0
|
|
|
|
def _compute_max_points(self):
|
|
for job in self:
|
|
stages = self.env['hr.recruitment.stage'].search([('use_in_referral', '=', True), '|', ('job_ids', '=', False), ('job_ids', '=', job.id)])
|
|
job.max_points = sum(stages.mapped('points'))
|
|
|
|
def search_or_create_referral_links(self, users=None, channel='direct'):
|
|
'''
|
|
Create/Retrieve a referral link for each user in the given channel.
|
|
|
|
This method is made to retrieve/create a referral link for each user
|
|
for one job.
|
|
|
|
:param User users: the users for which to retrieve/create the
|
|
referral links. If not given, the current user is used.
|
|
:param str channel: the channel to use for the referral links.
|
|
Default to 'direct'.
|
|
:returns: a dictionary mapping each user to its referral link.
|
|
:rtype: dict
|
|
'''
|
|
|
|
# checks and defaults
|
|
self.ensure_one()
|
|
chanel_to_medium = {
|
|
'direct': 'utm.utm_medium_direct',
|
|
'facebook': 'utm.utm_medium_facebook',
|
|
'twitter': 'utm.utm_medium_twitter',
|
|
'linkedin': 'utm.utm_medium_linkedin',
|
|
}
|
|
if channel not in chanel_to_medium:
|
|
return {}
|
|
medium = self.env.ref(chanel_to_medium[channel], raise_if_not_found=False)
|
|
if not medium:
|
|
return {}
|
|
if users is None:
|
|
users = self.env.user
|
|
elif not users:
|
|
return {}
|
|
users._ensure_utm_source()
|
|
if not self.utm_campaign_id:
|
|
self.utm_campaign_id = self.env['utm.campaign'].create([{'name': self.name}])
|
|
|
|
referral_links_by_user = {}
|
|
trackers = self.env['link.tracker'].search([
|
|
('url', '=', self.full_url),
|
|
('campaign_id', '=', self.utm_campaign_id.id),
|
|
('medium_id', '=', medium.id),
|
|
('source_id', 'in', users.utm_source_id.ids),
|
|
])
|
|
trackers_by_source_id = {tracker.source_id: tracker for tracker in trackers}
|
|
trackers_to_create = []
|
|
user_without_tracker = []
|
|
for user in users:
|
|
tracker = trackers_by_source_id.get(user.utm_source_id)
|
|
if tracker:
|
|
referral_links_by_user[user] = tracker.short_url
|
|
else:
|
|
user_without_tracker.append(user)
|
|
trackers_to_create.append({
|
|
'url': self.full_url,
|
|
'title': _('Referral %(user)s: %(job_url)s', user=user, job_url=self.full_url),
|
|
'campaign_id': self.utm_campaign_id.id,
|
|
'medium_id': medium.id,
|
|
'source_id': user.utm_source_id.id,
|
|
})
|
|
LinkTrackers = self.env['link.tracker']
|
|
if not LinkTrackers.has_access('create') and\
|
|
self.env.user.has_group('hr_recruitment.group_hr_recruitment_manager'):
|
|
LinkTrackers = LinkTrackers.sudo()
|
|
|
|
new_trackers = LinkTrackers.create(trackers_to_create)
|
|
for tracker, user in zip(new_trackers, user_without_tracker):
|
|
referral_links_by_user[user] = tracker.short_url
|
|
|
|
return referral_links_by_user
|
|
|
|
def set_recruit(self): # never use ??
|
|
self.write({'job_open_date': fields.Date.today()})
|
|
return super().set_recruit()
|
|
|
|
def get_referral_link(self, channel):
|
|
self.ensure_one()
|
|
wizard = self.env['hr.referral.link.to.share'].create({'job_id': self.id, 'channel': channel})
|
|
return wizard.url
|
|
|
|
def action_share_external(self):
|
|
self.ensure_one()
|
|
wizard = self.env['hr.referral.link.to.share'].create({'job_id': self.id})
|
|
return {
|
|
'name': _("Visit Webpage"),
|
|
'type': 'ir.actions.act_url',
|
|
'url': wizard.url,
|
|
'target': 'new',
|
|
}
|
|
|
|
def action_referral_campaign(self):
|
|
self.ensure_one()
|
|
return {
|
|
'name': _("Referral Campaign for %(job)s", job=self.name),
|
|
'type': 'ir.actions.act_window',
|
|
'res_model': 'hr.referral.campaign.wizard',
|
|
'view_mode': 'form',
|
|
'target': 'new',
|
|
}
|