diff --git a/addons/account/views/account_move_views.xml b/addons/account/views/account_move_views.xml index 855ced734d6..3ec79858fc6 100644 --- a/addons/account/views/account_move_views.xml +++ b/addons/account/views/account_move_views.xml @@ -111,7 +111,7 @@
- +
diff --git a/addons/account/views/account_portal_templates.xml b/addons/account/views/account_portal_templates.xml index 89f42cb6f7f..66e338a39f6 100644 --- a/addons/account/views/account_portal_templates.xml +++ b/addons/account/views/account_portal_templates.xml @@ -118,8 +118,7 @@
- Contact - Contact + Contact
diff --git a/addons/calendar/static/tests/calendar_tests.js b/addons/calendar/static/tests/calendar_tests.js index 004e9b7ad65..1e6f5ddd8f1 100644 --- a/addons/calendar/static/tests/calendar_tests.js +++ b/addons/calendar/static/tests/calendar_tests.js @@ -79,7 +79,7 @@ QUnit.module('calendar', { "should have img tag"); assert.hasAttrValue(form.$('.o_field_many2manytags.avatar.o_field_widget .badge:first img'), 'data-src', - '/web/image/partner/1/image_128', + '/web/image/partner/1/avatar_128', "should have correct avatar image"); form.destroy(); diff --git a/addons/calendar/views/calendar_views.xml b/addons/calendar/views/calendar_views.xml index e0cc7cd0544..4c63dd10ab6 100644 --- a/addons/calendar/views/calendar_views.xml +++ b/addons/calendar/views/calendar_views.xml @@ -277,7 +277,7 @@ - + diff --git a/addons/crm/views/crm_lead_views.xml b/addons/crm/views/crm_lead_views.xml index 4a7c45ad514..fd1dd63ad54 100644 --- a/addons/crm/views/crm_lead_views.xml +++ b/addons/crm/views/crm_lead_views.xml @@ -428,7 +428,7 @@ - + @@ -498,7 +498,7 @@
- +
diff --git a/addons/event/views/event_views.xml b/addons/event/views/event_views.xml index e044df6f0ff..0becfb2abc4 100644 --- a/addons/event/views/event_views.xml +++ b/addons/event/views/event_views.xml @@ -408,7 +408,7 @@ - + diff --git a/addons/fleet/views/fleet_vehicle_cost_views.xml b/addons/fleet/views/fleet_vehicle_cost_views.xml index 2bcacb48796..f9de45c7464 100644 --- a/addons/fleet/views/fleet_vehicle_cost_views.xml +++ b/addons/fleet/views/fleet_vehicle_cost_views.xml @@ -167,7 +167,7 @@
- +
diff --git a/addons/gamification/views/badge.xml b/addons/gamification/views/badge.xml index 72418eb0cd9..6193548c091 100644 --- a/addons/gamification/views/badge.xml +++ b/addons/gamification/views/badge.xml @@ -148,7 +148,7 @@
- Owner + Owner
diff --git a/addons/gamification/views/challenge.xml b/addons/gamification/views/challenge.xml index a0876987ee1..b028ccb3391 100644 --- a/addons/gamification/views/challenge.xml +++ b/addons/gamification/views/challenge.xml @@ -156,7 +156,7 @@
- Member + Member
diff --git a/addons/gamification/views/goal.xml b/addons/gamification/views/goal.xml index 13e64236f15..fef7cbfead3 100644 --- a/addons/gamification/views/goal.xml +++ b/addons/gamification/views/goal.xml @@ -153,7 +153,7 @@

- +
diff --git a/addons/hr/data/hr_data.xml b/addons/hr/data/hr_data.xml index e3a3da5370a..94d72d10471 100644 --- a/addons/hr/data/hr_data.xml +++ b/addons/hr/data/hr_data.xml @@ -14,7 +14,6 @@ Administrator admin@example.com - private diff --git a/addons/hr/models/hr_employee.py b/addons/hr/models/hr_employee.py index e55763eae27..f524a42aaaf 100644 --- a/addons/hr/models/hr_employee.py +++ b/addons/hr/models/hr_employee.py @@ -10,9 +10,8 @@ from dateutil.relativedelta import relativedelta from odoo import api, fields, models, _ from odoo.osv.query import Query from odoo.exceptions import ValidationError, AccessError -from odoo.modules.module import get_module_resource -from odoo.tools.misc import format_date from odoo.osv import expression +from odoo.tools.misc import format_date class HrEmployeePrivate(models.Model): @@ -26,7 +25,7 @@ class HrEmployeePrivate(models.Model): _name = "hr.employee" _description = "Employee" _order = 'name' - _inherit = ['hr.employee.base', 'mail.thread', 'mail.activity.mixin', 'resource.mixin', 'image.mixin'] + _inherit = ['hr.employee.base', 'mail.thread', 'mail.activity.mixin', 'resource.mixin', 'avatar.mixin'] _mail_post_access = 'read' # resource and user @@ -100,7 +99,6 @@ class HrEmployeePrivate(models.Model): km_home_work = fields.Integer(string="Home-Work Distance", groups="hr.group_hr_user", tracking=True) job_id = fields.Many2one(tracking=True) - image_1920 = fields.Image() phone = fields.Char(related='address_home_id.phone', related_sudo=False, readonly=False, string="Private Phone", groups="hr.group_hr_user") # employee in company child_ids = fields.One2many('hr.employee', 'parent_id', string='Direct subordinates') @@ -125,11 +123,35 @@ class HrEmployeePrivate(models.Model): ('user_uniq', 'unique (user_id, company_id)', "A user cannot be linked to multiple employees in the same company.") ] - def _get_placeholder_filename(self, field=None): - image_fields = ['image_%s' % size for size in [1920, 1024, 512, 256, 128]] - if field in image_fields: - return 'hr/static/src/img/default_image.png' - return super()._get_placeholder_filename(field=field) + @api.depends('name', 'user_id.avatar_1920', 'image_1920') + def _compute_avatar_1920(self): + super()._compute_avatar_1920() + + @api.depends('name', 'user_id.avatar_1024', 'image_1024') + def _compute_avatar_1024(self): + super()._compute_avatar_1024() + + @api.depends('name', 'user_id.avatar_512', 'image_512') + def _compute_avatar_512(self): + super()._compute_avatar_512() + + @api.depends('name', 'user_id.avatar_256', 'image_256') + def _compute_avatar_256(self): + super()._compute_avatar_256() + + @api.depends('name', 'user_id.avatar_128', 'image_128') + def _compute_avatar_128(self): + super()._compute_avatar_128() + + def _compute_avatar(self, avatar_field, image_field): + for employee in self: + avatar = employee[image_field] + if not avatar: + if employee.user_id: + avatar = employee.user_id[avatar_field] + else: + avatar = employee._avatar_get_placeholder() + employee[avatar_field] = avatar def name_get(self): if self.check_access_rights('read', raise_exception=False): diff --git a/addons/hr/models/hr_employee_public.py b/addons/hr/models/hr_employee_public.py index 9e9ad926032..505711b06ef 100644 --- a/addons/hr/models/hr_employee_public.py +++ b/addons/hr/models/hr_employee_public.py @@ -32,26 +32,29 @@ class HrEmployeePublic(models.Model): 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("Original Image", compute='_compute_image', compute_sudo=True) - image_1024 = fields.Image("Image 1024", compute='_compute_image', compute_sudo=True) - image_512 = fields.Image("Image 512", compute='_compute_image', compute_sudo=True) - image_256 = fields.Image("Image 256", compute='_compute_image', compute_sudo=True) - image_128 = fields.Image("Image 128", compute='_compute_image', compute_sudo=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 _compute_image(self): + def _search_employee_id(self, operator, value): + return [('id', operator, value)] + + def _compute_employee_id(self): for employee in self: - # We have to be in sudo to have access to the images - employee_id = self.sudo().env['hr.employee'].browse(employee.id) - employee.image_1920 = employee_id.image_1920 - employee.image_1024 = employee_id.image_1024 - employee.image_512 = employee_id.image_512 - employee.image_256 = employee_id.image_256 - employee.image_128 = employee_id.image_128 + employee.employee_id = self.env['hr.employee'].browse(employee.id) @api.model def _get_fields(self): diff --git a/addons/hr/report/hr_employee_badge.xml b/addons/hr/report/hr_employee_badge.xml index 0668f54608d..98f01955757 100644 --- a/addons/hr/report/hr_employee_badge.xml +++ b/addons/hr/report/hr_employee_badge.xml @@ -26,7 +26,7 @@ - Employee Image + Employee Image diff --git a/addons/hr/static/tests/m2x_avatar_employee_tests.js b/addons/hr/static/tests/m2x_avatar_employee_tests.js index 99bd0097d59..f1787312b87 100644 --- a/addons/hr/static/tests/m2x_avatar_employee_tests.js +++ b/addons/hr/static/tests/m2x_avatar_employee_tests.js @@ -156,10 +156,10 @@ QUnit.module('hr', {}, function () { assert.strictEqual(kanban.$('.o_kanban_record').text().trim(), ''); assert.containsN(kanban, '.o_m2o_avatar', 4); - assert.strictEqual(kanban.$('.o_m2o_avatar:nth(0) > img').data('src'), '/web/image/hr.employee.public/11/image_128'); - assert.strictEqual(kanban.$('.o_m2o_avatar:nth(1) > img').data('src'), '/web/image/hr.employee.public/7/image_128'); - assert.strictEqual(kanban.$('.o_m2o_avatar:nth(2) > img').data('src'), '/web/image/hr.employee.public/11/image_128'); - assert.strictEqual(kanban.$('.o_m2o_avatar:nth(3) > img').data('src'), '/web/image/hr.employee.public/23/image_128'); + assert.strictEqual(kanban.$('.o_m2o_avatar:nth(0) > img').data('src'), '/web/image/hr.employee.public/11/avatar_128'); + assert.strictEqual(kanban.$('.o_m2o_avatar:nth(1) > img').data('src'), '/web/image/hr.employee.public/7/avatar_128'); + assert.strictEqual(kanban.$('.o_m2o_avatar:nth(2) > img').data('src'), '/web/image/hr.employee.public/11/avatar_128'); + assert.strictEqual(kanban.$('.o_m2o_avatar:nth(3) > img').data('src'), '/web/image/hr.employee.public/23/avatar_128'); kanban.destroy(); }); @@ -235,7 +235,7 @@ QUnit.module('hr', {}, function () { assert.containsN(form, '.o_field_many2manytags.avatar.o_field_widget .badge', 2, "should have 2 records"); assert.strictEqual(form.$('.o_field_many2manytags.avatar.o_field_widget .badge:first img').data('src'), - '/web/image/hr.employee.public/11/image_128', + '/web/image/hr.employee.public/11/avatar_128', "should have correct avatar image"); await dom.click(form.$('.o_field_many2manytags.avatar .badge:first .o_m2m_avatar')); @@ -350,7 +350,7 @@ QUnit.module('hr', {}, function () { assert.containsN(form, '.o_field_many2manytags.avatar.o_field_widget .badge', 2, "should have 2 records"); assert.strictEqual(form.$('.o_field_many2manytags.avatar.o_field_widget .badge:first img').data('src'), - '/web/image/hr.employee.public/11/image_128', + '/web/image/hr.employee.public/11/avatar_128', "should have correct avatar image"); await dom.click(form.$('.o_field_many2manytags.avatar .badge:first .o_m2m_avatar')); diff --git a/addons/hr/views/hr_employee_public_views.xml b/addons/hr/views/hr_employee_public_views.xml index a64dae4926b..77a4399f4a1 100644 --- a/addons/hr/views/hr_employee_public_views.xml +++ b/addons/hr/views/hr_employee_public_views.xml @@ -40,7 +40,7 @@
- +