Files
enterprise-addons/hr_referral/models/hr_job.py
T

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',
}