mirror of
https://github.com/bringout/oca-ocb-hr.git
synced 2026-04-27 08:31:58 +02:00
19.0 vanilla
This commit is contained in:
parent
a1137a1456
commit
e1d89e11e3
2789 changed files with 1093187 additions and 605897 deletions
|
|
@ -1,6 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import hr_employee
|
||||
from . import hr_employee_public
|
||||
from . import hr_resume_line
|
||||
from . import slide_channel
|
||||
|
|
|
|||
|
|
@ -4,22 +4,27 @@
|
|||
from odoo import api, fields, models, _
|
||||
|
||||
|
||||
class Employee(models.Model):
|
||||
class HrEmployee(models.Model):
|
||||
_inherit = 'hr.employee'
|
||||
|
||||
subscribed_courses = fields.Many2many('slide.channel', related='user_partner_id.slide_channel_ids')
|
||||
has_subscribed_courses = fields.Boolean(compute='_compute_courses_completion_text')
|
||||
courses_completion_text = fields.Char(compute="_compute_courses_completion_text")
|
||||
|
||||
@api.depends_context('lang')
|
||||
@api.depends('subscribed_courses', 'user_partner_id.slide_channel_completed_ids')
|
||||
def _compute_courses_completion_text(self):
|
||||
for employee in self:
|
||||
if not employee.user_partner_id:
|
||||
employee.courses_completion_text = False
|
||||
employee.has_subscribed_courses = False
|
||||
continue
|
||||
total_completed_courses = len(employee.user_partner_id.slide_channel_completed_ids)
|
||||
total = len(employee.subscribed_courses)
|
||||
employee.courses_completion_text = _("%(completed)s / %(total)s",
|
||||
completed=total_completed_courses,
|
||||
total=len(employee.subscribed_courses))
|
||||
total=total)
|
||||
employee.has_subscribed_courses = total > 0
|
||||
|
||||
def action_open_courses(self):
|
||||
self.ensure_one()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class HrEmployeePublic(models.Model):
|
||||
_inherit = 'hr.employee.public'
|
||||
|
||||
has_subscribed_courses = fields.Boolean(related='employee_id.has_subscribed_courses')
|
||||
courses_completion_text = fields.Char(related='employee_id.courses_completion_text')
|
||||
|
||||
def action_open_courses(self):
|
||||
self.ensure_one()
|
||||
if self.is_user:
|
||||
return self.employee_id.action_open_courses()
|
||||
|
|
@ -4,17 +4,38 @@
|
|||
from odoo import fields, models, api
|
||||
|
||||
|
||||
class ResumeLine(models.Model):
|
||||
class HrResumeLine(models.Model):
|
||||
_inherit = 'hr.resume.line'
|
||||
|
||||
display_type = fields.Selection(selection_add=[('course', 'Course')])
|
||||
channel_id = fields.Many2one('slide.channel', string="Course", readonly=True)
|
||||
course_url = fields.Char(compute="_compute_course_url", default=False)
|
||||
channel_id = fields.Many2one(
|
||||
'slide.channel', string="eLearning Course", compute='_compute_channel_id',
|
||||
store=True, readonly=True, index='btree_not_null'
|
||||
)
|
||||
course_url = fields.Char(related='channel_id.website_absolute_url')
|
||||
duration = fields.Integer(string="Duration", compute='_compute_duration', readonly=False, store=True)
|
||||
course_type = fields.Selection(
|
||||
selection_add=[('elearning', 'eLearning')],
|
||||
ondelete={'elearning': 'cascade'}
|
||||
)
|
||||
|
||||
@api.depends('channel_id')
|
||||
def _compute_course_url(self):
|
||||
for line in self:
|
||||
if line.display_type == 'course':
|
||||
line.course_url = line.channel_id.website_url
|
||||
else:
|
||||
line.course_url = False
|
||||
def _compute_duration(self):
|
||||
for resume_line in self:
|
||||
resume_line.duration = resume_line.channel_id.total_time
|
||||
|
||||
@api.onchange('channel_id')
|
||||
def _onchange_channel_id(self):
|
||||
if not self.name and self.channel_id:
|
||||
self.name = self.channel_id.name
|
||||
|
||||
@api.depends('course_type')
|
||||
def _compute_channel_id(self):
|
||||
for resume_line in self:
|
||||
if resume_line.course_type != 'elearning':
|
||||
resume_line.channel_id = False
|
||||
|
||||
def _compute_color(self):
|
||||
super()._compute_color()
|
||||
for resume_line in self:
|
||||
if resume_line.course_type == 'elearning':
|
||||
resume_line.color = '#00a5b7'
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from markupsafe import Markup
|
||||
|
||||
from odoo import fields, models, _
|
||||
from odoo.tools import html2plaintext
|
||||
|
||||
|
|
@ -8,60 +9,76 @@ from odoo.tools import html2plaintext
|
|||
class SlideChannelPartner(models.Model):
|
||||
_inherit = 'slide.channel.partner'
|
||||
|
||||
def _recompute_completion(self):
|
||||
res = super(SlideChannelPartner, self)._recompute_completion()
|
||||
def _post_completion_update_hook(self, completed=True):
|
||||
res = super()._post_completion_update_hook(completed)
|
||||
if not completed:
|
||||
return res
|
||||
completed_membership = self.filtered(lambda m: m.member_status == 'completed')
|
||||
if not completed_membership:
|
||||
return res
|
||||
partner_has_completed = {
|
||||
channel_partner.partner_id.id: channel_partner.channel_id for channel_partner in self
|
||||
if channel_partner.completed}
|
||||
membership.partner_id.id: membership.channel_id
|
||||
for membership in completed_membership
|
||||
}
|
||||
employees = self.env['hr.employee'].sudo().search(
|
||||
[('user_id.partner_id', 'in', list(partner_has_completed.keys()))])
|
||||
[('user_id.partner_id', 'in', completed_membership.partner_id.ids)])
|
||||
|
||||
if employees:
|
||||
HrResumeLine = self.env['hr.resume.line'].sudo()
|
||||
line_type = self.env.ref('hr_skills_slides.resume_type_training', raise_if_not_found=False)
|
||||
line_type = self.env.ref('hr_skills.resume_type_training', raise_if_not_found=False)
|
||||
line_type_id = line_type and line_type.id
|
||||
|
||||
lines_for_channel_by_employee = dict(HrResumeLine._read_group([
|
||||
('employee_id', 'in', employees.ids),
|
||||
('channel_id', 'in', completed_membership.channel_id.ids),
|
||||
('line_type_id', '=', line_type_id)
|
||||
], ['employee_id'], ['channel_id:array_agg']))
|
||||
|
||||
lines_to_create = []
|
||||
for employee in employees:
|
||||
channel = partner_has_completed[employee.user_id.partner_id.id]
|
||||
|
||||
already_added = HrResumeLine.search([
|
||||
("employee_id", "in", employees.ids),
|
||||
("channel_id", "=", channel.id),
|
||||
("line_type_id", "=", line_type_id),
|
||||
("display_type", "=", "course")
|
||||
])
|
||||
|
||||
if not already_added:
|
||||
HrResumeLine.create({
|
||||
if channel.id not in lines_for_channel_by_employee.get(employee, []):
|
||||
lines_to_create.append({
|
||||
'employee_id': employee.id,
|
||||
'name': channel.name,
|
||||
'date_start': fields.Date.today(),
|
||||
'date_end': fields.Date.today(),
|
||||
'description': html2plaintext(channel.description),
|
||||
'line_type_id': line_type_id,
|
||||
'display_type': 'course',
|
||||
'channel_id': channel.id
|
||||
'course_type': 'elearning',
|
||||
'channel_id': channel.id,
|
||||
})
|
||||
if lines_to_create:
|
||||
HrResumeLine.create(lines_to_create)
|
||||
return res
|
||||
|
||||
def _send_completed_mail(self):
|
||||
super()._send_completed_mail()
|
||||
for scp in self:
|
||||
if self.env.user.employee_ids:
|
||||
msg = _('The employee has completed the course <a href="%(link)s">%(course)s</a>',
|
||||
link=scp.channel_id.website_url,
|
||||
course=scp.channel_id.name)
|
||||
msg = _('The employee has completed the course %s',
|
||||
Markup('<a href="%(link)s">%(course)s</a>') % {
|
||||
'link': scp.channel_id.website_absolute_url,
|
||||
'course': scp.channel_id.name,
|
||||
})
|
||||
self.env.user.employee_id.message_post(body=msg)
|
||||
|
||||
class Channel(models.Model):
|
||||
|
||||
class SlideChannel(models.Model):
|
||||
_inherit = 'slide.channel'
|
||||
|
||||
def _action_add_members(self, target_partners, **member_values):
|
||||
res = super()._action_add_members(target_partners, **member_values)
|
||||
for channel in self:
|
||||
channel._message_employee_chatter(
|
||||
_('The employee subscribed to the course <a href="%(link)s">%(course)s</a>', link=channel.website_url, course=channel.name),
|
||||
target_partners)
|
||||
def _action_add_members(self, target_partners, member_status='joined', raise_on_access=False):
|
||||
res = super()._action_add_members(target_partners, member_status=member_status, raise_on_access=raise_on_access)
|
||||
if member_status == 'joined':
|
||||
for channel in self:
|
||||
channel._message_employee_chatter(
|
||||
_('The employee subscribed to the course %s',
|
||||
Markup('<a href="%(link)s">%(course)s</a>') % {
|
||||
'link': channel.website_absolute_url,
|
||||
'course': channel.name
|
||||
}),
|
||||
target_partners
|
||||
)
|
||||
return res
|
||||
|
||||
def _remove_membership(self, partner_ids):
|
||||
|
|
@ -71,7 +88,11 @@ class Channel(models.Model):
|
|||
|
||||
for channel in self:
|
||||
channel._message_employee_chatter(
|
||||
_('The employee left the course <a href="%(link)s">%(course)s</a>', link=channel.website_url, course=channel.name),
|
||||
_('The employee left the course %s',
|
||||
Markup('<a href="%(link)s">%(course)s</a>') % {
|
||||
'link': channel.website_absolute_url,
|
||||
'course': channel.name,
|
||||
}),
|
||||
partners)
|
||||
return res
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue