Description of the issue/feature this PR addresses: It is currently quite difficult to differentiate users. Most of the time, people don't take the time to upload an actual avatar so everybody looks the same. This PR generates a custom avatar with the users initials and random color to differentiate them. For res.users, res.partner and hr.employee, image fields now hold the binary image and avatar are used to show the image or svg. Current behavior before PR: Avatar had only random colors and was being saved in database, being inefficient Desired behavior after PR is merged: A new mixin defines image fields and in case no image is set, it generates an SVG image with the user's initials and random color. closes odoo/odoo#69819 Task: 2404630 Related: odoo/enterprise#18199 Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
70 lines
3.4 KiB
Python
70 lines
3.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models, tools
|
|
|
|
|
|
class HrEmployeePublic(models.Model):
|
|
_name = "hr.employee.public"
|
|
_inherit = ["hr.employee.base"]
|
|
_description = 'Public Employee'
|
|
_order = 'name'
|
|
_auto = False
|
|
_log_access = True # Include magic fields
|
|
|
|
# Fields coming from hr.employee.base
|
|
create_date = fields.Datetime(readonly=True)
|
|
name = fields.Char(readonly=True)
|
|
active = fields.Boolean(readonly=True)
|
|
department_id = fields.Many2one(readonly=True)
|
|
job_id = fields.Many2one(readonly=True)
|
|
job_title = fields.Char(readonly=True)
|
|
company_id = fields.Many2one(readonly=True)
|
|
address_id = fields.Many2one(readonly=True)
|
|
mobile_phone = fields.Char(readonly=True)
|
|
work_phone = fields.Char(readonly=True)
|
|
work_email = fields.Char(readonly=True)
|
|
work_location_id = fields.Many2one(readonly=True)
|
|
user_id = fields.Many2one(readonly=True)
|
|
resource_id = fields.Many2one(readonly=True)
|
|
resource_calendar_id = fields.Many2one(readonly=True)
|
|
tz = fields.Selection(readonly=True)
|
|
color = fields.Integer(readonly=True)
|
|
employee_type = fields.Selection(readonly=True)
|
|
|
|
employee_id = fields.Many2one('hr.employee', 'Employee', compute="_compute_employee_id", search="_search_employee_id", compute_sudo=True)
|
|
# hr.employee.public specific fields
|
|
child_ids = fields.One2many('hr.employee.public', 'parent_id', string='Direct subordinates', readonly=True)
|
|
image_1920 = fields.Image("Image", related='employee_id.image_1920', compute_sudo=True)
|
|
image_1024 = fields.Image("Image 1024", related='employee_id.image_1024', compute_sudo=True)
|
|
image_512 = fields.Image("Image 512", related='employee_id.image_512', compute_sudo=True)
|
|
image_256 = fields.Image("Image 256", related='employee_id.image_256', compute_sudo=True)
|
|
image_128 = fields.Image("Image 128", related='employee_id.image_128', compute_sudo=True)
|
|
avatar_1920 = fields.Image("Avatar", related='employee_id.avatar_1920', compute_sudo=True)
|
|
avatar_1024 = fields.Image("Avatar 1024", related='employee_id.avatar_1024', compute_sudo=True)
|
|
avatar_512 = fields.Image("Avatar 512", related='employee_id.avatar_512', compute_sudo=True)
|
|
avatar_256 = fields.Image("Avatar 256", related='employee_id.avatar_256', compute_sudo=True)
|
|
avatar_128 = fields.Image("Avatar 128", related='employee_id.avatar_128', compute_sudo=True)
|
|
parent_id = fields.Many2one('hr.employee.public', 'Manager', readonly=True)
|
|
coach_id = fields.Many2one('hr.employee.public', 'Coach', readonly=True)
|
|
user_partner_id = fields.Many2one(related='user_id.partner_id', related_sudo=False, string="User's partner")
|
|
|
|
def _search_employee_id(self, operator, value):
|
|
return [('id', operator, value)]
|
|
|
|
def _compute_employee_id(self):
|
|
for employee in self:
|
|
employee.employee_id = self.env['hr.employee'].browse(employee.id)
|
|
|
|
@api.model
|
|
def _get_fields(self):
|
|
return ','.join('emp.%s' % name for name, field in self._fields.items() if field.store and field.type not in ['many2many', 'one2many'])
|
|
|
|
def init(self):
|
|
tools.drop_view_if_exists(self.env.cr, self._table)
|
|
self.env.cr.execute("""CREATE or REPLACE VIEW %s as (
|
|
SELECT
|
|
%s
|
|
FROM hr_employee emp
|
|
)""" % (self._table, self._get_fields()))
|