diff --git a/addons/account/views/account_portal_templates.xml b/addons/account/views/account_portal_templates.xml index 25cd8c84e34750404675f3d9e70c9cfe2367df90..e4705746870ba86efc364a18cb7f1db75490e50f 100644 --- a/addons/account/views/account_portal_templates.xml +++ b/addons/account/views/account_portal_templates.xml @@ -108,7 +108,7 @@ <div class="small mb-1"><strong class="text-muted">Salesperson</strong></div> <div class="row"> <div class="col flex-grow-0 pr-2"> - <img t-if="invoice.invoice_user_id.image" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(invoice.invoice_user_id.image)" alt="Contact"/> + <img t-if="invoice.invoice_user_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(invoice.invoice_user_id.image_1024)" alt="Contact"/> <img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/> </div> <div class="col pl-0"> diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index d033a750ed20b59220f2f7ca0979f47fdb7eccad..cbc347a66757631269c0efd048cadc481e12d97d 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -532,7 +532,7 @@ class Lead(models.Model): 'effect': { 'fadeout': 'slow', 'message': message, - 'img_url': '/web/image/%s/%s/image' % (self.team_id.user_id._name, self.team_id.user_id.id) if self.team_id.user_id.image else '/web/static/src/img/smile.svg', + 'img_url': '/web/image/%s/%s/image_1024' % (self.team_id.user_id._name, self.team_id.user_id.id) if self.team_id.user_id.image_1024 else '/web/static/src/img/smile.svg', 'type': 'rainbow_man', } } diff --git a/addons/gamification/data/badge.xml b/addons/gamification/data/badge.xml index 06476e98066b0ecd2c6a631d7a10393d59f22fbe..696e3fabec709c5d64ffd5bda40502efb8b22b55 100644 --- a/addons/gamification/data/badge.xml +++ b/addons/gamification/data/badge.xml @@ -5,21 +5,21 @@ <field name="name">Good Job</field> <field name="description">You did great at your job.</field> <field name="rule_auth">everyone</field> - <field name="image" type="base64" file="gamification/static/img/badge_good_job-image.png"/> + <field name="image_1920" type="base64" file="gamification/static/img/badge_good_job-image.png"/> </record> <record id="badge_problem_solver" model="gamification.badge"> <field name="name">Problem Solver</field> <field name="description">No one can solve challenges like you do.</field> <field name="rule_auth">everyone</field> - <field name="image" type="base64" file="gamification/static/img/badge_problem_solver-image.png"/> + <field name="image_1920" type="base64" file="gamification/static/img/badge_problem_solver-image.png"/> </record> <record id="badge_hidden" model="gamification.badge"> <field name="name">Hidden</field> <field name="description">You have found the hidden badge</field> <field name="rule_auth">nobody</field> - <field name="image" type="base64" file="gamification/static/img/badge_hidden-image.png"/> + <field name="image_1920" type="base64" file="gamification/static/img/badge_hidden-image.png"/> <field name="active" eval="False" /> </record> @@ -29,7 +29,7 @@ <field name="rule_auth">everyone</field> <field name="rule_max">True</field> <field name="rule_max_number">2</field> - <field name="image" type="base64" file="gamification/static/img/badge_idea-image.png"/> + <field name="image_1920" type="base64" file="gamification/static/img/badge_idea-image.png"/> </record> <record id="email_template_badge_received" model="mail.template"> @@ -71,7 +71,7 @@ <table cellspacing="0" cellpadding="0" border="0" style="width: 560px; margin-top: 5px;"> <tbody><tr> <td valign="center"> - <img src="/web/image/gamification.badge/${object.badge_id.id}/image/80x80" style="padding: 0px; margin: 0px; height: auto; width: 80px;" alt="${user.company_id.name}"/> + <img src="/web/image/gamification.badge/${object.badge_id.id}/image_128/80x80" style="padding: 0px; margin: 0px; height: auto; width: 80px;" alt="${user.company_id.name}"/> </td> <td valign="center"> <cite>${object.badge_id.description}</cite> diff --git a/addons/gamification/data/gamification_karma_rank_data.xml b/addons/gamification/data/gamification_karma_rank_data.xml index 5eba07b1a3d75788e211eb888bf7f8ac88b2a30c..e0ef1320a4eedf356d475b64758d56860b17d4c8 100644 --- a/addons/gamification/data/gamification_karma_rank_data.xml +++ b/addons/gamification/data/gamification_karma_rank_data.xml @@ -19,7 +19,7 @@ </div> </field> <field name="karma_min">1</field> - <field name="image" type="base64" file="gamification/static/img/rank_newbie_badge.svg"/> + <field name="image_1920" type="base64" file="gamification/static/img/rank_newbie_badge.svg"/> </record> <record id="rank_student" model="gamification.karma.rank"> @@ -32,7 +32,7 @@ </div> </field> <field name="karma_min">100</field> - <field name="image" type="base64" file="gamification/static/img/rank_student_badge.svg"/> + <field name="image_1920" type="base64" file="gamification/static/img/rank_student_badge.svg"/> </record> <record id="rank_bachelor" model="gamification.karma.rank"> @@ -45,7 +45,7 @@ </div> </field> <field name="karma_min">500</field> - <field name="image" type="base64" file="gamification/static/img/rank_bachelor_badge.svg"/> + <field name="image_1920" type="base64" file="gamification/static/img/rank_bachelor_badge.svg"/> </record> <record id="rank_master" model="gamification.karma.rank"> @@ -58,7 +58,7 @@ </div> </field> <field name="karma_min">2000</field> - <field name="image" type="base64" file="gamification/static/img/rank_master_badge.svg"/> + <field name="image_1920" type="base64" file="gamification/static/img/rank_master_badge.svg"/> </record> <record id="rank_doctor" model="gamification.karma.rank"> @@ -71,6 +71,6 @@ </div> </field> <field name="karma_min">10000</field> - <field name="image" type="base64" file="gamification/static/img/rank_doctor_badge.svg"/> + <field name="image_1920" type="base64" file="gamification/static/img/rank_doctor_badge.svg"/> </record> </data></odoo> diff --git a/addons/gamification/models/badge.py b/addons/gamification/models/badge.py index afece1a34ce1b824b6cfc88b06fdfea9f4c95cf6..d1ea4c4cc9636bfb6d5b98b94d53c64161e28797 100644 --- a/addons/gamification/models/badge.py +++ b/addons/gamification/models/badge.py @@ -4,7 +4,7 @@ import logging from datetime import date -from odoo import api, tools, fields, models, _, exceptions +from odoo import api, fields, models, _, exceptions _logger = logging.getLogger(__name__) @@ -65,22 +65,11 @@ class GamificationBadge(models.Model): _name = 'gamification.badge' _description = 'Gamification Badge' - _inherit = ['mail.thread'] + _inherit = ['mail.thread', 'image.mixin'] name = fields.Char('Badge', required=True, translate=True) active = fields.Boolean('Active', default=True) description = fields.Text('Description', translate=True) - image = fields.Binary("Image", help="This field holds the image used for the badge.") - image_128 = fields.Binary( - "Medium-sized badge image", - help="Medium-sized image of the badge. It is automatically " - "resized as a 128x128px image, with aspect ratio preserved. " - "Use this field in form views or some kanban views.") - image_64 = fields.Binary( - "Small-sized badge image", - help="Small-sized image of the badge. It is automatically " - "resized as a 64x64px image, with aspect ratio preserved. " - "Use this field anywhere a small image is required.") level = fields.Selection([ ('bronze', 'Bronze'), ('silver', 'Silver'), ('gold', 'Gold')], string='Forum Badge Level', default='bronze') @@ -137,16 +126,6 @@ class GamificationBadge(models.Model): "Remaining Sending Allowed", compute='_remaining_sending_calc', help="If a maximum is set") - @api.model_create_multi - def create(self, values_list): - for vals in values_list: - tools.image_resize_images(vals) - return super(GamificationBadge, self).create(values_list) - - def write(self, vals): - tools.image_resize_images(vals) - return super(GamificationBadge, self).write(vals) - @api.depends('owner_ids') def _get_owners_info(self): """Return: diff --git a/addons/gamification/models/gamification_karma_rank.py b/addons/gamification/models/gamification_karma_rank.py index 5958dd3424fe55b6a0c0e23d12e1cf389df2209f..65b0d8d21778c78acd573f9ecb7d3ef248df58d5 100644 --- a/addons/gamification/models/gamification_karma_rank.py +++ b/addons/gamification/models/gamification_karma_rank.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import api, tools, fields, models, exceptions, http +from odoo import api, fields, models, exceptions from odoo.tools.translate import html_translate @@ -24,6 +24,7 @@ class Http(models.AbstractModel): class KarmaRank(models.Model): _name = 'gamification.karma.rank' _description = 'Rank based on karma' + _inherit = 'image.mixin' _order = 'karma_min' name = fields.Text(string='Rank Name', translate=True, required=True) @@ -33,22 +34,9 @@ class KarmaRank(models.Model): help="Motivational phrase to reach this rank") karma_min = fields.Integer(string='Required Karma', help='Minimum karma needed to reach this rank') user_ids = fields.One2many('res.users', 'rank_id', string='Users', help="Users having this rank") - image = fields.Binary('Rank Icon') - image_128 = fields.Binary( - "Medium-sized rank icon", - help="Medium-sized icon of the rank. It is automatically " - "resized as a 128x128px image, with aspect ratio preserved. " - "Use this field in form views or some kanban views.") - image_64 = fields.Binary( - "Small-sized rank icon", - help="Small-sized icon of the rank. It is automatically " - "resized as a 64x64px image, with aspect ratio preserved. " - "Use this field anywhere a small image is required.") @api.model_create_multi def create(self, values_list): - for vals in values_list: - tools.image_resize_images(vals) res = super(KarmaRank, self).create(values_list) users = self.env['res.users'].sudo().search([('karma', '>', 0)]) users._recompute_rank() @@ -60,7 +48,6 @@ class KarmaRank(models.Model): low = min(vals['karma_min'], self.karma_min) high = max(vals['karma_min'], self.karma_min) - tools.image_resize_images(vals) res = super(KarmaRank, self).write(vals) if 'karma_min' in vals: diff --git a/addons/gamification/views/badge.xml b/addons/gamification/views/badge.xml index 9676faff9533400a284b84ff27022a4504ac9e8b..d0980d3e0b7abfa86e2eb27f0d18e6cb6d280fb9 100644 --- a/addons/gamification/views/badge.xml +++ b/addons/gamification/views/badge.xml @@ -40,7 +40,7 @@ <sheet> <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/> <div class="oe_button_box" name="button_box"/> - <field name="image" widget='image' class="oe_avatar"/> + <field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/> <div class="oe_title"> <label for="name" class="oe_edit_only"/> <h1> @@ -102,7 +102,6 @@ <field name="id"/> <field name="name"/> <field name="description"/> - <field name="image"/> <field name="stat_my"/> <field name="stat_count"/> <field name="stat_this_month"/> @@ -114,7 +113,7 @@ <t t-name="kanban-box"> <div t-attf-class="o_kanban_gamification oe_kanban_global_click #{record.stat_my.raw_value ? 'oe_kanban_color_5' : 'oe_kanban_color_white'}"> <div class="o_kanban_image"> - <img t-att-src="kanban_image('gamification.badge', 'image', record.id.raw_value)" t-att-title="record.name.value" t-att-alt="record.name.value"/> + <img t-att-src="kanban_image('gamification.badge', 'image_1024', record.id.raw_value)" t-att-title="record.name.value" t-att-alt="record.name.value"/> </div> <div class="oe_kanban_details"> <strong class="o_kanban_record_title"><field name="name"/></strong> @@ -168,7 +167,7 @@ <div class="oe_kanban_card oe_kanban_global_click oe_kanban_badge oe_kanban_color_white o_kanban_gamification"> <div class="o_kanban_content"> <div class="o_kanban_image"> - <a type="open"><img t-att-src="kanban_image('gamification.badge', 'image', record.badge_id.raw_value)" t-att-title="record.badge_name.value" t-att-alt="record.badge_name.value" /></a> + <a type="open"><img t-att-src="kanban_image('gamification.badge', 'image_1024', record.badge_id.raw_value)" t-att-title="record.badge_name.value" t-att-alt="record.badge_name.value" /></a> </div> <div class="oe_kanban_details"> <h4 class="mt0 mb0"> diff --git a/addons/gamification/views/gamification_karma_rank_views.xml b/addons/gamification/views/gamification_karma_rank_views.xml index f728cff538e85de3d72e371fb3738b81bfd027b4..fc0205794b5d82d17a106071091935fb51168170 100644 --- a/addons/gamification/views/gamification_karma_rank_views.xml +++ b/addons/gamification/views/gamification_karma_rank_views.xml @@ -47,7 +47,7 @@ <form string="Rank"> <sheet> <div class="oe_button_box" name="button_box"/> - <field name="image" widget='image' class="oe_avatar"/> + <field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/> <div class="oe_title"> <label for="name" class="oe_edit_only"/> <h1> diff --git a/addons/google_calendar/static/tests/google_calendar_tests.js b/addons/google_calendar/static/tests/google_calendar_tests.js index 76aaa65411b2042819569d84c8e6c10a3331c2c9..0470d95d730027abfd147bdc510ac4d0c31e2263 100644 --- a/addons/google_calendar/static/tests/google_calendar_tests.js +++ b/addons/google_calendar/static/tests/google_calendar_tests.js @@ -39,7 +39,7 @@ QUnit.module('Google Calendar', { id: {string: "ID", type: "integer"}, display_name: {string: "Displayed name", type: "char"}, partner_id: {string: "partner", type: "many2one", relation: 'partner'}, - image: {string: "image", type: "integer"}, + image_1920: {string: "image", type: "integer"}, }, records: [ {id: 4, display_name: "user 4", partner_id: 4}, @@ -49,10 +49,10 @@ QUnit.module('Google Calendar', { fields: { id: {string: "ID", type: "integer"}, display_name: {string: "Displayed name", type: "char"}, - image: {string: "image", type: "integer"}, + image_1920: {string: "image", type: "integer"}, }, records: [ - {id: 4, display_name: "partner 4", image: 'DDD'} + {id: 4, display_name: "partner 4", image_1920: 'DDD'} ] }, filter_partner: { diff --git a/addons/hr/data/hr_data.xml b/addons/hr/data/hr_data.xml index 8c70cef3e68f82958e85fe163cf80077284eef79..41e343de6d4e43275ee99e41316774c19d1f9343 100644 --- a/addons/hr/data/hr_data.xml +++ b/addons/hr/data/hr_data.xml @@ -15,7 +15,7 @@ <field name="user_id" ref="base.user_admin"/> <field name="address_id" ref="base.partner_admin"/> <field name="address_home_id" ref="base.partner_admin"/> - <field name="image" eval="obj(ref('base.partner_admin')).image" model="res.partner"/> + <field name="image_1920" eval="obj(ref('base.partner_admin')).image_1920" model="res.partner"/> </record> <record id="onboarding_setup_it_materials" model="hr.plan.activity.type"> diff --git a/addons/hr/data/hr_demo.xml b/addons/hr/data/hr_demo.xml index a713638b1fa7481066ab1d902c4d8867b04d87ab..b6f039b140c9a4b08ea41f7aa85998aa776ed9fa 100644 --- a/addons/hr/data/hr_demo.xml +++ b/addons/hr/data/hr_demo.xml @@ -154,7 +154,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(376)-310-7863</field> <field name="work_email">ronnie.hart87@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_al-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_al-image.jpg"/> </record> <record id="employee_mit" model="hr.employee"> @@ -168,7 +168,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_phone">(538)-497-4804</field> <field name="mobile_phone">(538)-672-3185</field> <field name="work_email">anita.oliver32@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_mit-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_mit-image.jpg"/> </record> <record id="employee_niv" model="hr.employee"> @@ -181,7 +181,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(450)-719-4182</field> <field name="work_email">sharlene.rhodes49@example.comcom</field> - <field name="image" type="base64" file="hr/static/img/employee_niv-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_niv-image.jpg"/> </record> <record id="employee_stw" model="hr.employee"> @@ -194,7 +194,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(332)-775-6660</field> <field name="work_email">randall.lewis74@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_stw-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_stw-image.jpg"/> </record> <record id="employee_chs" model="hr.employee"> @@ -207,7 +207,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(157)-363-8229</field> <field name="work_email">jennie.fletcher76@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_chs-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_chs-image.jpg"/> </record> <record id="employee_qdp" model="hr.employee"> @@ -221,7 +221,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">+3281813700</field> <field name="work_email">gilles@odoo.com</field> - <field name="image" type="base64" file="hr/static/img/employee_qdp-image.png"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_qdp-image.png"/> </record> <record id="employee_fme" model="hr.employee"> @@ -234,7 +234,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(449)-505-5146</field> <field name="work_email">keith.byrd52@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_fme-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_fme-image.jpg"/> </record> <record id="employee_fpi" model="hr.employee"> @@ -247,7 +247,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(203)-276-7903</field> <field name="work_email">audrey.peterson25@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_fpi-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_fpi-image.jpg"/> </record> <record id="employee_jth" model="hr.employee"> @@ -260,7 +260,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(663)-707-8451</field> <field name="work_email">toni.jimenez23@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_jth-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_jth-image.jpg"/> </record> <record id="employee_ngh" model="hr.employee"> @@ -273,7 +273,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(916)-264-7362</field> <field name="work_email">jeffrey.kelly72@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_ngh-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_ngh-image.jpg"/> </record> <record id="employee_vad" model="hr.employee"> @@ -286,7 +286,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(360)-694-7266</field> <field name="work_email">tina.williamson98@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_vad-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_vad-image.jpg"/> </record> <record id="employee_han" model="hr.employee"> @@ -297,7 +297,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(350)-912-1201</field> <field name="work_email">walter.horton80@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_han-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_han-image.jpg"/> </record> <record id="employee_jve" model="hr.employee"> @@ -308,7 +308,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(114)-262-1607</field> <field name="work_email">paul.williams59@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_jve-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_jve-image.jpg"/> </record> <record id="employee_jep" model="hr.employee"> @@ -319,7 +319,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(883)-331-5378</field> <field name="work_email">doris.cole31@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_jep-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_jep-image.jpg"/> </record> <record id="employee_jod" model="hr.employee"> @@ -330,7 +330,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(206)-267-3735</field> <field name="work_email">jod@odoo.com</field> - <field name="image" type="base64" file="hr/static/img/employee_jod-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_jod-image.jpg"/> </record> <record id="employee_jog" model="hr.employee"> @@ -341,7 +341,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(754)-532-3841</field> <field name="work_email">beth.evans77@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_jog-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_jog-image.jpg"/> </record> <record id="employee_jgo" model="hr.employee"> @@ -352,7 +352,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(944)-518-8232</field> <field name="work_email">ernest.reed47@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_jgo-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_jgo-image.jpg"/> </record> <record id="employee_lur" model="hr.employee"> @@ -363,7 +363,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_phone">(644)-169-1352</field> <field name="work_email">eli.lambert22@example.com</field> - <field name="image" type="base64" file="hr/static/img/employee_lur-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_lur-image.jpg"/> </record> <record id="employee_hne" model="hr.employee"> @@ -374,7 +374,7 @@ If you have development competencies, we can propose you specific traineeships</ <field name="work_location">Building 1, Second Floor</field> <field name="work_email">abigail.peterson39@example.com</field> <field name="work_phone">(482)-233-3393</field> - <field name="image" type="base64" file="hr/static/img/employee_hne-image.jpg"/> + <field name="image_1920" type="base64" file="hr/static/img/employee_hne-image.jpg"/> </record> </data> </odoo> diff --git a/addons/hr/models/hr_employee.py b/addons/hr/models/hr_employee.py index b30e8bfd3bf5841c89de27f010ffe761fd033b98..6f28b32b610afb1775fc4cfeb16ee541e9b275d6 100644 --- a/addons/hr/models/hr_employee.py +++ b/addons/hr/models/hr_employee.py @@ -8,7 +8,7 @@ import itertools from werkzeug import url_encode import pytz -from odoo import api, fields, models, tools, _ +from odoo import api, fields, models, _ from odoo.exceptions import ValidationError, AccessError from odoo.modules.module import get_module_resource from odoo.addons.resource.models.resource_mixin import timezone_datetime @@ -25,13 +25,13 @@ class HrEmployeePrivate(models.Model): _name = "hr.employee" _description = "Employee" _order = 'name' - _inherit = ['hr.employee.base', 'mail.thread', 'mail.activity.mixin', 'resource.mixin'] + _inherit = ['hr.employee.base', 'mail.thread', 'mail.activity.mixin', 'resource.mixin', 'image.mixin'] _mail_post_access = 'read' @api.model def _default_image(self): image_path = get_module_resource('hr', 'static/src/img', 'default_image.png') - return tools.image_process(base64.b64encode(open(image_path, 'rb').read()), size=(1024, 1024)) + return base64.b64encode(open(image_path, 'rb').read()) # resource and user # required on the resource, make sure required="True" set in the view @@ -93,13 +93,7 @@ class HrEmployeePrivate(models.Model): emergency_phone = fields.Char("Emergency Phone", groups="hr.group_hr_user", tracking=True) km_home_work = fields.Integer(string="Km Home-Work", groups="hr.group_hr_user", tracking=True) - # image: all image fields are base64 encoded and PIL-supported - image = fields.Binary( - "Photo", default=_default_image) - image_128 = fields.Binary( - "Medium-sized photo") - image_64 = fields.Binary( - "Small-sized photo") + image_1920 = fields.Image(default=_default_image) phone = fields.Char(related='address_home_id.phone', related_sudo=False, string="Private Phone", groups="hr.group_hr_user") # employee in company parent_id = fields.Many2one('hr.employee', 'Manager') @@ -232,7 +226,7 @@ class HrEmployeePrivate(models.Model): def _sync_user(self, user): vals = dict( - image=user.image, + image_1920=user.image_1920, work_email=user.email, ) if user.tz: @@ -245,7 +239,6 @@ class HrEmployeePrivate(models.Model): user = self.env['res.users'].browse(vals['user_id']) vals.update(self._sync_user(user)) vals['name'] = vals.get('name', user.name) - tools.image_resize_images(vals) employee = super(HrEmployeePrivate, self).create(vals) url = '/web#%s' % url_encode({'action': 'hr.plan_wizard_action', 'active_id': employee.id, 'active_model': 'hr.employee'}) employee._message_log(body=_('<b>Congratulations !</b> May I recommand you to setup an <a href="%s">onboarding plan ?</a>') % (url)) @@ -262,7 +255,6 @@ class HrEmployeePrivate(models.Model): self.env['res.partner.bank'].browse(account_id).partner_id = vals['address_home_id'] if vals.get('user_id'): vals.update(self._sync_user(self.env['res.users'].browse(vals['user_id']))) - tools.image_resize_images(vals) res = super(HrEmployeePrivate, self).write(vals) if vals.get('department_id') or vals.get('user_id'): department_id = vals['department_id'] if vals.get('department_id') else self[:1].department_id.id diff --git a/addons/hr/models/hr_employee_public.py b/addons/hr/models/hr_employee_public.py index 75e72f704dbb3998e7a646fed44b6575d56cdee3..62c221ee472fd5324eef4655be8fb9e899537744 100644 --- a/addons/hr/models/hr_employee_public.py +++ b/addons/hr/models/hr_employee_public.py @@ -32,9 +32,12 @@ class HrEmployeePublic(models.Model): # hr.employee.public specific fields child_ids = fields.One2many('hr.employee.public', 'parent_id', string='Direct subordinates', readonly=True) - image = fields.Binary("Photo", compute='_compute_image', readonly=True, compute_sudo=True) - image_128 = fields.Binary("Medium-sized photo", compute='_compute_image', readonly=True, compute_sudo=True) - image_64 = fields.Binary("Small-sized photo", compute='_compute_image', readonly=True, compute_sudo=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_64 = fields.Image("Image 64", compute='_compute_image', compute_sudo=True) parent_id = fields.Many2one('hr.employee.public', 'Manager', readonly=True) coach_id = fields.Many2one('hr.employee.public', 'Coach', readonly=True) @@ -42,7 +45,10 @@ class HrEmployeePublic(models.Model): 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 = employee_id.image + 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.image_64 = employee_id.image_64 diff --git a/addons/hr/models/res_users.py b/addons/hr/models/res_users.py index d863c41fd64a761e7792616551b94da1f9621275..6b9832bcbecea42f66e50e632e9ef7b3dad35e18 100644 --- a/addons/hr/models/res_users.py +++ b/addons/hr/models/res_users.py @@ -157,7 +157,7 @@ class User(models.Model): result = super(User, self).write(vals) employee_values = {} - for fname in [f for f in ['name', 'email', 'image', 'tz'] if f in vals]: + for fname in [f for f in ['name', 'email', 'image_1920', 'tz'] if f in vals]: employee_values[fname] = vals[fname] if employee_values: if 'email' in employee_values: diff --git a/addons/hr/report/hr_employee_badge.xml b/addons/hr/report/hr_employee_badge.xml index 1a5e8fdc6454b05c79ac51bcf810153124fa90dd..f186914ba3d1f823727dcde88c32f6d4f15e9476 100644 --- a/addons/hr/report/hr_employee_badge.xml +++ b/addons/hr/report/hr_employee_badge.xml @@ -25,7 +25,7 @@ </tr> <tr style="height:70%;"> <td align="center" valign="center"> - <img t-if="employee.image" t-att-src="image_data_uri(employee.image)" style="max-height:85pt;max-width:90%" alt="Employee Image"/> + <img t-if="employee.image_1920" t-att-src="image_data_uri(employee.image_1920)" style="max-height:85pt;max-width:90%" alt="Employee Image"/> </td> </tr> </table> diff --git a/addons/hr/views/hr_employee_public_views.xml b/addons/hr/views/hr_employee_public_views.xml index 2fa227dd80aec1ee6e98aee7c37b040303eb2667..d6177dae4138e05bd63b7de8d059c8e9ae2dae1b 100644 --- a/addons/hr/views/hr_employee_public_views.xml +++ b/addons/hr/views/hr_employee_public_views.xml @@ -36,7 +36,7 @@ <div class="oe_button_box" name="button_box"> <!-- Used by other modules--> </div> - <field name="image" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"image_128"}'/> + <field name="image_1920" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"image_128"}'/> <div class="oe_title"> <label for="name" class="oe_edit_only"/> <h1> @@ -112,7 +112,7 @@ <t t-name="kanban-box"> <div class="oe_kanban_global_click o_kanban_record_has_image_fill o_hr_kanban_record"> <!-- Medium employee's picture --> - <field name="image" widget="image" class="o_kanban_image_fill_left d-none d-md-block" options="{'zoom': true, 'background': true, 'preventClicks': false}"/> + <field name="image_128" widget="image" class="o_kanban_image_fill_left d-none d-md-block" options="{'zoom': true, 'background': true, 'preventClicks': false}"/> <!-- Employee's picture optimized for mobile --> <field name="image_64" widget="image" class="o_kanban_image d-md-none rounded-circle" options="{'zoom': true, 'background': true, 'preventClicks': false}"/> diff --git a/addons/hr/views/hr_employee_views.xml b/addons/hr/views/hr_employee_views.xml index 7ea3a15ec90180ee016e7e1e1c4250e37253a134..434afc2ec6fa0fc860b9c71dbcdeb6b7e4e5b55f 100644 --- a/addons/hr/views/hr_employee_views.xml +++ b/addons/hr/views/hr_employee_views.xml @@ -74,7 +74,7 @@ </div> </button> </div> - <field name="image" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"image_128"}'/> + <field name="image_1920" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"image_128"}'/> <div class="oe_title"> <label for="name" class="oe_edit_only"/> <h1> @@ -227,7 +227,7 @@ <t t-name="kanban-box"> <div class="oe_kanban_global_click o_kanban_record_has_image_fill o_hr_kanban_record"> <!-- Medium employee's picture --> - <field name="image" widget="image" class="o_kanban_image_fill_left d-none d-md-block" options="{'zoom': true, 'background': true, 'preventClicks': false}"/> + <field name="image_128" widget="image" class="o_kanban_image_fill_left d-none d-md-block" options="{'zoom': true, 'background': true, 'preventClicks': false}"/> <!-- Employee's picture optimized for mobile --> <field name="image_64" widget="image" class="o_kanban_image d-md-none rounded-circle" options="{'zoom': true, 'background': true, 'preventClicks': false}"/> diff --git a/addons/hr/views/res_users.xml b/addons/hr/views/res_users.xml index e14aec0890c79a98f453ea3fa85ac11f4e405efe..1f618fb776a336f0b6811131e69c28ba7a04a3e0 100644 --- a/addons/hr/views/res_users.xml +++ b/addons/hr/views/res_users.xml @@ -14,7 +14,7 @@ <field name="arch" type="xml"> <footer position="replace"/> <h1 position="replace"/> - <xpath expr="//field[@name='image']" position="replace"/> + <xpath expr="//field[@name='image_1920']" position="replace"/> <xpath expr="//field[@name='email']" position="attributes"> <attribute name="invisible">1</attribute> </xpath> @@ -75,7 +75,7 @@ </div> </button> </div> - <field name="image" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"image_128"}'/> + <field name="image_1920" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"image_128"}'/> <div class="oe_title"> <label for="name" class="oe_edit_only"/> <h1> diff --git a/addons/hr_expense/views/hr_expense_views.xml b/addons/hr_expense/views/hr_expense_views.xml index a8e2508c5d017a0aa33e9194a420b7e859136f2e..0afbe3be4db2c6513e9a5aed06921d7413fb0d48 100644 --- a/addons/hr_expense/views/hr_expense_views.xml +++ b/addons/hr_expense/views/hr_expense_views.xml @@ -310,7 +310,7 @@ <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/> <field name='product_variant_count' invisible='1'/> <field name="id" invisible="True"/> - <field name="image_128" widget="image" class="oe_avatar"/> + <field name="image_1920" widget="image" class="oe_avatar" options="{'image_preview': 'image_128'}"/> <div class="oe_title"> <label class="oe_edit_only" for="name" string="Product Name"/> <h1><field name="name" placeholder="e.g. Lunch"/></h1> diff --git a/addons/hr_org_chart/static/src/xml/hr_org_chart.xml b/addons/hr_org_chart/static/src/xml/hr_org_chart.xml index 119aec4fa15f85b96c1f9cb09b2fb966c99359ae..8c5160fc59ca3b8f0f0076d6a537ec63625a107f 100644 --- a/addons/hr_org_chart/static/src/xml/hr_org_chart.xml +++ b/addons/hr_org_chart/static/src/xml/hr_org_chart.xml @@ -10,13 +10,13 @@ use bg-images to get a clean and centred images --> <a t-if="! is_self" class="o_media_object rounded-circle o_employee_redirect" - t-att-style="'background-image:url(\'/web/image/hr.employee.public/' + employee.id + '/image/\')'" + t-att-style="'background-image:url(\'/web/image/hr.employee.public/' + employee.id + '/image_1024/\')'" t-att-alt="employee.name" t-att-data-employee-id="employee.id" t-att-href="employee.link"/> <div t-if="is_self" class="o_media_object rounded-circle" - t-att-style="'background-image:url(\'/web/image/hr.employee.public/' + employee.id + '/image/\')'"/> + t-att-style="'background-image:url(\'/web/image/hr.employee.public/' + employee.id + '/image_1024/\')'"/> </div> <div class="media-body"> @@ -151,7 +151,7 @@ <t t-name="hr_orgchart_emp_popover_title"> <div> - <span t-att-style='"background-image:url(\"/web/image/hr.employee.public/" + employee.id + "/image/\")"'/> + <span t-att-style='"background-image:url(\"/web/image/hr.employee.public/" + employee.id + "/image_1024/\")"'/> <a href="#" class="float-right o_employee_redirect" t-att-data-employee-id="employee.id"><i class="fa fa-external-link" role="img" aria-label='Redirect' title="Redirect"></i></a> <b><t t-esc="employee.name"/></b> </div> diff --git a/addons/im_livechat/views/im_livechat_channel_views.xml b/addons/im_livechat/views/im_livechat_channel_views.xml index 3a331f6e762df211ce3b39016f21bb7f1bc48fad..807bc64a7c7f5dcb9a8324c1ec184879acfb7f48 100644 --- a/addons/im_livechat/views/im_livechat_channel_views.xml +++ b/addons/im_livechat/views/im_livechat_channel_views.xml @@ -105,7 +105,7 @@ <t t-name="kanban-box"> <div class="oe_kanban_global_click"> <div class="o_kanban_image"> - <img t-att-src="kanban_image('res.users', 'image', record.id.raw_value)" alt="User"/> + <img t-att-src="kanban_image('res.users', 'image_1024', record.id.raw_value)" alt="User"/> </div> <div class="o_kanban_details"> <h4 class="o_kanban_record_title"><field name="name"/></h4> diff --git a/addons/lunch/data/lunch_demo.xml b/addons/lunch/data/lunch_demo.xml index 4fc4ecf2fe3dd9752c803dbea561607fc6583b65..503067967481855531bc83dbb5b5f193027556fb 100644 --- a/addons/lunch/data/lunch_demo.xml +++ b/addons/lunch/data/lunch_demo.xml @@ -118,7 +118,7 @@ <field name="price">7.5</field> <field name="supplier_id" ref="supplier_corner"/> <field name="description">Beef, Bacon, Salad, Cheddar, Fried Onion, BBQ Sauce</field> - <field name="image" type="base64" file="lunch/static/img/bacon_burger.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/bacon_burger.png"/> <field name="new_until" eval="datetime.today() + relativedelta(weeks=1)"/> </record> @@ -128,7 +128,7 @@ <field name="price">7.0</field> <field name="supplier_id" ref="supplier_corner"/> <field name="description">Beef, Cheddar, Salad, Fried Onions, BBQ Sauce</field> - <field name="image" type="base64" file="lunch/static/img/cheeseburger.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/cheeseburger.png"/> </record> <record model="lunch.product" id="product_chicken_curry"> @@ -136,7 +136,7 @@ <field name="category_id" eval="str(ref('categ_sandwich'))"/> <field name="price">3.0</field> <field name="supplier_id" ref="supplier_corner"/> - <field name="image" type="base64" file="lunch/static/img/chicken_curry.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/chicken_curry.png"/> </record> <record model="lunch.product" id="product_spicy_tuna"> @@ -144,7 +144,7 @@ <field name="category_id" eval="str(ref('categ_sandwich'))"/> <field name="price">3.0</field> <field name="supplier_id" ref="supplier_corner"/> - <field name="image" type="base64" file="lunch/static/img/chicken_curry.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/chicken_curry.png"/> </record> <record model="lunch.product" id="product_mozzarella"> @@ -153,7 +153,7 @@ <field name="price">3.9</field> <field name="supplier_id" ref="supplier_corner"/> <field name="description">Mozzarella, Pesto, Tomatoes</field> - <field name="image" type="base64" file="lunch/static/img/mozza.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/mozza.png"/> </record> <record model="lunch.product" id="product_club"> @@ -162,7 +162,7 @@ <field name="price">3.4</field> <field name="supplier_id" ref="supplier_corner"/> <field name="description">Ham, Cheese, Vegetables</field> - <field name="image" type="base64" file="lunch/static/img/club.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/club.png"/> </record> <record model="lunch.product" id="product_maki"> @@ -171,7 +171,7 @@ <field name="price">12.0</field> <field name="supplier_id" ref="supplier_sushi_shop"/> <field name="description">6 Maki Salmon - 6 Maki Tuna - 6 Maki Shrimp/Avocado</field> - <field name="image" type="base64" file="lunch/static/img/maki.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/maki.png"/> <field name="new_until" eval="datetime.today() + relativedelta(weeks=1)"/> </record> @@ -181,7 +181,7 @@ <field name="price">13.80</field> <field name="supplier_id" ref="supplier_sushi_shop"/> <field name="description">4 Sushi Salmon - 6 Maki Salmon - 4 Sashimi Salmon </field> - <field name="image" type="base64" file="lunch/static/img/salmon_sushi.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/salmon_sushi.png"/> <field name="new_until" eval="datetime.today() + relativedelta(weeks=1)"/> </record> @@ -191,7 +191,7 @@ <field name="price">14.0</field> <field name="supplier_id" ref="supplier_sushi_shop"/> <field name="description">1 Avocado - 1 Salmon - 1 Eggs - 1 Tuna</field> - <field name="image" type="base64" file="lunch/static/img/temaki.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/temaki.png"/> <field name="new_until" eval="datetime.today() + relativedelta(weeks=1)"/> </record> @@ -201,7 +201,7 @@ <field name="price">9.25</field> <field name="supplier_id" ref="supplier_sushi_shop"/> <field name="description">2 Tempuras, Cabbages, Onions, Sesame Sauce</field> - <field name="image" type="base64" file="lunch/static/img/chirashi.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/chirashi.png"/> <field name="new_until" eval="datetime.today() + relativedelta(weeks=1)"/> </record> @@ -211,7 +211,7 @@ <field name="price">3.30</field> <field name="supplier_id" eval="str(ref('supplier_coin_gourmand'))"/> <field name="description">Cheese, Ham, Salad, Tomatoes, cucumbers, eggs</field> - <field name="image" type="base64" file="lunch/static/img/club.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/club.png"/> </record> <record model="lunch.product" id="product_country"> @@ -220,7 +220,7 @@ <field name="price">3.30</field> <field name="supplier_id" eval="str(ref('supplier_coin_gourmand'))"/> <field name="description">Brie, Honey, Walnut Kernels</field> - <field name="image" type="base64" file="lunch/static/img/brie.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/brie.png"/> </record> <record model="lunch.product" id="product_tuna"> @@ -229,7 +229,7 @@ <field name="price">2.50</field> <field name="supplier_id" eval="str(ref('supplier_coin_gourmand'))"/> <field name="description">Tuna, Mayonnaise</field> - <field name="image" type="base64" file="lunch/static/img/tuna_sandwich.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/tuna_sandwich.png"/> </record> <record model="lunch.product" id="product_gouda"> @@ -238,7 +238,7 @@ <field name="price">2.50</field> <field name="supplier_id" eval="str(ref('supplier_coin_gourmand'))"/> <field name="description"></field> - <field name="image" type="base64" file="lunch/static/img/gouda.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/gouda.png"/> </record> <record model="lunch.product" id="product_chicken_curry"> @@ -247,7 +247,7 @@ <field name="price">2.60</field> <field name="supplier_id" eval="str(ref('supplier_coin_gourmand'))"/> <field name="description"></field> - <field name="image" type="base64" file="lunch/static/img/chicken_curry.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/chicken_curry.png"/> </record> <record model="lunch.product" id="product_margherita"> @@ -256,7 +256,7 @@ <field name="price">6.90</field> <field name="supplier_id" eval="str(ref('supplier_pizza_inn'))"/> <field name="description">Tomatoes, Mozzarella</field> - <field name="image" type="base64" file="lunch/static/img/pizza_margherita.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/pizza_margherita.png"/> </record> <record model="lunch.product" id="product_funghi"> @@ -265,7 +265,7 @@ <field name="price">7.00</field> <field name="supplier_id" ref="supplier_pizza_inn"/> <field name="description">Tomatoes, Mushrooms, Mozzarella</field> - <field name="image" type="base64" file="lunch/static/img/pizza_funghi.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/pizza_funghi.png"/> </record> <record model="lunch.product" id="product_vege"> @@ -274,7 +274,7 @@ <field name="price">7.00</field> <field name="supplier_id" ref="supplier_pizza_inn"/> <field name="description">Tomatoes, Mozzarella, Mushrooms, Peppers, Olives</field> - <field name="image" type="base64" file="lunch/static/img/pizza_veggie.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/pizza_veggie.png"/> </record> <record model="lunch.product" id="product_italiana"> @@ -283,7 +283,7 @@ <field name="price">7.40</field> <field name="supplier_id" eval="str(ref('supplier_pizza_inn'))"/> <field name="description">Fresh Tomatoes, Basil, Mozzarella</field> - <field name="image" type="base64" file="lunch/static/img/italiana.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/italiana.png"/> </record> <record model="lunch.product" id="product_Bolognese"> @@ -292,7 +292,7 @@ <field name="price">7.70</field> <field name="supplier_id" eval="str(ref('supplier_pizza_inn'))"/> <field name="description"></field> - <field name="image" type="base64" file="lunch/static/img/pasta_bolognese.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/pasta_bolognese.png"/> </record> <record model="lunch.product" id="product_Napoli"> @@ -301,7 +301,7 @@ <field name="price">7.70</field> <field name="supplier_id" eval="str(ref('supplier_pizza_inn'))"/> <field name="description">Tomatoes, Basil</field> - <field name="image" type="base64" file="lunch/static/img/napoli.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/napoli.png"/> </record> <record model="lunch.topping" id="product_olives"> @@ -316,7 +316,7 @@ <field name="price">5.50</field> <field name="supplier_id" ref="supplier_pizza_inn"/> <field name="description">Tomato sauce, Olive oil, Fresh Tomatoes, Onions, Vegetables, Parmesan</field> - <field name="image" type="base64" file="lunch/static/img/4formaggio.png"/> + <field name="image_1920" type="base64" file="lunch/static/img/4formaggio.png"/> </record> <record model="lunch.cashmove" id="cashmove_1"> diff --git a/addons/lunch/models/lunch_product.py b/addons/lunch/models/lunch_product.py index d091b19ea7992f644dc61cf24d08f415834de3f7..3d668857f1c2177b522d1b487be09e87964e0b2b 100644 --- a/addons/lunch/models/lunch_product.py +++ b/addons/lunch/models/lunch_product.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import api, fields, models, tools +from odoo import api, fields, models from odoo.tools import formatLang @@ -85,6 +85,7 @@ class LunchProduct(models.Model): """ Products available to order. A product is linked to a specific vendor. """ _name = 'lunch.product' _description = 'Lunch Product' + _inherit = 'image.mixin' _order = 'name' name = fields.Char('Product Name', required=True) @@ -97,30 +98,5 @@ class LunchProduct(models.Model): company_id = fields.Many2one('res.company', related='supplier_id.company_id', store=True) currency_id = fields.Many2one('res.currency', related='company_id.currency_id') - # image: all image fields are base64 encoded and PIL-supported - image = fields.Binary( - "Image", - help="This field holds the image used as image for the product, limited to 1024x1024px.") - image_128 = fields.Binary( - "Medium-sized image", - help="Medium-sized image of the product. It is automatically " - "resized as a 128x128px image, with aspect ratio preserved, " - "only when the image exceeds one of those sizes. Use this field in form views or some kanban views.") - image_64 = fields.Binary( - "Small-sized image", - help="Small-sized image of the product. It is automatically " - "resized as a 64x64px image, with aspect ratio preserved. " - "Use this field anywhere a small image is required.") - new_until = fields.Date('New Until') favorite_user_ids = fields.Many2many('res.users', 'lunch_product_favorite_user_rel', 'product_id', 'user_id') - - @api.model_create_multi - def create(self, vals_list): - for values in vals_list: - tools.image_resize_images(values) - return super(LunchProduct, self).create(vals_list) - - def write(self, values): - tools.image_resize_images(values) - return super(LunchProduct, self).write(values) diff --git a/addons/lunch/views/lunch_product_views.xml b/addons/lunch/views/lunch_product_views.xml index e5132ff500156817ccc98c8529f66421d6cb6422..e328753add1de90035ac56b77fdc02c72765e0eb 100644 --- a/addons/lunch/views/lunch_product_views.xml +++ b/addons/lunch/views/lunch_product_views.xml @@ -46,7 +46,7 @@ <field name="currency_id" invisible="1"/> <sheet> <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/> - <field name="image" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/> + <field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/> <div class="oe_title"> <label for="name" class="oe-edit-only"/> <h1> diff --git a/addons/lunch/wizard/lunch_line_wizard.py b/addons/lunch/wizard/lunch_line_wizard.py index 39ef50416486d7c7b1622ddffea97d744fd24ea4..4bdc3b1eb7c09e99c873768414027006e746820b 100644 --- a/addons/lunch/wizard/lunch_line_wizard.py +++ b/addons/lunch/wizard/lunch_line_wizard.py @@ -47,9 +47,8 @@ class LunchOrderWizard(models.TransientModel): available_toppings_2 = fields.Boolean(help='Are extras available for this product', compute='_compute_available_toppings') available_toppings_3 = fields.Boolean(help='Are extras available for this product', compute='_compute_available_toppings') - image = fields.Binary(related='product_id.image') - image_128 = fields.Binary(related='product_id.image_128') - image_64 = fields.Binary(related='product_id.image_64') + image_1920 = fields.Image(related='product_id.image_1920') + image_128 = fields.Image(related='product_id.image_128') quantity = fields.Float('Quantity', default=1) price_total = fields.Float('Total Price', compute='_compute_price_total') diff --git a/addons/lunch/wizard/lunch_line_wizard_views.xml b/addons/lunch/wizard/lunch_line_wizard_views.xml index b6f4a57f5a270dc0b4b3d9691e1348a645c0b8ec..7c8879f452d8d6a4ea09a3058021d2d5d21c11dc 100644 --- a/addons/lunch/wizard/lunch_line_wizard_views.xml +++ b/addons/lunch/wizard/lunch_line_wizard_views.xml @@ -16,7 +16,7 @@ <field name="edit" invisible="1"/> <div class="d-flex"> <div class="flex-grow-0 pr-5"> - <field name="image_128" widget="image" class="o_lunch_image" /> + <field name="image_1920" widget="image" class="o_lunch_image" options="{'image_preview': 'image_128'}"/> </div> <div class="flex-grow-1 pr-5"> <h2><field name="product_name"/></h2> diff --git a/addons/mail_bot/data/mailbot_data.xml b/addons/mail_bot/data/mailbot_data.xml index b772ffd5951dd0f53a5bc57890cdf742be59f217..20233fd731031d86a21b882b5b5492174649946a 100644 --- a/addons/mail_bot/data/mailbot_data.xml +++ b/addons/mail_bot/data/mailbot_data.xml @@ -4,7 +4,7 @@ <record id="base.partner_root" model="res.partner"> <field name="name">OdooBot</field> <field name="email">odoobot@example.com</field> - <field name="image" type="base64" file="mail/static/src/img/odoobot.png"/> + <field name="image_1920" type="base64" file="mail/static/src/img/odoobot.png"/> </record> </data> </odoo> diff --git a/addons/mail_bot/views/res_users_views.xml b/addons/mail_bot/views/res_users_views.xml index 296e5380485665e51aa418246eafca67955e8617..f82b2b96f7234293cba7bef149c65d83e33d4e37 100644 --- a/addons/mail_bot/views/res_users_views.xml +++ b/addons/mail_bot/views/res_users_views.xml @@ -34,7 +34,7 @@ <field name="model">res.users</field> <field name="inherit_id" ref="base.view_users_form_simple_modif"/> <field name="arch" type="xml"> - <xpath expr="//field[@name='image']" position="before"> + <xpath expr="//field[@name='image_1920']" position="before"> <widget name="notification_alert"/> </xpath> </field> diff --git a/addons/partner_autocomplete/static/src/js/partner_autocomplete_fieldchar.js b/addons/partner_autocomplete/static/src/js/partner_autocomplete_fieldchar.js index c1fab81a194cde0cd0fee5849ac05504d82346e2..69a1332122e8b257bf282cda547afa0cf0a2b4a8 100644 --- a/addons/partner_autocomplete/static/src/js/partner_autocomplete_fieldchar.js +++ b/addons/partner_autocomplete/static/src/js/partner_autocomplete_fieldchar.js @@ -115,7 +115,7 @@ var FieldAutocomplete = FieldChar.extend(AutocompleteMixin, { var self = this; this._getCreateData(company).then(function (data) { if (data.logo) { - var logoField = self.model === 'res.partner' ? 'image' : 'logo'; + var logoField = self.model === 'res.partner' ? 'image_1920' : 'logo'; data.company[logoField] = data.logo; } diff --git a/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js b/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js index b524dba75a603a14eb1cbdc7a5e7f01ed3011775..c605c9bc33ce7b1bd2b4a855cb2ed67d3bb040fe 100644 --- a/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js +++ b/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js @@ -15,7 +15,7 @@ odoo.define('partner_autocomplete.tests', function (require) { _.each(createData, function (val, key) { if (fields[key]) { - if (key === 'image') { + if (key === 'image_1920') { if (val) val = 'data:image/png;base64,' + val; assert.hasAttrValue(form.$(".o_field_image img"), "data-src", val, 'image value should have been updated to "' + val + '"'); } else { @@ -123,7 +123,7 @@ odoo.define('partner_autocomplete.tests', function (require) { name: {string: "Name", type: "char", searchable: true}, parent_id: {string: "Company", type: "many2one", relation: "res.partner"}, website: {string: "Website", type: "char", searchable: true}, - image: {string: "Image", type: "binary", searchable: true}, + image_1920: {string: "Image", type: "binary", searchable: true}, email: {string: "Email", type: "char", searchable: true}, phone: {string: "Phone", type: "char", searchable: true}, street: {string: "Street", type: "char", searchable: true}, @@ -163,7 +163,7 @@ odoo.define('partner_autocomplete.tests', function (require) { '<field name="company_type"/>' + '<field name="name" widget="field_partner_autocomplete"/>' + '<field name="website"/>' + - '<field name="image" widget="image"/>' + + '<field name="image_1920" widget="image"/>' + '</form>', }).then(function (form){ // Set company type to Individual @@ -198,7 +198,7 @@ odoo.define('partner_autocomplete.tests', function (require) { '<field name="company_type"/>' + '<field name="name" widget="field_partner_autocomplete"/>' + '<field name="website"/>' + - '<field name="image" widget="image"/>' + + '<field name="image_1920" widget="image"/>' + '<field name="email"/>' + '<field name="phone"/>' + '<field name="street"/>' + @@ -272,7 +272,7 @@ odoo.define('partner_autocomplete.tests', function (require) { '<field name="company_type"/>' + '<field name="name" widget="field_partner_autocomplete"/>' + '<field name="website"/>' + - '<field name="image" widget="image"/>' + + '<field name="image_1920" widget="image"/>' + '<field name="email"/>' + '<field name="phone"/>' + '<field name="street"/>' + diff --git a/addons/point_of_sale/models/res_partner.py b/addons/point_of_sale/models/res_partner.py index a1b89f004e3f2bbd57404c9e276a90ff058a82ec..7f54488c51c4afa7e87540971e7fba1f0b0945dc 100644 --- a/addons/point_of_sale/models/res_partner.py +++ b/addons/point_of_sale/models/res_partner.py @@ -29,8 +29,8 @@ class ResPartner(models.Model): """ create or modify a partner from the point of sale ui. partner contains the partner's fields. """ # image is a dataurl, get the data after the comma - if partner.get('image'): - partner['image'] = partner['image'].split(',')[1] + if partner.get('image_1920'): + partner['image_1920'] = partner['image_1920'].split(',')[1] partner_id = partner.pop('id', False) if partner_id: # Modifying existing partner self.browse(partner_id).write(partner) diff --git a/addons/product/views/product_template_views.xml b/addons/product/views/product_template_views.xml index f17b7b2a966121381fd4c8fcfd4d17266b1dd18c..35678b7068942e7415de1bfade6baaa0a0233a85 100644 --- a/addons/product/views/product_template_views.xml +++ b/addons/product/views/product_template_views.xml @@ -68,7 +68,6 @@ <field name="arch" type="xml"> <kanban> <field name="id"/> - <field name="image_64"/> <field name="lst_price"/> <field name="product_variant_count"/> <field name="currency_id"/> diff --git a/addons/product/views/product_views.xml b/addons/product/views/product_views.xml index 9539ca36ef9d145153bd30932d8fbb9fb151e196..3acf80d169f53dc59508f3c062465897466800f1 100644 --- a/addons/product/views/product_views.xml +++ b/addons/product/views/product_views.xml @@ -418,7 +418,6 @@ <field name="arch" type="xml"> <kanban> <field name="id"/> - <field name="image_64"/> <field name="lst_price"/> <field name="activity_state"/> <progressbar field="activity_state" colors='{"planned": "success", "today": "warning", "overdue": "danger"}'/> diff --git a/addons/project/views/project_portal_templates.xml b/addons/project/views/project_portal_templates.xml index b76a27479b95d7e65b9b086a610959877c67fae9..2ac7e60469345588b854934486d59a0c625afc55 100644 --- a/addons/project/views/project_portal_templates.xml +++ b/addons/project/views/project_portal_templates.xml @@ -91,7 +91,7 @@ <h6>Customer</h6> <div class="row"> <div class="col flex-grow-0 pr-3"> - <img t-if="project.partner_id.image" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(project.partner_id.image)" alt="Contact"/> + <img t-if="project.partner_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(project.partner_id.image_1024)" alt="Contact"/> <img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/> </div> <div class="col pl-sm-0"> @@ -103,7 +103,7 @@ <h6>Project Manager</h6> <div class="row"> <div class="col flex-grow-0 pr-3"> - <img t-if="project.user_id.image" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(project.user_id.image)" alt="Contact"/> + <img t-if="project.user_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(project.user_id.image_1024)" alt="Contact"/> <img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/> </div> <div class="col pl-sm-0"> @@ -205,7 +205,7 @@ <strong>Assigned to</strong> <div class="row"> <div class="col flex-grow-0 pr-3"> - <img t-if="task.user_id.image" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(task.user_id.image)" alt="Contact"/> + <img t-if="task.user_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(task.user_id.image_1024)" alt="Contact"/> <img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/> </div> <div class="col pl-md-0"> @@ -217,7 +217,7 @@ <strong>Reported by</strong> <div class="row"> <div class="col flex-grow-0 pr-3"> - <img t-if="task.partner_id.image" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(task.partner_id.image)" alt="Contact"/> + <img t-if="task.partner_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(task.partner_id.image_1024)" alt="Contact"/> <img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/> </div> <div class="col pl-md-0"> diff --git a/addons/project/views/project_rating_templates.xml b/addons/project/views/project_rating_templates.xml index a016e3e77b229aac9fa8731f573ca5d3b2f24b12..a1b8613ccb3896c36146b8838003999c9510ab6d 100644 --- a/addons/project/views/project_rating_templates.xml +++ b/addons/project/views/project_rating_templates.xml @@ -77,8 +77,8 @@ <t t-foreach="partner_stats.values()" t-as="partner_stat"> <div class="row mt8" t-if="partner_stat['total']" title="Top 5 partner ratings of last 15 days."> <div class="col-md-1"> - <img t-if="partner_stat['rated_partner'].image" class="o_top_partner_image" t-att-src="image_data_uri(partner_stat['rated_partner'].image)" alt="Rated partner"/> - <img t-if="not partner_stat['rated_partner'].image" class="o_top_partner_image" src='/web/static/src/img/placeholder.png' alt="Placeholder"/> + <img t-if="partner_stat['rated_partner'].image_1024" class="o_top_partner_image" t-att-src="image_data_uri(partner_stat['rated_partner'].image_1024)" alt="Rated partner"/> + <img t-if="not partner_stat['rated_partner'].image_1024" class="o_top_partner_image" src='/web/static/src/img/placeholder.png' alt="Placeholder"/> </div> <div class="col-md-4 o_smiley_no_padding_right"> <span class="ml8" t-esc="partner_stat['rated_partner'].name"/> @@ -126,8 +126,8 @@ <div t-attf-id="rating_#{rating.id}" class="container d-none"> <div class="row"> <div class="col-lg-2"> - <img t-if="rating.partner_id.image" class="o_top_partner_image" t-att-src="image_data_uri(rating.partner_id.image)" alt="Rated partner"/> - <img t-if="not rating.partner_id.image" class="o_top_partner_image" src='/web/static/src/img/placeholder.png' alt="Placeholder"/> + <img t-if="rating.partner_id.image_1024" class="o_top_partner_image" t-att-src="image_data_uri(rating.partner_id.image_1024)" alt="Rated partner"/> + <img t-if="not rating.partner_id.image_1024" class="o_top_partner_image" src='/web/static/src/img/placeholder.png' alt="Placeholder"/> </div> <div class="col-lg-10"> <div class="mt4"> diff --git a/addons/sale/views/sale_portal_templates.xml b/addons/sale/views/sale_portal_templates.xml index b6264bb8534fb276f8e7dee667130b3594e80e1b..d67a37a52878b21557ff618ca69ce328b2844a43 100644 --- a/addons/sale/views/sale_portal_templates.xml +++ b/addons/sale/views/sale_portal_templates.xml @@ -184,8 +184,8 @@ <div class="small mb-1"><strong class="text-muted">Salesperson</strong></div> <div class="row flex-nowrap"> <div class="col flex-grow-0 pr-2"> - <img class="rounded-circle mr4 float-left o_portal_contact_img" t-if="sale_order.user_id.image" t-att-src="image_data_uri(sale_order.user_id.image)" alt="Contact"/> - <img class="rounded-circle mr4 float-left o_portal_contact_img" t-if="not sale_order.user_id.image" src="/web/static/src/img/placeholder.png" alt="Contact"/> + <img class="rounded-circle mr4 float-left o_portal_contact_img" t-if="sale_order.user_id.image_1024" t-att-src="image_data_uri(sale_order.user_id.image_1024)" alt="Contact"/> + <img class="rounded-circle mr4 float-left o_portal_contact_img" t-if="not sale_order.user_id.image_1024" src="/web/static/src/img/placeholder.png" alt="Contact"/> </div> <div class="col pl-0" style="min-width: 150px"> <span t-field="sale_order.user_id" t-options='{"widget": "contact", "fields": ["name", "phone"], "no_marker": True}'/> diff --git a/addons/stock/data/stock_demo.xml b/addons/stock/data/stock_demo.xml index ceaf8bad0aa83f7a4821a14b678de8e9b86acca1..2566a0979bd420c3b86ffeddeed76419157cc7e7 100644 --- a/addons/stock/data/stock_demo.xml +++ b/addons/stock/data/stock_demo.xml @@ -152,7 +152,7 @@ <field name="parent_id" ref="res_partner_company_1"/> <field name="email">jeff.lawson52@example.com</field> <field name="phone">(461)-417-6587</field> - <field name="image" type="base64" file="stock/static/img/res_partner_address_41.jpg"/> + <field name="image_1920" type="base64" file="stock/static/img/res_partner_address_41.jpg"/> </record> <record id="res_company_1" model="res.company"> diff --git a/addons/stock_landed_costs/views/stock_landed_cost_views.xml b/addons/stock_landed_costs/views/stock_landed_cost_views.xml index d30a98cd2b99f4f5c5bda1895be4bf96e269b4a1..8169f4b3f1fae569c2a1b8fa6c5e207cb1f6205b 100644 --- a/addons/stock_landed_costs/views/stock_landed_cost_views.xml +++ b/addons/stock_landed_costs/views/stock_landed_cost_views.xml @@ -205,7 +205,7 @@ <form string="Landed Costs"> <sheet> <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/> - <field name="image_128" widget="image" class="oe_avatar"/> + <field name="image_1920" widget="image" class="oe_avatar" options="{'image_preview': 'image_128'}"/> <div class="oe_title"> <div class="oe_edit_only"> <label for="name" name='label_name' string="Product Name"/> diff --git a/addons/survey/views/gamification_badge_views.xml b/addons/survey/views/gamification_badge_views.xml index e9f03f859365e22231fbc0d5361ea668df686a8f..fa404edf6e223464ed7c0d6bdbd6e2a3a0116bd4 100644 --- a/addons/survey/views/gamification_badge_views.xml +++ b/addons/survey/views/gamification_badge_views.xml @@ -8,7 +8,7 @@ <form string="Badge"> <sheet> <div class="oe_button_box" name="button_box"/> - <field name="image" widget='image' class="oe_avatar"/> + <field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/> <div class="oe_title"> <label for="name" class="oe_edit_only"/> <h1> diff --git a/addons/website/tests/template_qweb_test.xml b/addons/website/tests/template_qweb_test.xml index 423c8d3212e6cb89d9844f849200e91f8cde1851..ac7dd4e390fbcf34110e3adde60c4411e755910b 100644 --- a/addons/website/tests/template_qweb_test.xml +++ b/addons/website/tests/template_qweb_test.xml @@ -28,7 +28,7 @@ <a href="/web/content/local_link">x</a> <span t-attf-style="background-image: url('/web/image/2')" t-att-empty="False">xxx</span> <div widget="html" t-field="user.signature"/> - <div widget="image" t-field="user.image" t-options="{'widget': 'image'}"/> + <div widget="image" t-field="user.image_1920" t-options="{'widget': 'image'}"/> </body> </html> </template> diff --git a/addons/website/tests/test_qweb.py b/addons/website/tests/test_qweb.py index 8e2eb382a408e8f5b9b7d995de787efb447c4c6d..9386c9f81e346fd6e59040ff73def6432738bebd 100644 --- a/addons/website/tests/test_qweb.py +++ b/addons/website/tests/test_qweb.py @@ -57,7 +57,7 @@ class TestQweb(TransactionCase): <div widget="html"><span class="toto"> span<span class="fa"></span><img src="http://test.cdn/web/image/1"> </span></div> - <div widget="image"><img src="http://test.cdn/web/image/res.users/%(user_id)s/image/%(filename)s" class="img img-fluid" alt="%(alt)s"/></div> + <div widget="image"><img src="http://test.cdn/web/image/res.users/%(user_id)s/image_1920/%(filename)s" class="img img-fluid" alt="%(alt)s"/></div> </body> </html>""" % { "js": attachments[0].url, diff --git a/addons/website_blog/static/src/js/website_blog.editor.js b/addons/website_blog/static/src/js/website_blog.editor.js index 2eedfc78b2e24f6ce533a01bfcd18189dbaa1c85..1342d32201f02097ac1d0458485107af151ca853 100644 --- a/addons/website_blog/static/src/js/website_blog.editor.js +++ b/addons/website_blog/static/src/js/website_blog.editor.js @@ -127,7 +127,7 @@ options.registry.many2one.include({ var $img = $(this).find('img'); var css = window.getComputedStyle($img[0]); $img.css({ width: css.width, height: css.height }); - $img.attr('src', '/web/image/res.partner/'+self.ID+'/image'); + $img.attr('src', '/web/image/res.partner/'+self.ID+'/image_1024'); }); setTimeout(function () { $nodes.removeClass('o_dirty'); },0); } diff --git a/addons/website_event_track/models/event_track.py b/addons/website_event_track/models/event_track.py index b347d6ffb538b2bb3201e02e688ee2b449ca992b..20b146f0f845050dc4e6a0db5dc3689e31d6c1b6 100644 --- a/addons/website_event_track/models/event_track.py +++ b/addons/website_event_track/models/event_track.py @@ -88,7 +88,7 @@ class Track(models.Model): ('0', 'Low'), ('1', 'Medium'), ('2', 'High'), ('3', 'Highest')], 'Priority', required=True, default='1') - image = fields.Binary('Image', related='partner_id.image_128', store=True, readonly=False) + image = fields.Image("Image", related='partner_id.image_128', store=True, readonly=False) @api.depends('name') def _compute_website_url(self): @@ -202,4 +202,4 @@ class Sponsor(models.Model): partner_id = fields.Many2one('res.partner', 'Sponsor/Customer', required=True) url = fields.Char('Sponsor Website') sequence = fields.Integer('Sequence', store=True, related='sponsor_type_id.sequence', readonly=False) - image_128 = fields.Binary(string='Logo', related='partner_id.image_128', store=True, readonly=False) + image_128 = fields.Image(string="Logo", related='partner_id.image_128', store=True, readonly=False) diff --git a/addons/website_forum/models/forum.py b/addons/website_forum/models/forum.py index 3bd01177ec70092298e6093c16d15730a5341ef6..8056381da9608dd67810504b83c931b9a65d3d2a 100644 --- a/addons/website_forum/models/forum.py +++ b/addons/website_forum/models/forum.py @@ -388,7 +388,7 @@ class Post(models.Model): res = super(Post, self)._default_website_meta() res['default_opengraph']['og:title'] = res['default_twitter']['twitter:title'] = self.name res['default_opengraph']['og:description'] = res['default_twitter']['twitter:description'] = self.plain_content - res['default_opengraph']['og:image'] = res['default_twitter']['twitter:image'] = "/web/image/res.users/%s/image" % (self.create_uid.id) + res['default_opengraph']['og:image'] = res['default_twitter']['twitter:image'] = "/web/image/res.users/%s/image_1024" % (self.create_uid.id) res['default_twitter']['twitter:card'] = 'summary' res['default_meta_description'] = self.plain_content return res diff --git a/addons/website_partner/views/website_partner_templates.xml b/addons/website_partner/views/website_partner_templates.xml index 2f5c58b1dee449d7d996df69606ecd521448016a..60adb04ee2dc92646b67bc9951b1d0f4052f3384 100644 --- a/addons/website_partner/views/website_partner_templates.xml +++ b/addons/website_partner/views/website_partner_templates.xml @@ -17,7 +17,7 @@ <template id="partner_detail" name="Partner Details"> <h1 class="col-lg-12 text-center" id="partner_name" t-field="partner.display_name"/> <div class="col-lg-4"> - <div t-field="partner.image" t-options='{"widget": "image", "class": "d-block mx-auto mb16", "max_width": 512}'/> + <div t-field="partner.image_1920" t-options='{"widget": "image", "preview_image": "image_512", "class": "d-block mx-auto mb16"}'/> <address> <div t-field="partner.self" t-options='{ "widget": "contact", diff --git a/addons/website_profile/views/website_profile.xml b/addons/website_profile/views/website_profile.xml index 1a06cdee7a9581066babc29ab9220f867acded88..b5470a833a9ab343b01bd6e4e1fc07a9fb5fa692 100644 --- a/addons/website_profile/views/website_profile.xml +++ b/addons/website_profile/views/website_profile.xml @@ -206,7 +206,7 @@ <!-- ==== Header Left ==== --> <div class="col-12 col-md-4 col-lg-3"> <div t-attf-class="d-flex align-items-start h-100 #{'justify-content-between' if (request.env.user == user) else 'justify-content-around' }"> - <div class="o_wprofile_pict d-inline-block mb-3 mb-md-0" t-attf-style="background-image:url(/web/image/res.users/#{user.id}/image)"/> + <div class="o_wprofile_pict d-inline-block mb-3 mb-md-0" t-attf-style="background-image:url(/web/image/res.users/#{user.id}/image_1024)"/> <a class="btn btn-primary d-inline-block d-md-none" t-if="request.env.user == user and user.karma != 0" t-attf-href="/profile/edit?url_param=#{edit_button_url_param}"> <i class="fa fa-pencil mr-1"/>EDIT </a> @@ -406,7 +406,7 @@ <t t-foreach="ranks" t-as="rank"> <li t-attf-class="list-group-item"> <div class="media align-items-center"> - <img width="40" t-attf-src="/web/image/gamification.karma.rank/#{rank.id}/image" class="mr-2" alt="Rank badge"/> + <img width="40" t-attf-src="/web/image/gamification.karma.rank/#{rank.id}/image_64" class="mr-2" alt="Rank badge"/> <div class="media-body"> <h5 class="mt-0 mb-0" t-field="rank.name"/> <span class="badge badge-success"><span t-field="rank.karma_min"/></span> point<span t-if="rank.karma_min">s</span> @@ -437,9 +437,9 @@ <table class="table table-sm mb64"> <tr t-foreach="badges" t-as="badge"> <td class="align-middle"> - <img t-if="not badge.image and badge.level" t-attf-src="/website_profile/static/src/img/badge_#{badge.level}.svg" + <img t-if="not badge.image_1920 and badge.level" t-attf-src="/website_profile/static/src/img/badge_#{badge.level}.svg" class="my-1" style="height:2.5em" t-att-alt="badge.name"/> - <img t-else="" t-attf-src="/web/image/gamification.badge/#{badge.id}/image" class="my-1" style="height:2.5em" t-att-alt="badge.name"/> + <img t-else="" t-attf-src="/web/image/gamification.badge/#{badge.id}/image_1024" class="my-1" style="height:2.5em" t-att-alt="badge.name"/> <h6 t-field="badge.name" class="d-inline my-0"/> </td> <td class="align-middle d-none d-md-table-cell"> diff --git a/addons/website_sale/models/product.py b/addons/website_sale/models/product.py index 644457566a7572377fa94f54916c564b038dc6ff..d8b22e6dfc91397cb05e325d02dbab986b8ded1b 100644 --- a/addons/website_sale/models/product.py +++ b/addons/website_sale/models/product.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import api, fields, models, tools, _ +from odoo import api, fields, models, _ from odoo.exceptions import ValidationError, UserError from odoo.addons.website.models import ir_http from odoo.tools.translate import html_translate @@ -137,7 +137,7 @@ class ProductPricelist(models.Model): class ProductPublicCategory(models.Model): _name = "product.public.category" - _inherit = ["website.seo.metadata", "website.multi.mixin"] + _inherit = ["website.seo.metadata", "website.multi.mixin", 'image.mixin'] _description = "Website Product Category" _parent_store = True _order = "sequence, name" @@ -148,32 +148,9 @@ class ProductPublicCategory(models.Model): child_id = fields.One2many('product.public.category', 'parent_id', string='Children Categories') parents_and_self = fields.Many2many('product.public.category', compute='_compute_parents_and_self') sequence = fields.Integer(help="Gives the sequence order when displaying a list of product categories.", index=True) - # NOTE: there is no 'default image', because by default we don't show - # thumbnails for categories. However if we have a thumbnail for at least one - # category, then we display a default image on the other, so that the - # buttons have consistent styling. - # In this case, the default image is set by the js code. - image = fields.Binary(help="This field holds the image used as image for the category, limited to 1024x1024px.") website_description = fields.Html('Category Description', sanitize_attributes=False, translate=html_translate) - image_128 = fields.Binary(string='Medium-sized image', - help="Medium-sized image of the category. It is automatically " - "resized as a 128x128px image, with aspect ratio preserved. " - "Use this field in form views or some kanban views.") - image_64 = fields.Binary(string='Small-sized image', - help="Small-sized image of the category. It is automatically " - "resized as a 64x64px image, with aspect ratio preserved. " - "Use this field anywhere a small image is required.") product_tmpl_ids = fields.Many2many('product.template', relation='product_public_category_product_template_rel') - @api.model - def create(self, vals): - tools.image_resize_images(vals) - return super(ProductPublicCategory, self).create(vals) - - def write(self, vals): - tools.image_resize_images(vals) - return super(ProductPublicCategory, self).write(vals) - @api.constrains('parent_id') def check_parent_id(self): if not self._check_recursion(): diff --git a/addons/website_sale/views/product_views.xml b/addons/website_sale/views/product_views.xml index 373ea27bde5b6e6b2d6d7dc11d236fb50fc0d344..43284ead368325a0111b48540a35172e5406ea43 100644 --- a/addons/website_sale/views/product_views.xml +++ b/addons/website_sale/views/product_views.xml @@ -145,7 +145,7 @@ <field name="arch" type="xml"> <form string="Website Public Categories"> <sheet> - <field name="image_128" widget='image' class="oe_avatar"/> + <field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/> <div class="oe_left"> <group> <field name="name"/> diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py index 2f12ab7277581c7eb9e152bcde7aefadb6d0ddfb..57c25a04af0b026fb8f92f8c5fae53238eae11a3 100644 --- a/addons/website_slides/controllers/main.py +++ b/addons/website_slides/controllers/main.py @@ -324,7 +324,7 @@ class WebsiteSlides(WebsiteProfile): return request.env['res.users'].sudo().search_read([ ('karma', '>', 0), ('website_published', '=', True), - ('image', '!=', False)], ['id'], limit=3, order='karma desc') + ('image_1920', '!=', False)], ['id'], limit=3, order='karma desc') @http.route([ '/slides/<model("slide.channel"):channel>', diff --git a/addons/website_slides/data/gamification_data.xml b/addons/website_slides/data/gamification_data.xml index 4bf7a829b9d989b7247219391e452110dac04ee5..08606251fad898ed80d9651f8ec321b6e2c86f33 100644 --- a/addons/website_slides/data/gamification_data.xml +++ b/addons/website_slides/data/gamification_data.xml @@ -5,7 +5,7 @@ <record id="badge_data_register" model="gamification.badge"> <field name="name">Get started</field> <field name="description">Register to the platform</field> - <field name="image" type="base64" file="website_slides/static/src/img/standard_badge_bronze.svg"/> + <field name="image_1920" type="base64" file="website_slides/static/src/img/standard_badge_bronze.svg"/> <field name="website_published" eval="True"/> <field name="level">bronze</field> <field name="rule_auth">nobody</field> @@ -46,7 +46,7 @@ <record id="badge_data_profile" model="gamification.badge"> <field name="name">Know yourself</field> <field name="description">Complete your profile</field> - <field name="image" type="base64" file="website_slides/static/src/img/standard_badge_bronze.svg"/> + <field name="image_1920" type="base64" file="website_slides/static/src/img/standard_badge_bronze.svg"/> <field name="website_published" eval="True"/> <field name="level">bronze</field> <field name="rule_auth">nobody</field> @@ -88,7 +88,7 @@ <record id="badge_data_course" model="gamification.badge"> <field name="name">Power User</field> <field name="description">Complete a course</field> - <field name="image" type="base64" file="website_slides/static/src/img/standard_badge_silver.svg"/> + <field name="image_1920" type="base64" file="website_slides/static/src/img/standard_badge_silver.svg"/> <field name="website_published" eval="True"/> <field name="level">silver</field> <field name="rule_auth">nobody</field> @@ -128,7 +128,7 @@ <record id="badge_data_certification" model="gamification.badge"> <field name="name">Certified Knowledge</field> <field name="description">Get a certification</field> - <field name="image" type="base64" file="website_slides/static/src/img/standard_badge_gold.svg"/> + <field name="image_1920" type="base64" file="website_slides/static/src/img/standard_badge_gold.svg"/> <field name="website_published" eval="False"/> <field name="level">gold</field> <field name="rule_auth">nobody</field> @@ -169,7 +169,7 @@ <record id="badge_data_karma" model="gamification.badge"> <field name="name">Community hero</field> <field name="description">Reach 2000 XP</field> - <field name="image" type="base64" file="website_slides/static/src/img/standard_badge_gold.svg"/> + <field name="image_1920" type="base64" file="website_slides/static/src/img/standard_badge_gold.svg"/> <field name="website_published" eval="True"/> <field name="level">gold</field> <field name="rule_auth">nobody</field> diff --git a/odoo/addons/base/data/res_partner_data.xml b/odoo/addons/base/data/res_partner_data.xml index ee4b4fbf31cf7fec9fdfcd3382ebc68b8d1e54f4..951240cf6ae8a8c70722a16a12e4117e73718849 100644 --- a/odoo/addons/base/data/res_partner_data.xml +++ b/odoo/addons/base/data/res_partner_data.xml @@ -11,7 +11,7 @@ <field name="phone"></field> <field name="email">info@yourcompany.com</field> <field name="website">www.yourcompany.com</field> - <field name="image" type="base64" file="base/static/img/res_company_logo.png"/> + <field name="image_1920" type="base64" file="base/static/img/res_company_logo.png"/> </record> <record model="res.partner" id="base.partner_root"> @@ -25,7 +25,7 @@ <field name="name">Administrator</field> <field name="company_id" ref="main_company"/> <field name="email">admin@example.com</field> - <field name="image" type="base64" file="base/static/img/avatar_grey.png"/> + <field name="image_1920" type="base64" file="base/static/img/avatar_grey.png"/> </record> <record id="public_partner" model="res.partner"> diff --git a/odoo/addons/base/data/res_partner_demo.xml b/odoo/addons/base/data/res_partner_demo.xml index 39e3c8dedd6e21c5c7d321d37dc88fed80607913..3f97483710a34883491460ee958b52adaa9d38b5 100644 --- a/odoo/addons/base/data/res_partner_demo.xml +++ b/odoo/addons/base/data/res_partner_demo.xml @@ -51,7 +51,7 @@ <field name="email">wood.corner26@example.com</field> <field name="phone">(623)-853-7197</field> <field name="website">http://www.wood-corner.com</field> - <field name="image" type="base64" file="base/static/img/res_partner_1-image.png"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_1-image.png"/> </record> <record id="res_partner_2" model="res.partner"> <field name="name">Deco Addict</field> @@ -65,7 +65,7 @@ <field name="email">deco.addict82@example.com</field> <field name="phone">(603)-996-3829</field> <field name="website">http://www.deco-addict.com</field> - <field name="image" type="base64" file="base/static/img/res_partner_2-image.png"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_2-image.png"/> </record> <record id="res_partner_3" model="res.partner"> <field name="name">Gemini Furniture</field> @@ -79,9 +79,9 @@ <field name="email">gemini.furniture39@example.com</field> <field name="phone">(941)-284-4875</field> <field name="website">http://www.gemini-furniture.com/</field> - <field name="image" type="base64" file="base/static/img/res_partner_3-image.png"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_3-image.png"/> </record> - + <record id="res_partner_4" model="res.partner"> <field name="name">Ready Mat</field> <field eval="[(6, 0, [ref('res_partner_category_14'), ref('res_partner_category_12')])]" name="category_id"/> @@ -94,7 +94,7 @@ <field name="email">ready.mat28@example.com</field> <field name="phone">(803)-873-6126</field> <field name="website">http://www.ready-mat.com/</field> - <field name="image" type="base64" file="base/static/img/res_partner_4-image.png"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_4-image.png"/> </record> <record id="res_partner_10" model="res.partner"> @@ -107,9 +107,9 @@ <field name="country_id" ref="base.us"/> <field name="email">jackson.group82@example.com</field> <field name="phone">(334)-502-1024</field> - <field name="image" type="base64" file="base/static/img/res_partner_10-image.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_10-image.jpg"/> </record> - + <record id="res_partner_12" model="res.partner"> <field name="name">Azure Interior</field> <field eval="[(6, 0, [ref('res_partner_category_11')])]" name="category_id"/> @@ -122,7 +122,7 @@ <field name="country_id" ref="base.us"/> <field name="email">azure.Interior24@example.com</field> <field name="website">http://www.azure-interior.com</field> - <field name="image" type="base64" file="base/static/img/res_partner_12-image.png"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_12-image.png"/> </record> <record id="res_partner_18" model="res.partner"> @@ -136,7 +136,7 @@ <field name="phone">(828)-316-0593</field> <field name="country_id" ref="base.us"/> <field name="website">http://www.lumber-inc.com</field> - <field name="image" type="base64" file="base/static/img/res_partner_18-image.png"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_18-image.png"/> </record> <record id="res_partner_address_1" model="res.partner"> diff --git a/odoo/addons/base/data/res_partner_image_demo.xml b/odoo/addons/base/data/res_partner_image_demo.xml index a74973eedb4a3e65bec1087672d8c79eb482e3f4..d70d8624ad8fc34345487363a9608e5a4b9b6703 100644 --- a/odoo/addons/base/data/res_partner_image_demo.xml +++ b/odoo/addons/base/data/res_partner_image_demo.xml @@ -3,103 +3,103 @@ <data noupdate="0"> <record id="base.res_partner_address_1" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_1.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_1.jpg"/> </record> <record id="base.res_partner_address_2" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_2.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_2.jpg"/> </record> <record id="base.res_partner_address_3" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_3.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_3.jpg"/> </record> <record id="base.res_partner_address_4" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_4.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_4.jpg"/> </record> <record id="base.res_partner_address_5" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_5.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_5.jpg"/> </record> <record id="base.res_partner_address_7" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_7.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_7.jpg"/> </record> <record id="base.res_partner_address_10" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_10.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_10.jpg"/> </record> <record id="base.res_partner_address_11" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_11.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_11.jpg"/> </record> <record id="base.res_partner_address_13" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_13.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_13.jpg"/> </record> <record id="base.res_partner_address_14" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_14.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_14.jpg"/> </record> <record id="base.res_partner_address_15" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_15.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_15.jpg"/> </record> <record id="base.res_partner_address_16" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_16.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_16.jpg"/> </record> <record id="base.res_partner_address_17" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_17.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_17.jpg"/> </record> <record id="base.res_partner_address_18" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_18.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_18.jpg"/> </record> <record id="base.res_partner_address_24" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_24.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_24.jpg"/> </record> <record id="base.res_partner_address_25" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_25.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_25.jpg"/> </record> <record id="base.res_partner_address_27" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_27.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_27.jpg"/> </record> <record id="base.res_partner_address_28" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_28.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_28.jpg"/> </record> <record id="base.res_partner_address_30" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_30.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_30.jpg"/> </record> <record id="base.res_partner_address_31" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_31.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_31.jpg"/> </record> <record id="base.res_partner_address_32" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_32.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_32.jpg"/> </record> <record id="base.res_partner_address_33" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_33.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_33.jpg"/> </record> <record id="base.res_partner_address_34" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_address_34.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_address_34.jpg"/> </record> <record id="base.res_partner_main1" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_main1.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_main1.jpg"/> </record> <record id="base.res_partner_main2" model="res.partner"> - <field name="image" type="base64" file="base/static/img/res_partner_main2.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/res_partner_main2.jpg"/> </record> </data> diff --git a/odoo/addons/base/data/res_users_data.xml b/odoo/addons/base/data/res_users_data.xml index f274489fb1d9ed4683a5f95d1629ac7ea2bbeae1..6439180c2a757bfbfacb9863ed4ef75d6c40fff3 100644 --- a/odoo/addons/base/data/res_users_data.xml +++ b/odoo/addons/base/data/res_users_data.xml @@ -36,7 +36,7 @@ Administrator</span>]]></field> <field name="password"></field> <!-- Avoid auto-including this demo user in any default group --> <field name="groups_id" eval="[(6,0,[])]"/> - <field name="image" type="base64" file="base/static/img/public_user-image.png"/> + <field name="image_1920" type="base64" file="base/static/img/public_user-image.png"/> <field name="partner_id" ref="public_partner"/> <field name="active" eval="False"/> </record> diff --git a/odoo/addons/base/data/res_users_demo.xml b/odoo/addons/base/data/res_users_demo.xml index 4f4c580dfb8cae9612a76d0d4d703afa3c2d0699..980c4d2b3bc08dff099c86cd169e9ea05f4133a5 100644 --- a/odoo/addons/base/data/res_users_demo.xml +++ b/odoo/addons/base/data/res_users_demo.xml @@ -36,7 +36,7 @@ <field name="signature" type="xml"><span>-- <br/>+Mr Demo</span></field> <field name="company_id" ref="main_company"/> <field name="groups_id" eval="[(6,0,[ref('base.group_user'), ref('base.group_partner_manager')])]"/> - <field name="image" type="base64" file="base/static/img/user_demo-image.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/user_demo-image.jpg"/> </record> <record model="res.partner" id="base.partner_root"> @@ -55,7 +55,7 @@ <field name="phone">+1 555-555-5555</field> <field name="email">admin@yourcompany.example.com</field> <field name="tz">Europe/Brussels</field> - <field name="image" type="base64" file="base/static/img/partner_root-image.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/partner_root-image.jpg"/> </record> @@ -69,7 +69,7 @@ <field name="zip">07002</field> <field name="country_id" ref="base.us"/> <field name="company_name">YourCompany</field> - <field name="image" type="base64" file="base/static/img/partner_demo_portal.jpg"/> + <field name="image_1920" type="base64" file="base/static/img/partner_demo_portal.jpg"/> <field name="phone">(683)-556-5104</field> </record> <record id="demo_user0" model="res.users" context="{'no_reset_password': True}"> diff --git a/odoo/addons/base/models/res_company.py b/odoo/addons/base/models/res_company.py index cc5ddc750875f04366c6015e001758b3b28e669a..17c4e95446f142312f9628855529181f142eadcc 100644 --- a/odoo/addons/base/models/res_company.py +++ b/odoo/addons/base/models/res_company.py @@ -70,7 +70,7 @@ class Company(models.Model): partner_id = fields.Many2one('res.partner', string='Partner', required=True) report_header = fields.Text(string='Company Tagline', help="Appears by default on the top right corner of your printed documents (report header).") report_footer = fields.Text(string='Report Footer', translate=True, help="Footer text displayed at the bottom of all reports.") - logo = fields.Binary(related='partner_id.image', default=_get_logo, string="Company Logo", readonly=False) + logo = fields.Binary(related='partner_id.image_1920', default=_get_logo, string="Company Logo", readonly=False) # logo_web: do not store in attachments, since the image is retrieved in SQL for # performance reasons (see addons/web/controllers/main.py, Binary.company_logo) logo_web = fields.Binary(compute='_compute_logo_web', store=True, attachment=False) @@ -154,10 +154,10 @@ class Company(models.Model): for company in self: company.partner_id.country_id = company.country_id - @api.depends('partner_id', 'partner_id.image') + @api.depends('partner_id.image_1920') def _compute_logo_web(self): for company in self: - company.logo_web = tools.image_process(company.partner_id.image, size=(180, 0)) + company.logo_web = tools.image_process(company.partner_id.image_1920, size=(180, 0)) @api.onchange('state_id') def _onchange_state(self): @@ -218,7 +218,7 @@ class Company(models.Model): partner = self.env['res.partner'].create({ 'name': vals['name'], 'is_company': True, - 'image': vals.get('logo'), + 'image_1920': vals.get('logo'), 'email': vals.get('email'), 'phone': vals.get('phone'), 'website': vals.get('website'), diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py index 9ffacd4913f8fd94ed4616a646c65e44a2197cb0..c4671db916adf25c507a4db1d5b27834e649cfab 100644 --- a/odoo/addons/base/models/res_partner.py +++ b/odoo/addons/base/models/res_partner.py @@ -15,7 +15,7 @@ import requests from lxml import etree from werkzeug import urls -from odoo import api, fields, models, tools, SUPERUSER_ID, _ +from odoo import api, fields, models, tools, _ from odoo.modules import get_module_resource from odoo.osv.expression import get_unaccent_wrapper from odoo.exceptions import UserError, ValidationError @@ -130,7 +130,7 @@ class PartnerTitle(models.Model): class Partner(models.Model): _description = 'Contact' - _inherit = ['format.address.mixin'] + _inherit = ['format.address.mixin', 'image.mixin'] _name = "res.partner" _order = "display_name" @@ -220,16 +220,6 @@ class Partner(models.Model): store=True) company_name = fields.Char('Company Name') - # image: all image fields are base64 encoded and PIL-supported - image = fields.Binary("Image") - image_128 = fields.Binary("Medium-sized image", - help="Medium-sized image of this contact. It is automatically "\ - "resized as a 128x128px image, with aspect ratio preserved. "\ - "Use this field in form views or some kanban views.") - image_64 = fields.Binary("Small-sized image", - help="Small-sized image of this contact. It is automatically "\ - "resized as a 64x64px image, with aspect ratio preserved. "\ - "Use this field anywhere a small image is required.") # hack to allow using plain browse record in qweb views, and used in ir.qweb.field.contact self = fields.Many2one(comodel_name=_name, compute='_compute_get_ids') @@ -329,7 +319,7 @@ class Partner(models.Model): colorize, img_path, image_base64 = False, False, False if partner_type in ['other'] and parent_id: - parent_image = self.browse(parent_id).image + parent_image = self.browse(parent_id).image_1920 image_base64 = parent_image or None if not image_base64 and partner_type == 'invoice': @@ -348,7 +338,7 @@ class Partner(models.Model): if image_base64 and colorize: image_base64 = tools.image_process(image_base64, colorize=True) - return tools.image_process(image_base64, size=(1024, 1024)) + return image_base64 @api.model def _fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): @@ -408,8 +398,8 @@ class Partner(models.Model): @api.onchange('email') def onchange_email(self): - if not self.image and self._context.get('gravatar_image') and self.email: - self.image = self._get_gravatar_image(self.email) + if not self.image_1920 and self._context.get('gravatar_image') and self.email: + self.image_1920 = self._get_gravatar_image(self.email) @api.onchange('parent_id', 'company_id') def _onchange_company_id(self): @@ -568,10 +558,6 @@ class Partner(models.Model): if len(companies) > 1 or company not in companies: raise UserError( ("The selected company is not compatible with the companies of the related user(s)")) - # no padding on the big image, because it's used as website logo - tools.image_resize_images(vals, return_big=False) - tools.image_resize_images(vals, return_medium=False, return_small=False) - result = True # To write in SUPERUSER on field is_company and avoid access rights problems. if 'is_company' in vals and self.user_has_groups('base.group_partner_manager') and not self.env.su: @@ -595,11 +581,8 @@ class Partner(models.Model): vals['company_name'] = False # compute default image in create, because computing gravatar in the onchange # cannot be easily performed if default images are in the way - if not vals.get('image'): - vals['image'] = self._get_default_image(vals.get('type'), vals.get('is_company'), vals.get('parent_id')) - # no padding on the big image, because it's used as website logo - tools.image_resize_images(vals, return_big=False) - tools.image_resize_images(vals, return_medium=False, return_small=False) + if not vals.get('image_1920'): + vals['image_1920'] = self._get_default_image(vals.get('type'), vals.get('is_company'), vals.get('parent_id')) partners = super(Partner, self).create(vals_list) if self.env.context.get('_partners_skip_fields_sync'): diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py index 96d747ecb0749564683ed855f5fc813d4b9e3437..7606124f223f9191530c84cfeae6fd863eae9988 100644 --- a/odoo/addons/base/models/res_users.py +++ b/odoo/addons/base/models/res_users.py @@ -201,9 +201,9 @@ class Users(models.Model): __uid_cache = defaultdict(dict) # {dbname: {uid: password}} # User can write on a few of his own fields (but not his groups for example) - SELF_WRITEABLE_FIELDS = ['signature', 'action_id', 'company_id', 'email', 'name', 'image', 'image_128', 'image_64', 'lang', 'tz'] + SELF_WRITEABLE_FIELDS = ['signature', 'action_id', 'company_id', 'email', 'name', 'image_1920', 'lang', 'tz'] # User can read a few of his own fields - SELF_READABLE_FIELDS = ['signature', 'company_id', 'login', 'email', 'name', 'image', 'image_128', 'image_64', 'lang', 'tz', 'tz_offset', 'groups_id', 'partner_id', '__last_update', 'action_id'] + SELF_READABLE_FIELDS = ['signature', 'company_id', 'login', 'email', 'name', 'image_1920', 'image_1024', 'image_512', 'image_256', 'image_128', 'image_64', 'lang', 'tz', 'tz_offset', 'groups_id', 'partner_id', '__last_update', 'action_id'] def _default_groups(self): default_user = self.env.ref('base.default_user', raise_if_not_found=False) diff --git a/odoo/addons/base/tests/test_ir_http.py b/odoo/addons/base/tests/test_ir_http.py index 19ab037400fa17690a97c234f7bd4f224eec53fd..5d06b2f4293748f9104991917f1a2c20a2be5698 100644 --- a/odoo/addons/base/tests/test_ir_http.py +++ b/odoo/addons/base/tests/test_ir_http.py @@ -40,14 +40,14 @@ class test_ir_http_mimetype(common.TransactionCase): def test_ir_http_mimetype_basic_field(self): """ Test mimetype for classic field """ partner = self.env['res.partner'].create({ - 'image': GIF, + 'image_1920': GIF, 'name': 'Test mimetype basic field', }) status, headers, content = self.env['ir.http'].binary_content( model='res.partner', id=partner.id, - field='image', + field='image_1920', default_mimetype='application/octet-stream', ) mimetype = dict(headers).get('Content-Type') diff --git a/odoo/addons/base/tests/test_orm.py b/odoo/addons/base/tests/test_orm.py index b16d229b4955234724ae45e0738a08330c472ab6..b44c22f19cd10ff415be5ae6c57dcd95ca8760e2 100644 --- a/odoo/addons/base/tests/test_orm.py +++ b/odoo/addons/base/tests/test_orm.py @@ -364,7 +364,7 @@ class TestInherits(TransactionCase): write_date_before = user.write_date # write base64 image - user.write({'image': 'R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='}) + user.write({'image_1920': 'R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='}) write_date_after = user.write_date self.assertNotEqual(write_date_before, write_date_after) diff --git a/odoo/addons/base/views/res_partner_views.xml b/odoo/addons/base/views/res_partner_views.xml index 15c9a695c2eff427f7f3a39d8791677eae6a1245..7099f4b0850dc57d3830d8e4e864f65794933a97 100644 --- a/odoo/addons/base/views/res_partner_views.xml +++ b/odoo/addons/base/views/res_partner_views.xml @@ -67,7 +67,7 @@ <form string="Contact"> <field name="is_company" invisible="1"/> <field name="type" invisible="1"/> - <field name="image" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/> + <field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/> <div class="oe_title"> <field name="company_type" options="{'horizontal': true}" class="oe_edit_only" widget="radio" groups="base.group_no_one"/> <h1> @@ -97,7 +97,7 @@ <field name="priority" eval="20"/> <field name="arch" type="xml"> <form string="Partner"> - <field name="image" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}' readonly="1"/> + <field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}' readonly="1"/> <div class="oe_title"> <h1> <field name="name" readonly="1"/> @@ -135,7 +135,7 @@ <field name="arch" type="xml"> <form string="Partners"> <sheet> - <field name="image" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/> + <field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/> <div class="oe_title"> <field name="is_company" invisible="1"/> <field name="commercial_partner_id" invisible="1"/> @@ -205,7 +205,7 @@ <sheet> <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/> <div class="oe_button_box" name="button_box"/> - <field name="image" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/> + <field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/> <div class="oe_title"> <field name="is_company" invisible="1"/> <field name="commercial_partner_id" invisible="1"/> @@ -373,11 +373,11 @@ <field name="mobile" widget="phone"/> </group> <group colspan="1"> - <field name="image_128" widget="image" class="oe_avatar" nolabel="1"/> + <field name="image_1920" widget="image" class="oe_avatar" nolabel="1" options="{'image_preview': 'image_128'}"/> </group> </group> <field name="lang" invisible="True"/> - <field name="image" invisible="True"/> + <field name="image_1920" invisible="True"/> <field name="user_id" invisible="True"/> </sheet> </form> diff --git a/odoo/addons/base/views/res_users_views.xml b/odoo/addons/base/views/res_users_views.xml index 33d7e1008b2d0e3f51ef45330afc0f18709d640d..0ef4f47208cec44d60882f7b1e669817139c4787 100644 --- a/odoo/addons/base/views/res_users_views.xml +++ b/odoo/addons/base/views/res_users_views.xml @@ -125,7 +125,7 @@ <div class="alert alert-info text-center mb-3" attrs="{'invisible': [('id', '>', 0)]}" role="alert"> You are inviting a new user. </div> - <field name="image" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image": "image_128"}'/> + <field name="image_1920" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image": "image_128"}'/> <div class="oe_title"> <label for="name" class="oe_edit_only"/> <h1><field name="name" required="1"/></h1> @@ -189,7 +189,7 @@ <field name="partner_id" required="0" readonly="1"/> </div> </div> - <field name="image" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/> + <field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/> <div class="oe_title"> <label for="name" class="oe_edit_only"/> <h1><field name="name" required="1"/></h1> @@ -342,7 +342,7 @@ <field eval="18" name="priority"/> <field name="arch" type="xml"> <form string="Users"> - <field name="image" readonly="0" widget='image' class="oe_right oe_avatar" options='{"preview_image": "image_64"}'/> + <field name="image_1920" readonly="0" widget='image' class="oe_right oe_avatar" options='{"preview_image": "image_64"}'/> <h1> <field name="name" readonly="1" class="oe_inline"/> </h1> diff --git a/odoo/addons/test_impex/tests/test_load.py b/odoo/addons/test_impex/tests/test_load.py index 2765d458a405cec93e85cbb1e92e5af3b61b3e70..e558608c449f976d93f663c6851cd887689f134b 100644 --- a/odoo/addons/test_impex/tests/test_load.py +++ b/odoo/addons/test_impex/tests/test_load.py @@ -979,7 +979,7 @@ class test_o2m_multiple(ImporterCase): class test_realworld(common.TransactionCase): def test_bigfile(self): data = json.loads(pkgutil.get_data(self.__module__, 'contacts_big.json').decode('utf-8')) - result = self.env['res.partner'].load(['name', 'mobile', 'email', 'image'], data) + result = self.env['res.partner'].load(['name', 'mobile', 'email', 'image_1920'], data) self.assertFalse(result['messages']) self.assertEqual(len(result['ids']), len(data)) diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py index d12072a58a3bc266d2b29c94392e8bfe234bc282..49891ee6fd9f25d6f5ba2a407bea5d2321469fd9 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -1304,11 +1304,11 @@ class TestFields(common.TransactionCase): from odoo.addons.base.tests.test_mimetypes import SVG demo_user = self.env.ref('base.user_demo') # User demo changes his own avatar - demo_user.with_user(demo_user).image = SVG + demo_user.with_user(demo_user).image_1920 = SVG # The SVG file should have been neutered attachment = self.env['ir.attachment'].search([ ('res_model', '=', demo_user.partner_id._name), - ('res_field', '=', 'image'), + ('res_field', '=', 'image_1920'), ('res_id', '=', demo_user.partner_id.id), ]) self.assertEqual(attachment.mimetype, 'text/plain')