From f6c08161db7d8b0df2e8344f15a5c0b8362f20d9 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 13 Feb 2015 12:39:06 +0100 Subject: [PATCH 01/14] product_multi_image: Module totally redone from old product_images --- product_multi_image/README.rst | 39 +++ product_multi_image/__init__.py | 23 ++ product_multi_image/__openerp__.py | 38 +++ product_multi_image/i18n/sv.po | 22 ++ product_multi_image/models/__init__.py | 21 ++ product_multi_image/models/product_image.py | 164 +++++++++ product_multi_image/models/product_product.py | 84 +++++ product_multi_image/models/res_company.py | 38 +++ .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 14901 bytes .../static/description/icon.svg | 320 ++++++++++++++++++ .../views/product_image_view.xml | 99 ++++++ .../views/product_product_view.xml | 21 ++ .../views/res_company_view.xml | 18 + 14 files changed, 890 insertions(+) create mode 100644 product_multi_image/README.rst create mode 100644 product_multi_image/__init__.py create mode 100644 product_multi_image/__openerp__.py create mode 100644 product_multi_image/i18n/sv.po create mode 100644 product_multi_image/models/__init__.py create mode 100644 product_multi_image/models/product_image.py create mode 100644 product_multi_image/models/product_product.py create mode 100644 product_multi_image/models/res_company.py create mode 100644 product_multi_image/security/ir.model.access.csv create mode 100644 product_multi_image/static/description/icon.png create mode 100644 product_multi_image/static/description/icon.svg create mode 100644 product_multi_image/views/product_image_view.xml create mode 100644 product_multi_image/views/product_product_view.xml create mode 100644 product_multi_image/views/res_company_view.xml diff --git a/product_multi_image/README.rst b/product_multi_image/README.rst new file mode 100644 index 000000000000..efe9f9c8f7eb --- /dev/null +++ b/product_multi_image/README.rst @@ -0,0 +1,39 @@ +Multiple images in products +=========================== + +This module implements the possibility to have multiple images for a product, +that it's to say, an image gallery. + +Known issues / Roadmap +====================== + + * Provide proper migration scripts from module product_images from 7.0. + +Credits +======= + +Original implementation +----------------------- +This module is inspired in previous module *product_images* from OpenLabs +and Akretion. + + +Contributors +------------ + +* Pedro M. Baeza + +Maintainer +---------- + +.. image:: http://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: http://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit http://odoo-community.org. diff --git a/product_multi_image/__init__.py b/product_multi_image/__init__.py new file mode 100644 index 000000000000..5dd39148298f --- /dev/null +++ b/product_multi_image/__init__.py @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Odoo Source Management Solution +# Copyright (c) 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) +# Pedro M. Baeza +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import models diff --git a/product_multi_image/__openerp__.py b/product_multi_image/__openerp__.py new file mode 100644 index 000000000000..423911536441 --- /dev/null +++ b/product_multi_image/__openerp__.py @@ -0,0 +1,38 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Odoo Source Management Solution +# Copyright (c) 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) +# Pedro M. Baeza +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +{ + "name": "Multiple images for products", + "version": "1.0", + "author": "Serv. Tecnol. Avanzados - Pedro M. Baeza, " + "Odoo Community Association (OCA)", + "website": "http://www.serviciosbaeza.com", + "category": "Sales Management", + "depends": ['product'], + "data": [ + 'security/ir.model.access.csv', + 'views/product_image_view.xml', + 'views/product_product_view.xml', + 'views/res_company_view.xml' + ], + 'installable': True, +} diff --git a/product_multi_image/i18n/sv.po b/product_multi_image/i18n/sv.po new file mode 100644 index 000000000000..ba538d6ff125 --- /dev/null +++ b/product_multi_image/i18n/sv.po @@ -0,0 +1,22 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * product_images_olbs +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 5.0.14\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2010-11-22 10:19:32+0000\n" +"PO-Revision-Date: 2010-11-22 10:19:32+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: product_images_olbs +#: model:ir.module.module,shortdesc:product_images_olbs.module_meta_information +msgid "Product Image Gallery" +msgstr "Product Image Gallery" + diff --git a/product_multi_image/models/__init__.py b/product_multi_image/models/__init__.py new file mode 100644 index 000000000000..96cf74b1218c --- /dev/null +++ b/product_multi_image/models/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +######################################################################### +# Copyright (C) 2009 Sharoon Thomas Open Labs Business Solutions # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +######################################################################### + +from . import product_product +from . import product_image +from . import res_company diff --git a/product_multi_image/models/product_image.py b/product_multi_image/models/product_image.py new file mode 100644 index 000000000000..55d5766fa112 --- /dev/null +++ b/product_multi_image/models/product_image.py @@ -0,0 +1,164 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Odoo Source Management Solution +# Copyright (c) 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) +# Pedro M. Baeza +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import base64 +import urllib +import os +import logging +from openerp import models, fields, api, exceptions, _ +from openerp import tools + +_logger = logging.getLogger(__name__) + + +class ProductImage(models.Model): + _name = "product.image" + + @api.one + @api.depends('type', 'path', 'file_db_store', 'url') + def _get_image(self): + self.image = False + if self.type == 'file': + if self.path: + if os.path.exists(self.path): + try: + with open(self.path, 'rb') as f: + self.image = base64.b64encode(f.read()) + except Exception, e: + _logger.error("Can not open the image %s, error : %s", + self.path, e, exc_info=True) + else: + _logger.error("The image %s doesn't exist ", self.path) + elif self.type == 'url': + if self.url: + try: + (filename, header) = urllib.urlretrieve(self.url) + with open(filename, 'rb') as f: + self.image = base64.b64encode(f.read()) + except: + _logger.error("URL %s cannot be fetched", self.url) + elif self.type == 'db': + self.image = self.file_db_store + + @api.one + @api.depends('image') + def _get_image_sizes(self): + self.image_medium = False + self.image_small = False + if self.image: + try: + vals = tools.image_get_resized_images( + self.image, avoid_resize_medium=True) + self.image_small = vals['image_small'] + self.image_medium = vals['image_medium'] + except: + pass + + @api.multi + def _check_filestore(self): + """check if the filestore is created, and do it otherwise.""" + for product_image in self: + dir_path = os.path.dirname(product_image.path) + try: + if not os.path.exists(dir_path): + os.makedirs(dir_path) + except OSError, e: + raise exceptions.Warning( + _('The image filestore can not be created, %s') % e) + return True + + type = fields.Selection( + selection=[('url', 'URL'), ('file', 'OS file'), ('db', 'DB')], + default='db') + name = fields.Char(string='Image title', required=True) + extension = fields.Char(string='File extension') + # Trick for displaying the extension and not to change it, but allowing + # to save the real field (extension) + extension2 = fields.Char(string='File extension', related="extension", + readonly=True) + filename = fields.Char() + file_db_store = fields.Binary( + string='Image stored in database', filters='*.png,*.jpg,*.gif') + path = fields.Char(string="Image path", help="Image path") + url = fields.Char(string='Image remote URL') + image = fields.Binary( + compute="_get_image", string="File") + image_medium = fields.Binary( + compute="_get_image_sizes", string="Medium-sized image", + help="Medium-sized image. It is automatically resized as a 128 x " + "128 px 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_small = fields.Binary( + compute="_get_image_sizes", string="Small-sized image", + help="Small-sized image. It is automatically resized as a 64 x 64 px " + "image, with aspect ratio preserved. Use this field anywhere a " + "small image is required.") + comments = fields.Text(string='Comments') + product_id = fields.Many2one( + comodel_name='product.template', string='Product', required=True, + ondelete='cascade') + + def _make_pretty(self, name): + return name.replace('_', ' ').capitalize() + + @api.onchange('url') + def onchange_url(self): + if self.url: + filename = self.url.split('/')[-1] + self.name, self.extension = os.path.splitext(filename) + self.name = self._make_pretty(self.name) + + @api.onchange('path') + def onchange_path(self): + if self.path: + self.name, self.extension = os.path.splitext(os.path.basename( + self.path)) + self.name = self._make_pretty(self.name) + + @api.onchange('filename') + def onchange_filename(self): + if self.filename: + self.name, self.extension = os.path.splitext(self.filename) + self.name = self._make_pretty(self.name) + + @api.constrains('type', 'url') + def _check_url(self): + if self.type == 'url' and not self.url: + raise exceptions.ValidationError( + 'You must provide a URL for the product image.') + + @api.constrains('type', 'path') + def _check_path(self): + if self.type == 'file' and not self.path: + raise exceptions.ValidationError( + 'You must provide a file path for the product image.') + + @api.constrains('type', 'file_db_store') + def _check_store(self): + if self.type == 'db' and not self.file_db_store: + raise exceptions.ValidationError( + 'You must provide an attached file for the product image.') + + _sql_constraints = [ + ('uniq_name_product_id', 'UNIQUE(product_id, name)', + _('A product can have only one image with the same name')), + ] diff --git a/product_multi_image/models/product_product.py b/product_multi_image/models/product_product.py new file mode 100644 index 000000000000..990e0dbff60b --- /dev/null +++ b/product_multi_image/models/product_product.py @@ -0,0 +1,84 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Odoo Source Management Solution +# Copyright (c) 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) +# Pedro M. Baeza +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import logging +from openerp import models, fields, api, _ + +_logger = logging.getLogger(__name__) + + +class ProductProduct(models.Model): + _inherit = "product.template" + + @api.one + @api.depends('image_ids') + def _get_main_image(self): + self.product_image = False + self.image_medium = False + self.image_small = False + if self.image_ids: + self.product_image = self.image_ids[0].image + self.image_medium = self.image_ids[0].image_medium + self.image_small = self.image_ids[0].image_small + + def _set_image(self, image): + if self.image: + if self.image_ids: + self.image_ids[0].write({'type': 'db', + 'file_db_store': image}) + else: + self.image_ids = [(0, 0, {'type': 'db', + 'file_db_store': image, + 'name': _('Main image')})] + elif self.image_ids: + self.image_ids[0].unlink() + + @api.one + def _set_main_image(self): + self._set_image(self.product_image) + + @api.one + def _set_main_image_medium(self): + self._set_image(self.image_medium) + + @api.one + def _set_main_image_small(self): + self._set_image(self.image_small) + + image_ids = fields.One2many( + comodel_name='product.image', inverse_name='product_id', + string='Product images', copy=True) + product_image = fields.Binary( + string="Main image", compute="_get_main_image", store=False, + inverse="_set_main_image") + image_medium = fields.Binary( + compute="_get_main_image", inverse="_set_main_image_medium", + store=False) + image_small = fields.Binary( + compute="_get_main_image", inverse="_set_main_image_small", + store=False) + + @api.multi + def write(self, vals): + if 'image_medium' in vals and 'image_ids' in vals: + # Inhibit the write of the image when images tab has been touched + del vals['image_medium'] + return super(ProductProduct, self).write(vals) diff --git a/product_multi_image/models/res_company.py b/product_multi_image/models/res_company.py new file mode 100644 index 000000000000..3453ba5a3d0f --- /dev/null +++ b/product_multi_image/models/res_company.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author Nicolas Bessi & Guewen Baconnier. Copyright Camptocamp SA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp import models, fields, api + + +class ResCompany(models.Model): + """Override company to add images configuration""" + _inherit = "res.company" + + local_media_repository = fields.Char( + string='Images Repository Path', + help='Local directory on the Odoo server where all images are ' + 'stored.') + + @api.multi + def get_local_media_repository(self): + if self: + return self.local_media_repository + else: + return self.env.user.company_id.local_media_repository diff --git a/product_multi_image/security/ir.model.access.csv b/product_multi_image/security/ir.model.access.csv new file mode 100644 index 000000000000..c74a7a86a587 --- /dev/null +++ b/product_multi_image/security/ir.model.access.csv @@ -0,0 +1,3 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_product_images","access_product_images","model_product_image","base.group_user",1,0,0,0 +"access_product_images_manager","access_product_images_manager","model_product_image","base.group_sale_manager",1,1,1,1 diff --git a/product_multi_image/static/description/icon.png b/product_multi_image/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c11adb164a2ec5b2574c0d84aa478db7fbcf74e0 GIT binary patch literal 14901 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 YO|$mlkxT~fz+54mik5QeEsL=K2f3bfYXATM literal 0 HcmV?d00001 diff --git a/product_multi_image/static/description/icon.svg b/product_multi_image/static/description/icon.svg new file mode 100644 index 000000000000..8d552fcb96b4 --- /dev/null +++ b/product_multi_image/static/description/icon.svg @@ -0,0 +1,320 @@ + + + + + Drawings Icon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + Drawings Icon + 2012-01-29T15:13:42 + Icon for Drawings/Pictures folder. + https://openclipart.org/detail/167547/drawings-icon-by-andreibranescu + + + andreibranescu + + + + + Inkscape + drawings + icon + pictures + + + + + + + + + + + diff --git a/product_multi_image/views/product_image_view.xml b/product_multi_image/views/product_image_view.xml new file mode 100644 index 000000000000..113906c2ce69 --- /dev/null +++ b/product_multi_image/views/product_image_view.xml @@ -0,0 +1,99 @@ + + + + + + product.image.form + product.image + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + product.image.tree + product.image + + + + + + + + + + product.image.kanban + product.image + + + + + + +
+ X +
+ + + +
+
+ + + + +
+

+ +
+
+
+
+
+
+
+
+
+
+ +
+
diff --git a/product_multi_image/views/product_product_view.xml b/product_multi_image/views/product_product_view.xml new file mode 100644 index 000000000000..8c9524e9ba1b --- /dev/null +++ b/product_multi_image/views/product_product_view.xml @@ -0,0 +1,21 @@ + + + + + + product.product.images + product.template + + + + + + + + + + + + diff --git a/product_multi_image/views/res_company_view.xml b/product_multi_image/views/res_company_view.xml new file mode 100644 index 000000000000..a5080856d390 --- /dev/null +++ b/product_multi_image/views/res_company_view.xml @@ -0,0 +1,18 @@ + + + + + res.company.form.product_multi_image + res.company + + + + + + + + + + + + From 146a498cd61edd649927119fd45c27dd116da9f1 Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Fri, 6 Nov 2015 17:45:53 +0100 Subject: [PATCH 02/14] [IMP] product_multi_image: Split model in abstract & concrete + better icon --- product_multi_image/README.rst | 41 +- product_multi_image/__init__.py | 27 +- product_multi_image/__openerp__.py | 47 +- product_multi_image/hooks.py | 9 + product_multi_image/images/db.png | Bin 0 -> 32838 bytes product_multi_image/images/file.png | Bin 0 -> 27559 bytes product_multi_image/images/product.png | Bin 0 -> 87893 bytes product_multi_image/images/url.png | Bin 0 -> 27353 bytes product_multi_image/models/__init__.py | 23 +- product_multi_image/models/product_image.py | 164 ------ product_multi_image/models/product_product.py | 84 --- .../models/product_template.py | 35 ++ product_multi_image/models/res_company.py | 38 -- .../security/ir.model.access.csv | 3 - .../static/description/icon.png | Bin 14901 -> 15428 bytes .../static/description/icon.svg | 494 +++++++++++------- .../views/product_image_view.xml | 99 ---- .../views/product_product_view.xml | 17 +- .../views/res_company_view.xml | 18 - 19 files changed, 440 insertions(+), 659 deletions(-) create mode 100644 product_multi_image/hooks.py create mode 100644 product_multi_image/images/db.png create mode 100644 product_multi_image/images/file.png create mode 100644 product_multi_image/images/product.png create mode 100644 product_multi_image/images/url.png delete mode 100644 product_multi_image/models/product_image.py delete mode 100644 product_multi_image/models/product_product.py create mode 100644 product_multi_image/models/product_template.py delete mode 100644 product_multi_image/models/res_company.py delete mode 100644 product_multi_image/security/ir.model.access.csv delete mode 100644 product_multi_image/views/product_image_view.xml delete mode 100644 product_multi_image/views/res_company_view.xml diff --git a/product_multi_image/README.rst b/product_multi_image/README.rst index efe9f9c8f7eb..cad298158cb5 100644 --- a/product_multi_image/README.rst +++ b/product_multi_image/README.rst @@ -1,13 +1,42 @@ -Multiple images in products +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +=========================== +Multiple Images in Products =========================== This module implements the possibility to have multiple images for a product, that it's to say, an image gallery. +Usage +===== + +To use this module, you need to: + +* Go to ... + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/135/8.0 + Known issues / Roadmap ====================== - * Provide proper migration scripts from module product_images from 7.0. +* Provide proper migration scripts from module product_images from 7.0. +* Migrate to v8 api when https://github.com/odoo/odoo/issues/10799 gets fixed. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed `feedback +`_. Credits ======= @@ -22,13 +51,15 @@ Contributors ------------ * Pedro M. Baeza +* Rafael Blasco +* Jairo Llopis Maintainer ---------- -.. image:: http://odoo-community.org/logo.png +.. image:: https://odoo-community.org/logo.png :alt: Odoo Community Association - :target: http://odoo-community.org + :target: https://odoo-community.org This module is maintained by the OCA. @@ -36,4 +67,4 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -To contribute to this module, please visit http://odoo-community.org. +To contribute to this module, please visit https://odoo-community.org. diff --git a/product_multi_image/__init__.py b/product_multi_image/__init__.py index 5dd39148298f..6a3b99e1c5b1 100644 --- a/product_multi_image/__init__.py +++ b/product_multi_image/__init__.py @@ -1,23 +1,8 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# OpenERP, Odoo Source Management Solution -# Copyright (c) 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) -# Pedro M. Baeza -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# -*- coding: utf-8 -*- +# © 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) +# Pedro M. Baeza +# © 2015 Antiun Ingeniería S.L. - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import models +from .hooks import post_init_hook diff --git a/product_multi_image/__openerp__.py b/product_multi_image/__openerp__.py index 423911536441..dc19d1dae2b1 100644 --- a/product_multi_image/__openerp__.py +++ b/product_multi_image/__openerp__.py @@ -1,38 +1,31 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# OpenERP, Odoo Source Management Solution -# Copyright (c) 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) -# Pedro M. Baeza -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# -*- coding: utf-8 -*- +# © 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) +# Pedro M. Baeza +# © 2015 Antiun Ingeniería S.L. - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { - "name": "Multiple images for products", - "version": "1.0", + "name": "Multiple Images in Products", + "version": "8.0.1.0.0", "author": "Serv. Tecnol. Avanzados - Pedro M. Baeza, " + "Antiun Ingeniería, " "Odoo Community Association (OCA)", + "license": "AGPL-3", "website": "http://www.serviciosbaeza.com", "category": "Sales Management", - "depends": ['product'], + "post_init_hook": "post_init_hook", + "depends": [ + "base_multi_image", + "product", + ], "data": [ - 'security/ir.model.access.csv', - 'views/product_image_view.xml', 'views/product_product_view.xml', - 'views/res_company_view.xml' ], 'installable': True, + "images": [ + "images/product.png", + "images/db.png", + "images/file.png", + "images/url.png", + ], } diff --git a/product_multi_image/hooks.py b/product_multi_image/hooks.py new file mode 100644 index 000000000000..5815ccba4849 --- /dev/null +++ b/product_multi_image/hooks.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# © 2016 Antiun Ingeniería S.L. - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp.addons.base_multi_image.hooks import post_init_hook_for_submodules + + +def post_init_hook(cr, registry): + post_init_hook_for_submodules(cr, registry, "product.template", "image") diff --git a/product_multi_image/images/db.png b/product_multi_image/images/db.png new file mode 100644 index 0000000000000000000000000000000000000000..2bfaab57ef4642bfb8487894a7d75fb3d8da1ece GIT binary patch literal 32838 zcmeFZXH-+|+AfOv+6#6R1zrV2KtQ^51wjMSOQfqv4Mj>oK){BmG!0F9Z=p#Ey{IS% zNKc5AP^2dilq#X^d%D)z`#XDoYn=U!arPPK$8q35lbM-0pXaXEb=~uomd1^P`&joe zF)mI(a6hznM_iujxIEo1u6Na{+X>;2?a!pY{=I|myi3hW<>m*=ciOw7jx?P9z)g0(VcF4=|1|gMcaELi6WR|Nbzk2-`k4E^Hd!3COe!1{ZlW(=#kx#UB4Zp4Y63C*4^IeD? zvRRz!Y*_v^+Q=^_XNn=`lW^Q>iwau{3Zx9#S_U=8Yck#=JT5MGdA1+(>G@u2e^~(+ zuaJ6ulsDDZ*2eMO z*q7)zaT?W?q8!-f$!^WQ@`c4*&%`9ItGk<&t;^FIC#B18klWEmz??XGG-Wr(qmC)e zwQEo0SI3UcelJw2sHm7Dn&G zgYufISvk(iYBVRM)|IWBxwyGDhiOlc&r znsVt&G&29ii#JUx-8x}`mWaBVypob-eZmQTo1U&urfxU`Or4%Ri}QhQ#Ms-|W^p%XDnJ4V*CC{802 z%rx`h8Hp)4VaNNs_2Drw_-#9O*(}fW;?j`CCczeGNARPmJ;qMrA;PW`w+^yN>v^xx zNi)605peX=r`uOoS9!(67OPpVMhjcKaI6?VIon52YggE+ZfdVrxYQG54dLA= z#KuDvHox0AjWz@?B`lOXkA}Z_^EWC+-lvkWIGvi7#wB1{8Lo}^>F_=s1A~n9^+%j) zsEB7*VLSI7JQzXh`?>ps*hS(hgVEgBcmr0YxvkA0R>A>4tAM43b7kx27>H9t*klY& z1}aO$s(TE2W=hz9PqJtX$#&>3#ih;mm+?zTlp4hs&$U+lYB*zAc$-+|;bdWKXc)b| zzRudUAx(L-&{}l+k{vlezAz76U{=&?-{2ike-6bc*kTAdP%8ENOC7p-5+9{}{(L<( zsC!z^)3ZWHM~4gbY}Y{%hL2U2jQh;(n#q~*@$`4^PJL-?r1e@S>R-M3*lUTJzPYh> zCN&vukm*~iV;R4Ifcl{TC5=p72n9OI%KqSjmSz3$bK=O6&f!t zz{YZPGc{P{AC=SVwtPp;W2rC^jEIP6ax7ERN!?w*TCLSg@fgaROz_r7 z^xLf1zJ0rx{rAgKXAk9>)ff%=uI1$#9+HXyQFRdB)r*X8GSql^%2XlqwH& z|J>+k>hSQL@v*U~01jU*d;44or$LjvZxwA7)zv0*)e9lpckB>%=o5oAbm%QocAad? z>tsjP-WAzkN+m%=L#DDUs)mN6x8Br1$Aa96iWKR@MEvVsbm)OM}>Vgu2F$o zn{!(RWsa1fbDi*-_Q=QxE)9GPg|GJeNw1nSc<|so5;#5|)6|nuQEFQSCm=y=($mpN zsqtQEwkn=3?RV^ka3M6(izGQ4KJZ!i5sYg2ot>4XWn^ST=rAxc!hidAYt%=-7tg@5 z50TzXk#Abd@2B4jNifxDZfRMX&P-IrF;?aZ94VEy;F(^l<58Byy(RaXa7J?@NJf7! zp7YvN|B0ZS9OcyIeS7z6qfoC3cikZIZCSslU?{TjroJk#s=}<$DbikxS(~fve$7Ke z=CEJ5v~x-?4o|@;9_QR9-HiWo?=8tLqSY#l;)sT{1Xh0h@ZqGOpaUmZSX!)##jkXr zo>yM5D7?M6zR*s4#w_2FZ(4;!OE6u`*Ei=X*XUKTRo-wurWiy0E5*I`U^8gA8lw`M zyE7QD$9?Tz1h$O3hZVTZ4Hy{Ybw3H{#bD7xonxRsw#E&DkXk{8A#Vk zmW4!9388}PGNnA!uWt{GPex_s<|_L7n(f1k7i?~%5(yYg>P+;?nA|GS!D!j9Dm*+q z@55CNEbU}|>qqm9y|41}Ry4N? z;1Uy~D%}r~-<*pd=NR_U&fkw*IdQURFILHkipOG@r>^UiF4NTw66GB*0#RYQX=Ouw zNhv8scKw=(f<4pSU!+~GD0vKGE`E)0ARe=wGI>7?!V_l}k0XgOjf_Hm(*uQiSfidfs;B2zvALQ7+#lE)Cmyqn{6 zvUb^0WNfUuzkfQz#kSf+knC^rr;4{JX}LhGsOS~*a^pbhT)URtl>4%ZWrbCGIHkhUhn1C8aq)^4C-qb!rFw-j+V z8?^f7MsUNjZYE!*!v(f>5&F^@iFH=kpzNPNnGUj_bqKnckv7KKEsLazVVw&540BZ- za(*5u9fM($ic5Cr5204Ri)qh0BV1I)mHqzxEmULiVz(x*s-{d{c(_SKIC1Od^PfMj zqHwXX`n9zQ4SLPXY>L4m^78BrH2mALZ@K1*KkyOWC3fQpMxlxErdg2!8>}vPWcxd~ z1aq`_P-T=JrqenHG&CHy&`;Z3maixhnCl)t0GLoU4>V^6BV^)0G(`&P9Jc55YOEa+) zj0CeV!O4=RFe~$%PgeHo^t7kZ7Ui0!S0(TH^EaECq`)lY_4Tfd&CTV3UkVy={JCj~ zD9fy{G`igRDOT&phamPZW1LLWTiW^aPh(2tkPEii6Bx*2^(T_qnwE0@$xV-4|J79gza6vdPjCwh7gkguS7xH~ zZ!+Y!yb2j66FZGewHqO6S>?aOO$2YadLWznhRg60J2aB$GRN8b1S3|HP_2L*4Mjz~ zs%rDtM32(RK<|GYSYcwx$G>K{cW*YePrT^k(mUT?ref>%o@&p9Hg5$%A!X%?qTarv zNICJqu<*95WieJuyE9vbgz3>@Iddk*wmU=InuYZ~^u5wcJ};6cJEuz>o+$wbwZb4;xr@=WqmgE z0Wl($uf3LMcu_`Wj`8wa>#h;u;Wjhh3yo^L2+*Vu9<92d{AJaRVjUjB9c3!bh_E(8eeT~En}v*-EHja5omu}C=^roD$_0@-3tH}38J6|)V+E0 zWl?c4HwxNb-2LYt_-t)$)qUloivFx0Ie#7{YvbeN&ELL-7Zf;!tt{x2?u4rwrn>f0 zbjezdjuD=V#qILl9GgFPM?^-d;-IT|!OS6;EpoGFsmIuhF`YRMn_9_vBLsn{p6=Yg zNJ5+2_T(CR{T>Mb`_RJ})9G|5`b9EyB&_@_`v0-WmmRWV0jB6Hb1I0J@xZG^2~tTp zQCzkF46#bPWg#7@VV(hi3n-<4L;4RNmTOD$@u_MmY?Q!KER6(kAc#x5>_QM@dDa+X zJlYr<6&f09kbApxY9rX;PnE%1|HGxiq?Ph2qx62$(Rf);9UsP`_N`k%%XCT((w%(# z__2W+T`t0X;Q}8YAAV5e*RNmmKVMc{mqV_RHM3gQOj!8fR;^v1Hw0reN$lR|mlJeWOXO@97d@5Bl2uj719bUN}S zI6mv})!%>RV8~xpNSwqGyamB%b7Ob9v)^ra_i@XSZXx7s|K+w}R0>;8y%I0TCWTA+ z@k7_8;%qAgK~k^c?iW7%+R|bU{Yx0h&h~+vB3r&RghA*h!(xq@4KLCEaiGb^N;h82 z1H;Vjbfth0-gD>lO{-KS$_FhKHe3Lyijj0e%2@Q9loXR*dxyPlaPIQlv+|E_4*6CA zHj>GzUtoBH3b@*0=M4^9fZ(A0(}k{m*P*jn-t>wa2?+_fG&%3(i|5a$NL9V!4{FgD z4E$33XK5ej09G|9)pE(W^cHT+MPH2iy;WLgrL1m49U#m%iHV7h3MDNGMM?Rwr;{{HTuK*$k@eDx?8L07N9<1#L;6Jv6$M zp&kpp=h5`^bU@Se$_Bl1=;fn_4D%vZ#UvyQjvP6{D&wAuAYo{8AN|0S0$sH}YkB~6 zxzG05Hiz?4dy6xR7H&X(<9oEayhZ*&Yj~E5Fi1Dk%3^HqN2Kft1ae>4QHHg;(q-2!G(g0fR6Jm zK$A<Scl9C~=KZmci#>=3Slang}Pad0{&69GSnEL%|G-_%eVslqF zVz6oSXzPSd0E?42{MNON%N!%P{9nAF!j_V-WK(qNIs^x96yS^Kt<4Q=i$K{_asYc5 zym;cw8B938pkUAX>cWW=C(>aj4xYWD#U|rUe07Yc#E!&gX=SB~JF?6A+q+~0{rvV$ zI7S+aca8&O^bblK@%C-<{5%8-K?KEv4_03!|8Z>AR6`{M`w|0$S1Mj3JtM;o7L@@& z$l^q-6SZb#Fh^USpI;5<)+$cEiR&w|$gMON8GPK3m-af!?PD!br zl-G}qkzGCQ?@y}xY_Fk_0g#R0moGkkZSFyD>)LWE(^w=>h?8(yHkoolVG@$8Oh0+!de0|*cH%#aCJ4)1)2)(2dVoIZnVIDS5Cg!gM6dXV z@!2`QEtPZU@*p9&&EGGAjF%EE>eLqZ#fC~ zzU&jY{r)O^zGr2~uK+U5bg18YDx?%|VZptEqVn>-cAcNhabt5FX>IY|Ik~yl6CcgL z*j!LBCxx)l7JoJRX{$C1!~J8vy$e{RnQM0XZJ@{9hS%mevY=eqjlvh(M}XC5%5S*U zz7E_k_VDLL^>{|EtXvH(ugs!Rx@K$BBt4Ud_tGUDX4#){_wKzw;m(Ha^ZEIa->8h9 z2xiGDF=%A6^CIJgn8K8@Y$-YS}Lh z4F)nz2sZ*~I0P~+NO=g(2bXCFURl&X3m#xcSetH>@SML-a2hg`@u2HP37R4V5UQ&! zUPjz)N(*6v07ZsP2zzme4gd4!gH%U7z3>EIhV6-yC#m(!3VOD-*$Kb}ZKvov{{AT} z{oqa}gucZ|1%+HeQ^r)yN+~rtU^B^MXd@MFeW~G0L{6r`&PqnJfnnXITFqkDJ>)Oj zmG`=dzS4DrUhdu%6Ky`%EgCht132hJzxBo%uZ7mk;8C9?QWZe@9Zz=-QAy~nY@fAK zT570ST?q@4=Sc&elkr}#oLu7S$daVBwX~>(T~O~zLxoW<0h6>cmEcVm9%Ke`19mvC z_z@{}58jPFVCc8jKV&CR_0Qr!H{;g7iUZ&`Odw#YL?eOh=kUjaa@;066_t$nWn@f& zK!DFl?%Qk2Eh*`-`ujHu2X|*jw7uDzt(z#G;ieI@m^SFU#vF6y*Dq<>Dr48zaTh+J zx$sLTbLiEsc$Lu2c;{*YrmjOxNFcJ#@BRA5GjZo1$AImM60_~nWtr`Rn;IU#KQ+<) zOFBDR$vaTA#7mnCZpSkCYEOJ<%R1jo8v>Ns>|g^3UE^M(AwG+uW2*Ab6F)Nw_Bp> zGV9jI>wx_7z;XF)-9aqDKcFm1PpZ;`;kK+?ejXOVMgxt_D!zS*Rruat=MG`{1O>IU zwfBSfT3V)4`<)cXJ$abLvN|7usu~k_@8|)F-2JjBT9_suhn=~Z86PvV5K70^wy?VT z5v!hrAYIdIv9ki|58~QfJL%<-QEHwwpt3W?E7Q@|C-L4ZG~n^h1*CqOS{wdYMg;>S z?_ieAOi6jvnz;2mCB+K@l2p|EQCOql^Tp*Rf@oKd?KXU`UcG7%-A6mh!6C#P`p%V| zHZw`|e_moh&L>k>>bCssNccQ1z=O6(Kfd@yWM-B%gv4j;*u4pz%Q9x<6Cp;NR;GGu zprBp8AMMl&+jKpQhq>#R=DI$|qn~(HwLo$E@9~veo0)KRX4W-jgGL3dvFNFdl}SFH zN$9Xs7Jt_J>8;QsbOqH^UoS5A3jyy@3z#%1=~@}}$?k-(%*+)}6GK?fxKKgUW-b(z zDwCJ0fObT6O?9T8IOa;9%hBJ1El&}%{DUP664Uo!TNyY1U}PWsEAVsK^`xeI&S5Q< zQD1%x{;4}Z=nun=_s}U-XY_jd`>Q&KbWdm3>t`wl9+o=GGv*Q@;em#4eBh6{l?31l znr!a(%*YA9TJkR~K*=6Qy)y&40sN{;^lVpYQ`MU{fjP-H$)8svioz$8d`||(K6><& zlxN(pLb70R=Su^60kxs(YkPV=9Kgg9^#2sVT3U1L0dZoP+kAActm=0lakVyH4~%&dZ$|)P??nUx7_k~3j!UApZN3V&qF9k zGg^UstsKZAWZ>mhd7hIK!o+nb-U_rWqlC=!%Z7Z7B?lj-COn!))oe0oeb94eXvE`z zdO+doM=qO@$yOvAV>YEk-3EV*3puE;*%OZeh)zs8nn(ap;6dDj+ zm^j+MD^+`T5&qE_cFe30fv`r>b3=QWrhIRb*KTHZ;y{J#3077-uo;?zgM%@m)*;Zd z4`vmm-Uvkqp%Tvpt32Z}jWd#tdcY?^-Ih~ceg!3xp)8TsN+jyd_7>lO0$1104uA5} z?K?Bx8%tz@-9l^2ks#$75(urvdpPz$v!t=r=KCf`8NFr?ynF;VPT*3z@Csc z(J|tfNOs@fce%N_#qst)Vo$Uu0uGW6=Q9F6Z(*_>4KH#v0nTA)Xb85el-ifuYV1^# zo|)jKim=0lKUHtvz8&n6suGOjLc}w3bz8M&UeoDz{m3pSy|z^{{m%;$Fz7OE%ewV> zHR$Z^#=gDrtuL=n^p!fq?mEbt z#;cn_yvTCwSSnA#Lq))5j7sgJXWXm6!HgzdH;~&lsksEKBxxX?DMt0)y%hKpQ-wr= z58M`gZ~v%@nEuJN1^?f0Z4c9s8)ABQ>L0l1|Ie8H4?))dHeWf=R(8+8;7O^29NyxU zVRJh_WI*jZNukmnj_DsIueS^hRq?JF)~|aGU6iTP!hv)pxFYLMxcD$mtyZM;Apbicl(h;4MW-7lY#z&l8N8_4X__g$uJsK{`3207F zXGQ>P!+Ar5m}gv`My)&HJ+Vc}Cty}+5AQ|34s0Rio4(w2h?=Gm|A|XKWRIXJtJ7H- zSljkCGrSDF+D3w(J5~Zn-d(_lJ3@5 z@p648U-Ym_Oz;~aGbUm;RAnQx2L{gjKmTnD>>QO;=y!01v(Y-Nv8!@akTXZw^B{YsT^2&s33+P3&{ZHQl7ocz#lN~`h^M_Y$O zs<))gaY4>ew|HGy3HvK)KwZY^%WIxK?b%l*qz_7_c&`;(<6=z?d(yAZmqvZO7`8sY zzSMCwUG)3$nYU)8E*9G2V3!jo4xKm=!7DC~mhoUGKVv==mY7JEYTw56n4i>Y{k)Rz zjO5v_KEJKCM^jo}#V@3-)|tw2uveB=6KXhni5#QS#hhZ3hYvppVTZf;A=T*7?-GJI+#c(8MWDr7gO)M$riOXSrdRowPxj~1(jD1Vy|G3s?xRr8Nb z!P#C6d{-VB*#_&K&L(qIUwZ`M-w;YE*djfB!tQIZ>G8wEc^hjw0OSgw7@KQZCubnBqR%jgn%BDD##AKJ zY2pgDw4PK_Dfd=fD%5I&zYm=U9zeOTbT-SE!K)nRr*Qr5-AyV@2X^}ZLWrI_fl@2cH^B5GQ0^K{cGy+3sGvS8u8!~yF%jaAEQExQf`;g@T-9-9xMcV;d)&yNWu=gbji z@v}Mm9^%5I4U>xXDeXL{gapTi;$^tg!W#A1zb*P@oScXQ3I#;#z%oob{r*ALvw8g% zYt$F#;@hjXAdzO{72g2f*R!rX%dBuVEGnwXsO-?2fXvu9ji^Y0{`4-LD)4W&70QPA z#@i#TSYs#P%k^&G#tTI?KrNRIU$S#IdQ)dLz%Em z)HvxkZ#UI0?$5DsoBh@)n?2vTM}K}^wM}sFjy~3BqxycaetWKUX>^#bUMjtJ9J8k8 zu};|_SS}oy9Wbo00TwNKc~%Ydv)Q<`5N&~_*ddd4IV@l}ebL1xe0*nBHQT%UoL0{C zdo91t(#~`ma<3dElUcXedDvU@8tVKyW$b^8H(WG+`0%la<^;f4C`4A#CaBjE=?h^o zPr~s^8eAt5;iXjwp!ukM{hE&>l$c|EzvcYV389m)96cH&dOr zMt$o?Ul}6e3f7g_81gQ-d1aE^FTymXDlY}IS5h)`%50V;H`@BIdVT&C8&b2JIQ1rj zo4E9v*l;j_OJ9)QBaBZEVVAQF&)H{-wYB$-m-e?Es?~#1(m>h2evk781KYt^3eeNi z!h`lCJx-XrSl8`#UgKYn_jhJZN5R|S0Rif`5)Y>$&{k*(l7+f2&$775jEO{6x0QS&i8~Y)W6P-|Q8~YDW^^)k%wbMsq}! z4$hTW;mRLenODXhFQucKc}TpONZ>=9qF?ga7_{!#_luUb@GhSzU?SIlFmGp&7A2H74scdm9me^g!$Rq1Sl zX1ns{0?Me?zDy%g(16ynP1;>dcZ-3x%vxB?9aOP6D<78++K-J>iD{szAW6$!g>1&n zwLTyFLE^~LR_ZpU4-xcGKi2Lk>B!;X0*^ETG~?tnk?lJhwY$tO(PObxOpZo3gn5*VCmn8 zYD_FQQWfL5Og&7!Athm2sfk>uOxHlHbXmF4X%HVYY)p6&oH%qQonZ?I-Ye~WHEY%u zu_U|Bsm_`lIlCk*jS1QG`VpdWpu{O=j)JxFYe*jJ$&>jzpg#K`jak2cZo;a&z|V)` zIkX@#AIZ)b-k8$|<8rF)MO)Mr6hyr^NOL!91nRxc#L!5U&xx)$}eK~dmH0CCk$4zvF+B0h&GdcPDuY!E%>Q6C^as6E{%t5 z+v$nHUvyLUVwnVSDgn~j^QVP6JM&5$XxiKttg@4mu0zxG0te0vsw1A$63K}y z@#-pfLrLI>q`5_I2v%MiyRW+>AOO=}YM}}#V&6X1aToo;RC2a%PP6s*--$yTUVwVB z{BLPg{Gxr19sQ9b;jld-(%lHiTX_~iF=E-ZGSfIs$U=EYo&Z%!cC17HPBq;5^Ze-E z+&(&#b6>w!q6figoz0Rp@Ns3nlcwZ&k9x57%Fz%^yP+VcW0>Wy&l8+M5^0C&!7*hB`lN*eS$TO;9z{3s;IPqXm#f2_n{){j>~&TIDiCoeHJi3 zL1VaHOheESn4E|QjmtRQQP(D`0I7gahlb=XRk+r88Tgqf7VNrJBRjM#?Y1W(Hn#QQ zP`<->9*;pzx{+aq+4k~xmjuyDbf9Nu2a3OytO_*X% z{vYoKbyaWOvZo6oy=TlZh0FN*^5h zqs8?K4b0>Vx_#;7=;W>c{=O%mi1&aiLndQja==A8zLgRm_{pj`8x$5)Vs;o{F9i2l zquHT4a}XW0QpCG$J5&6n-DiMBR6*3y2AJ^~x6JM)g2S#y>?|4iwB1bQB8DdGua8{_ zfAFJ9maptodi8q$tAo%>VkO?c!1d*a{*r2S{GbgM2G9De3AN345)U zNC9m9LCLRH#lWl_3aH)M^v<8&sr$;pTA*X>^tbNCA%F2Yx z9#&a7jDmmYh=D7Q7GpKfp&p13$saf6&=Ka0E$^u_L_X>ijr? z?nK3S%tJYJhyKXq=LTUGseS5O8?n@7X%8 zdz|>K;QxQfY7)_MIxiJZPl9Z^UeF9t$>XM>>ZH;!R!gpAnfey zFv=5IR#ujszmqAhC1NXh$VX5tVzFGX#40VB6j232dL%B%WuPqs60?`2V1-7 z*B)Phw5Dgvh71%HpTb6w%ACyQeh)tbLFyYlsi(S2Ufmh$Mn(5ub#-;Y^b#H*Eq#vx z=YU^Pk4Sq+-wQ1WAdUh#KB+$nOY512Sr{#_D9~v+w+XTR2WeDZ4NQg5Vx4NW@7zhU z`u6UwNoF6FOfvH!ug_qd^V@IW*Bckcqs)6i6N5<7r=IL)e^XVpCPnL6^8CHFCP{Tw z-e@yBayS@Ge*M~{f8ryU{I_yN8<3XIFD!s5VEz(;36{Vw=VMz9W+!J{^f}$EH}!&l z>PGn;058PA^b|6?Kq6q!*y%21g#K69 z{Keb~a|6iSSgAvQ1~M^$taFiN3!*f*2zsl3sss?fIpbJ<4ZKs=-MzH40hl&%54y>h z&!25RzdV94y8v{it}aaGz=nu378$ex+GL_%&pTm@@W{xF;4_lVb_8IA^83U-0i|05 z6K;r#AI3d4mkRtKL}-A8g5Na!0u2KJKuH2f=>}`Z#>Z^|=-szxPX`Qb5G)!Gflf`5 z5t9L41kgCOCodKh5XkXB3@52nz(@(X{~v4q3(#Pq;qte3=_^-mzkT}_5xpTZEq6aX z_v+7{TR0_dr^jx)BXo60w;(NUnkE-0+AQ~ubQ>PUXPZAWabUsP4)_Uk0SGp-Jj zbBt@5EswaP)D1nA8N%oEn+!eY-ODb@e$9?uQ{i|2dQjbaJNjM5x~%&;ZTGCg`?+dH zXR5d6Qr+MqzeC@SPvI2}KiD@@!*jt1#@9NS4?aEEY zc!Er3H{dBI7TN+H9xH+FAxsa1O&??}EHC%KxXmSa(|NRk^e{0xnm5}eX5_<@9iUXZ z5r4&55$5tlmh((1bZ}x84F?XMx_s55A*d5HdBGC@DWu+GRJT4kIoV=IXa@Zp(9+#N zJ($p(Mhptf1pYD71w$F2o>FF(TYLjAnhFp>c7WMjUj+~C`sBZ#Hq!#aji7~7R~{t6 z{1lK|%&|AQ; zxlKDE=3rLo+sY>nvE3Bv2p)^!Cx{!{r#)4P4&YrH*BIv{gWR8$P= ztc;60i^3lffrw)_+szp&n*yUf9l!U2h~rzdC?>q+->?NR7uPVqy0nyzHzRpozkVIz z5g<+zmWu^}{hnW34Ch*1TO%88naq+rTHAZx6akq9u_KHNu9h{iy@Cp%Mr_&jOGSKp zc***@EZdcbNj*NotaV_bEyxmbpEO?UTXf8P;*M2F~#XHP_7LI z*P$FOK?zU1p&yTMEqDz#H@6xeDbM+|$V-MPFh>O)1<1q{A!>l`#5!z!>(RMyho?Xb z6A=}~lRaM%tKWS|PF8koa+1f%Y3>51U?_h+|%NPp0DQuS3}U^fIg!h;b-f1q(-1h=6U@2~j33NyD9ygk@C(56#cTRv9m z7uLEYcqz6cH~-x-7oy5Ps~DOp{G?Wz4^+=PaM&f*nj?S zwJ)Xirds>L>E7KEYv1noxVFuOx*duZL-E-5jeVf4J{-G?lWMV+Pt zQcDq$NE{<}C%4VwP7yky!hDk!9N;qqB%hULRyxIuHb;m*dbwEZl;Mcoz$ z>pPHXLSc)BDKH`fef@~#xuF7u^$}*TpC5N)!CWRyY6s=t^p)l@7z{Jh)Eov)os#dn z#7%LVC5u&i1xYyhp|PDw?CXu*l`G6@i>>^EozpzQq?STypXvD=xAm;#HqTBQJ;_10 z8mmMR9-5brVVTcIF?EDpl^%J1tOWEzz>DRz&kaS*o+FU%UPxQYxWpzdCN>2lv?N38 z_;g6;x8)Nxf&A-%+1GR=0fH=zlHiwiaM3fMwY7C$K)qqV{;3zqINVXt(Xe-tctvYG z^78WR933Mq4K>R52h@wG>q2#WV`h`7gB)U%)$&&=Qqdedc<^=OD6Vf)a}owI$awu6 zHyG)rj)iIVz`yUuWVj+Cx@?3#TN!W-)sSDkkLbRjr07OC$OYi=ZVIR~^`fh2Qf z(|w)7+c}%15-DZNlUG8DpF93b3ow@TFj=sCRhdnJm^0@iEc5X5s52tQ1A!O;T*|V) z^u@t58SOrFSFf?RH{x7kGO`g?uAqAUH5Z~ZW_;$6ckWo5rkBG2t`73DeSZ%msih`O zUmf2%^RfY#K(1++#-4R{GBtnkGO3*?tfZ1%Sg4)uuQVnc6X8_Ws&7(LXz*;mPhbDx zo~l@h9Q+k?5w0eKzYjm4_nPHn*IUF!*Vo3~L{aAWue-X}TR8Zfy?j zmk(_G3iTs`>~isy=A%!m9=|~OX5iqEH|RwZi1%eo8?MmvLu4>zup3G*?oI`oucy?m zwmMPCb(;kFjcHAfiU$VhC9%WU18zF~TT$T=5mH+R&mK(Hx(N{gEKZf{XxoEtJv|1f z^WV2U2u>{pluu#HGx)5O4nI1d2*cVSRNz8&HAnCx6YZw%y_WM2W&Z?k_^&=1Ei)Mc zqWB?3PucNT*B3wRV7|y6N_%m}acchKRtzS;^W_oFMG(s(*}W4a5{v#qC9P*FfBy(P zvCkiQ!xq}c%H=+c{_WdY+-i{*BUGnf^XGq!(IjhwLBdRW?fSS7|M7j(=}~4~FuySO zyoqx}YlW8ICe!mJIV2*DO0`2O3{VD3gIi!hx;x>PnBSM0Ir~}(v-Lik^mobte>dL4bjkTu5QzovF;pqb1KS%1Zjcgt^Fd%_EC;``$24eBWbRnN6DLOPc zTDrPnwQH0)DipXxnCCBEHjpJcBNOt2J}agaw{CUh@{s{x#2ayL;5TY^#z~oF*e(`q ztOlyovZdrwyvJz4qEneXzOJBm*kq0%5UiT6zVTbLfLeXVFMGl9ce;H`q1(amD7CA(lYnVwb2)SOB>J_LmE z$rY}XcrZnzDg*5fJzOSU0|^JxFcZC4oValdCZS27c+lMh;s%s7|VUDIwoWNU>rLtyATD&~?m6S}9}qGls) z3lLvK=7K>RKg6>{PW&|T^V*ZP%LgEt@*m!FcFD!N#!TP9fbaM|Dc4nzkNMfz(^-)_ znY?mt$YI$eOXyAQ;^N|!kW8d&=txZi^TE{p=D(jJ8W+C}nmJ>XW9yx`+c**cn|KoA zbfp^MDI6d{U5l@E2XmlysR?0y6F`UpokaI^VSG&{z4_j$7f3jB^ky8wZiFa!l=ZG8 z)5)gsYP-qG9*yp0(W}YyZd32YG}F$SW#%_>M*;~x=S}-hktcjQ-!gkZ;1IR`r*|S)asLW!T23=98##}*~W2oANFvd4) z`P8niQe~C=>UmY=^GAA1;|VD2#I`)1O6qAUl|a8;%H2}p)~H|Xw$yIkX&EI*^fvYY zufbP-O|_7hHf=nV)8)kBsgo#Yk$b6|x@;DJHx6w~MT%+|F>hNxhXSW%e7zx`GPFJ+ ziOrare$;f%{I2SoiNz41a^#?b~8d|lFR|>g}mNwyQ9A}{;mT^ zG{_+8@zxLU>18)OVC!m_&Sh(&7S_X3wjn?&5o;>7?=6iuAuT<~&mJnnf59s9Tl-mZ zuYm+*Lrw^qr*8Ma#?iJEHt5=Fp=ckzL{7|ka&kt*_@tXjO;^z+LP-fk#%gnko$b$6 z;RbGU{W$O?==%Bj)knAXGhH4&__DQ8y_+c7E}Lqd;CX?z0v9xwd2}0{*sVD^`m20? z!Mm=@xY66vix2Wpx~_(;alRi^|6V^{@sxnO`HY?!dUN*_zMz0CS^FzE*R@~h<(mpe zbYptAE%ZfKTEdvw`XqP+j*UtC4)w2e{~`?jg)1u3N!LkT4CB{fO!$P-iqu%_>U&C0 zI4DTpP4jix;$$q^rV@t3r}v$B9=CgWkeJsv+6nXAZbLpRP(MlMeC>1Z=X;8%PXR-~ z&NuNOfd?6zD*kcD!=bD85(HtGkI|Q9Cqr9Z6f#udnu*A3ul}6`mac)!x3K%IJClgS zsi*q|J3v$8try@!VW0IpP;hKQ8yOvc0>H(&pY5o)`yIps1orSv_bDVl0Mor{g}p;Ymt`I zfRMO*g#vz(3`V2^NeyJaZ-?g4((#dvqtiv|(%wTYQ9@)$KiQ{6t-hA_NBY-+h7Fm4 zpn^(Ik1qme8^fTY>+sjlCxa=QfylZJq+b*40hP6m%&7T?LAk+MqL0i9F7-zqFc#se z|LNAxe_K~K6(-PZp)4@mHjX?Y$HHRtT5^7lG#yXrOYE=REr#CVu*V8=NAcgUEDiVl zwH@10+mcwS6qCY&@S98JHzIvX}X4p!Q&tPc*Xc4`N9R8;9~XtF+VrY1q%ded(G{ z?AhNND=nq>a;i!EQj3llEA}a6u_<#ZK{=D!Hnfha+pHgD3{9Z(Tjqa5mm1X{ZG^28+pra6VAaHs*|-gM}jDnPPs6OJx` zheu@B)|!R!Xu5kT!Lcyiun3i$l+uwcNPK80s}v$MGRGHI<01~O70ZbnsOJnF>8$)z z>Ti01`zS7ru$sK1o_@gd{@2l2FO7KH7^KoFahui=Ff6(b&*JEWNgL1rw<8#;G|UYY zx6S59B5;!))D4s#W?GQu&ZN7+R z#_(RIT`}7_b$2H@El!-v&y>Sv*zzV&AH7U+=&z*WbCCHTq>t*W^Q(Iu7$|Ppd>kOA z52p`#e%#421voCm%HhMrWwkKyfDpBbV2I=W^EF`WKcP^t4x^gvGYf;M~;CsV66H zS_E8D6U3f5unXJ79W@1>qW|~djz;-qVMM%$s4F+2@HdA31(v%9yireAcl59KbZVu~ z97Ix3%lX65CRbv6rXC-6zauR>_KI_gk+Ja-@^})E+gHvMwJdfhF(XB;zP^52mdo*?3iBfb4BJvbqd}QPSO5iz7 zV(Q4lhyXk3f;)^O`7-M_KDnCI;=Ts9-c4JP(b^slZWBRp^|1wZ8slon5VTaOg$K z>^7Yud*cjSeoG_O3jjqq-T%UflGVuDTTC?d_buz*Bnl>eLw;0iLbh#U5Cri6-ebcI1PW)CT zWIXY1IrdN)^P$;*5G>Z@!kAmN@7mg;)gc{^f~ARVz&c<6CxR`8RP`37uJ89d)boO( z7{B+}1q3i6!Jra?L1eNFKcJQt2as+tsc{_@Il!6YSeZjx9-o?t3z@X8)lApXkm|4N zId&sOPUWDCM8Fxf>F{hf>W2OWnJV;!4>1|hgx@zNYOFpv2_j1}JL9vwym9FH)u_`? z<4(Kt5?TdjZfQO>U1K=d*|~VFF3istd2N&FvDNhc1^yhLJP>_kJ5U#GyG5BUYyB)Z zD*s+2?3contEfPW%Y}uNiH}Zmn?BOEJ@z#fgz2kqFtqeyhbEkW@ryAN;}}ETeCsVn zP#aq!*+EFvqi=U{y;OejkTrXpHv(ihP^_ADv^pg2=WJv&XX{Zvbgh=od>fD`UOW7@ zWy8B@z{i?Qr>`sd=MMIGdyr>Zmfxg7z+ayF4U>Y>D>L{Y)0(-qrxnCC32OFWkGA>i zFZXsYby=3$Pu;rk9V)S}v?X`e8Iikrko)_~oIJLhP7uDmpZxYzEP7NoJA5Je1@R=4 z=>B8aFOv(rP_YM|iq6Qk5u=75W7@S(kxl+R^87d=5j2fIm}mZ5d+*`YJM^k+jJvk5_F^P&G>aH zj>l**Pxm}Nmprn}_}agyMCq3GrI!$+sUhnvb@A$PQDS@5D`k8dQ<1V-aaQ>SH6!PX zDL2sgvAIRE5Pj2e+mG#h7R$|K=4%wudWK=m3Bkie>)@A5lS^lsJIIE}(Wx?hb z#aj45b-*D6D*+uO&rkoLV#wp-&OTO{1Ii&N6@CyvRf$5gZr{kr!o_ouEeI2n4)u35 zv@wjc(E|V2Qaj9QJkTsGEDPEjNxq^<9yQJxl#r!HX0%nA0b*A3n0dr{#5(6rsO^K%BDO0#_IMiWQ9yi41&$2Zj@$c zD?<)(l(yo|M^Us_4$hYI)GJ5S#RC&I(As+lJGCNZPH0Ns{c&O4wB;^QRH;U!WX5i* zA|X)$Icpw!$bXOxm($r@kuQ1@ebLc9&ou7}H+ULNP5fA0AcBgwYKtj{9iQ5U*)rvV zk#BYInOO0TxpOsTmnhO?DjQ%EpAbn{qr|9kR3PyZT&-4n0kB0SCMN0|805laLVBPK zzX9AY%Z0l3c!`XYjZc*F4k`Qtt2g<`@orgg7u&nK;$!O54|?DgZ6cd+h+S6x1k;*3 zFBb$3TeS~@mwH&_Pm+*BP3uE+mUbRe@$=S}?~#KCAeiT6rf(Ob=Zsc+(PR#;Uv7)Q znpdyzJ21KwKLv3~Np_JP+MpYcmt1ERz$E?Nf7y8SE08TxeL9&W=gh~jmr}Eutbsc# zM@jTLRVwU67w?*ahD^@#gLbpqceG_=$mo~quD*RDypPmf&jLWLKvz>Uya0`+Hs3<# zj)6_?K18Pl`S~uvCYT1(77^1dd*&E><0wWMd5sB~wL5WFYG zLR|h?tz~MO+8n`(hKhxif6elWcOE|AI_hF-1Zl88z)>aCHnH;_BL<0G-XQqxcl!3p zkcX_kAiz-s;gwb%J@$`8X@?zmByE(bt2UY=}DUS!XT8 z+y^e4bL-Zt+nII_4(=FpxO&S*cYn?rO*cCg)o?7~sLH{wJ^cvg40%^vT9SnqyZ3jToX!CeI?u(EU{Uk_MH!Uw@$wG!4-R56#6pH&j2`3qJTuQ_V9GbP z4R=p9KKVnf<}biZ&vWXPs@;WW=fl3$(0dR=#By-+O60ur!IwZZ&QgWIfu?0<@8A#v zE;$cRR94Wl2Umaj$fYU?_?`;;mi*7V;qHqxw5O;Dn>jZKK|#bhwqU`&O}S*_=Cwlj zt$phu!+jMehN?HRY7t_NY&kmOIfK1mGYaZb-?|W?S{XX&H zW{3edjq~BZ7NEi9@4sO|#K#k$xTuLsciW@#=~N!0Czu(1#^dnUyo`(+Ad6iL4Yb<50^cZEJApgI$`EVXC8gD;B^YM`u^??e&B?tciDm~@Q zkTZZC)WFtuUgv~vLafx4w=ZEmiB9(l(NlA(kY9~;rD>eJ{O7?s#WX?7dEtpK!H+)m zrqn%@iH^1BQbOtdJK(6PXX_fmV5VU(jha;Az;v_waoNqyx4%6S=DKg?O9TN?%b;m# z~XMir%V9oxoTwou{Wg?|Qs3_TO*8h77OA?6PW|Y_3pwfjR=za>042uL*$Q zUyjYd-X5)+AH!iasuBfP1ZDlH0ta zG>i+D3@-9HM;(6zyIH*>n1on$>UvJNV~x!2-m8It2yi)cv_ZS%u>%v%f3)by-(laF zPKLyShnRWV!>*W`Dcyq z^Lg((vsfW|@Ht-Gy!7Sb6Go;#AN&B*03O7tSI=P}q7EXN<*7B~5}!ZL$C02LV1zb& zP1$JZEvaU1f)2Jzc+wOt-V`ltSz+Ou`1v+$N7dT)F6222t&dL}iu|`bOkj3?84Mcy z^ZlRi{Krjr?mwEWu>WYXzENcjm;R61(fL2_>gxZf9ZmkDb`{W`hihx{D8zSwH?o~oi9}}m^a%W>6sC} za$A3HToF~ay0#ngpph|%-EUtoDr+_L<^!J@+g%gbglT9Td#5Jj1O2zm44)R))ZF6I zJf9DUptwQ2=SL!bkrWbQis<_JGsJ)+N*iAGVm;%^)K0w#5qXw?k6un;z$aJE(Y8pk znS7xKOdQSxk~}KWeZM4*`>Y1^&F_ws`J^>pl&yBspr_u>dHq^n{YUGhwcU;ci?V|$ z90-GWyXFqzt?gb9DoyG_`OVP?Rt6(-Bx$6!M4A7)FhZXRQfRl_?kZ}XIrE~^MX`2Q zy1!qULv8RuU~$}zPdLW0NYB<*wT0E72sg`?8yEL3bsvu(sjO9d>wG6RR#}GB=OSa? z`$3^0f}^tH>-v|qWg9~0ZE=a)2>qDcl_|71$}>DvV^y}E@O{7hI*=t`B%DTao161^ zctXYCZ&y>KOoA^J8P;n?%46E4tBM8QJB_cu6R4hmj#pu$s0t^uFzC@pXT>k}_c7@S z%~2ocbOd|BJWd5{%zD;ws>J*n*9&tU&B9>hk!<*RVK+j=;Olwh)35B_`>Pu9#kdn) z4bdJBNF>x(lK>$qz;7a@%;kCPRn&SIYQMO-*=As+)>G211@vHwn@~Mkn*_+95-ee3 zp?a!ddtF8rBRN;q@F3O0L`g}%q^?ZIslHM#t-%jN%P62Qm)fvPq(ctZjZ=KOQm;bU z(@9k~ceyeXMDDR)vUdqrkvyJ_%X#1P+>>b6*B)!U{!OqG(hXymO8)db2j#1{Ei5eJ zZ@%p!=olL2;Vk?VND=nWyLKOe3|DP{{(jRS8grd!2K$*zJmmcbgWyZwQ&7pXY2rEv1ZSr``ko`P?st7%gw-&>2E%`@#N5ny zBJj}?Dx0xBGK3$eXV!eqy!uMov_SU_`-;|jiQAF$r`*R{xa|A#)Cn8dcqd@fmI}x# z-W%~FY-C$qdazqb(Gr|2@A|}vtC(J4PE-thudq)U-kRphl{PQWFGXmW84Xglsbl+{ z(VdxE6F2(~NFIesRE*E^ZMXOmw%5A$U*>3C;8X(^3+5vSP5F&6H(uQ`DrvwNKJJiJ zSp1!!3_YTmW89^`(Zd^sJV%zWTfD7!Ur}SQR-3pX6*A7^!4?f1N_?vV?3W) zB5La}mowBcp0?xN3h_M1D6uaACe-ryRHFb#@^FDVZk3yq;ez zWkw?Xovmw~J2+=E*DZn^HOkd*?-N|wt)-)T#v)&%3(&cN!sr(3?@Cl+q2H5zncBdH zk=GoY7p126R<#cI(FE2ya=2F_vaqgByGbPmEsbk3h#@$j-stGA?g@1U2hZIYT=SN> z8^K!QcCEf%t2#USQbtN1`h-S%Dt2&XM1C}K_os%n&9LHt{Y*PJVYtxSr;Tbo;|GdI zIn`L?t=}k+^5;A9sbF)3uOJgzMxNeg1{9|nuYqIFeC}PTxp)2Os`(e^MrOPGe*l*z?S_geA55p$AX`kQDR^>Y0FrxR)l}^s~U@RSs88$hUp)${QkXM zirdmF8MnP#R1t(Kc$BTI^TqC@bG#&rxr)b%_ zeIk~gDTrsBUH5!gc3JR!$Kf(F6uE+dKgD}TdtRvO+?z5q1_yHM68e*fS9n#=AXeOHSRWhi?AM_Sb492mlS)?R0L0n!>EQ?6>Eq;DsU@d4d z3! zjOzAz@xmujcB9&K{LkSF+a#$zil6C&EhqMV5KwOc!no4@ab{Fog}R1PK_OpnpKYdC zfFJ2b*s~7#T`5-7uZLh$Oi>${ylhVBw>SuPVPReLYF?e+gur)2zgr(aZS@0FD#fb; zM3b0g!Nc7)IFxuPQ6817u71)5kYbUR3Dl>XP~!UQ7&U;sa{DzDWu(&{4`Gl5*9rLCnaCD# z*J)MC?w;v62<~7cAE0PSJ>38*#7)5rSV~=Th?#_hgx%)v$-{rfDs>P7V=9j(VCL9T z;@$E9q5w{`yZ|%x`~OIS4?pi-qeA%bFWvb6yL`<5s~zP3|KVx=zZe)DY6N;pqG^iC zAF8G&2PWc-9q0Rf{&&l@9!*vfK*{d(LR{22(+D_kDvYka=Fi~)|47PzH(iHt8`6;f zg_IN57VKI%oBmLMP8@nN`G>gw_oXPeyfum+BnMQ=_^9UK_tO~c8!Qzi00kOAh^P#9 z`fSepXLz9V3eZoaxvSJqK3RgyPEO8M$R9wWnvbyNdeQ@fg!3aFKz>+XB;l9GjX#tp zN8$RA5E%rF9m?Ib^IyIcq2K>!S(}b3Xj<75_|vDC9#4oW!~avE zwx7K85QcaKaq=Q0SCmLHyjQcNRv!Cy85+$)&j9k&w(f zN;=#VvCBK?NzGjNX5y)Lh4jdt6WKvCzd-kuZF`c|X!*a+>#}inBb{8ITtPvVrD&SY8aOt7fgEwaj%^{yj@81OCycB#;SKc&ow@Mdn#x= z*%P~d5N;?K|L+YK-?%L};Nz_DWzlMe`Ajz+J}Kqb@VwkJaC?-`@8X7gKfkq zB-UpS-XB;ifN=YaOU5cxI2xZRF5rNwI-Nf6LQZB_NQQZ5+yW0{d|@C8Xs?hoZWJ^XdIFtmb}_D5RrQQx*iZb zjz)0;?hILmn=c%10Enyluc1q<+3B(NvaH2EiUC&^3GH8=G#k8d@Bi^PixG=^#Cg-y zTr)F;`D-zG_VK$5{6w3Vi!bbRHteNA7C-o^Qf07FR)!*|?xv~ZhsDS(iue4sJ&9YC zuGpbkgS}8XhP`Pn@ztE93hHS|xw`cN-gh@OG{je%FI1AY$KxkgY^F(r=%tT@nBtP< zox@GqHtROw`!j<5zkj$D1kRoxj?4a{7A-c58pmyw_-oGJdB=V2&2ZNRpT{FygHsB8 z#5wq#1Cfj>W-;~C3CG5%#m(%DUE_1O5b7J_E8vFA{qz@|w>VJi#3AjC{qJBUCFV!v zb#}?2YV8{+kAbi12&Sz_bt>tdv*nD!PH&mz`oz;dMa!2r#l=TTy-Ojn-KKTbs&9a2 zbfn<(iF4{tpLFP}pIMu=-HiW~RrmK5%iEVnb^)!kRy#gljdwCw3}zT1m#4L1_>Q2_ z;xqZV>$ABE*+aA6R}UX#p_uJw-ykGkIUh_003T*FptkVV<=TIOFPRBl4RFPyyAO6xr2stmpIih{SE87#*N2l-B9eK zLj1fNlkx2DJ=ZDtn;K2M*(^Sz9(JbXxASMM2^*{105PF&*iRSvRZU=HZSXE#NDVMT z0byB2sf9RYGNh7}tJt4!4TDu z1)$;Xu#?~LObL!B%!lfQs6}D=zPS@l;MYx&`aTMgIT1WP2A#|qKjqR=4UKaZiwY4) zx0_AvtM1>D%@c)dZjs)`EP0zJ?Ny2v-fHh{4fT5?vNp04#GYr_Odq~evL8iUv5fy#W_dMwWVd$Q z_N&3C_X}NqxADuLjIDY4ttjEzs>;z^=*i_k1BWiQO2_dra-~HGX4JpR6Bs(n@XLn? zYqlK>lGmJugpfOd`*)K9Hr_A!)$lScIgjd%)bsc6t~JQ=S@#X zTQM=^S&|(LSE|*apI1jay;tup!X0<@e1>*fRWt_#(Ed;i$FX|-$Y9@@IO+@NK~n3L zNU4(jy^V%Jz+4tX6Cc~EQSc>xIop>U^P{70wIV-~@-=}|GGu6;h*Ut+;gnj;CMsI`NuXJO^m!{R$-TuB=X5CEeM|h!_|{498FViOR{dg%DGAe_@eze z{-~K1=+uZ`ZZf_Xhw^7XCSNi2c_u#VmQs-CkHCgtK9js>r|-rjn)X4o&(*AYjgrP+S|P{AJ-*zNEn47#<+5`hdlj_aVZ6<$ zW|pR?ZYGDUE|z^hAJ9P8 z9DyJ`J0cU%&Q!D)xvyPNiJ-3B&7bG2Hg`i=nVYSR;!bUEpl8hXbwRe*&P4Kx`Bn^! zdnUo9>N4IO1e)Jo`3=ia-0N?aM}tI+jgrTGlrE(>Z;aaA|6~#lEm1oAlr$DHr3>x6 zhQYF~;8_C2~1O3)AKICRkq}a3tJMLA(=8G@(gLZhq!2EU8a+|S!-^})J zrgPX1m-}h`L14`jJ!6uKE<{18?$;=~9#nTWCuyBrIVe+d0jA&TrQ;Z1)0EEV=f`>8 z3EeOT-h1Fk`&CX(@}lUVC)C%WK+7Ux`Esqcpn#{pDoNJ6L%3zy zz3cUsD!#7ev+`3d=mRj!T*n6f>MMyO_EP`9`T3++8dY)npb7$5$a2DYdMb1{;V2F= zboB7nRu)SXxG2$0Z}`S6bkia@Z-le{I4dXmbosf(Nbuv6f>=G5Pj~rC-6O}Sbj@WX z8laKf!q zr|E)IYkOhh+=l(vbDz>5B4UlIoZ|b=E=2X@73!;x_3CC%xtupG@w2j07nf)k(d4{v zp>mQ-@vS6NZ@Org{&xn+x&9+3rb)iFe(csVDQi3E)RPT6+7+2&;}iHhS7Y-^28&zR z4dy!%3O>!f-&iaPllZ;4t1c#qwjvra$gJHt&lU+MtRTEcWf&B;9nLGHB@PxN%07PV z!owMOs!-~rcF{x3#Hj|D7ND1Lj#%+_U9eQt2I63QvU(IOt6%Hy(z`O9(gF+p*pvi| z?Ym3jmwTPehKs-xlvuLw&+#uxl&e$at&*^xM}^BQf4yN;=N>XP#@e$Re^(dba{a`z zsavW2_r7uKLJ-aNdA1vsDs24;Up6qQOXyI-M~m> zD`gj!WV*eIbp{g_{8XdBZDOdyNY?RjN`y7IvJtiOSHFR-<)rP`AybVYnHabk)C?Yw zElArEMhkteEAUx9oPJ%g)_42C_G5?jVIx(q#I%aBZN(NCRuvKnE-uYQw-UR9r@)apEqhkG^H<97^$%OGG{cf;R_rQ zu&u<%%^GPx^}uU>NI6VwYNNs68+Wb^?&r6%Y{zjGnYVNMFLX`DA`;lduo$ZxoVu7q z!Q^*IMAf4gYuoO816JpCd-7QB6~}P>rH$PpsbebgR=!Kl96#I#CqSrwd!!XAyA^7QC?mhGRnL;i{k@nQ$C{R!?$=O-n{twK zdVL!)yZEXfRq3FVX+0P-uShsKXgk&JK}xv7xK1YODQB2f2^8vBnO`@PK~~>3m|Z0C ze`hg6OceT3w&HTMmW3CGbaw}L-qIbZ_uWhJ)nvJsRS@;CbD0`Zr-=UQV6Hp~!7(WP z)#w_>b(<7%_dL0`od%tYuUnQ4((6n<-w2xi-WBhX{+O3FoTt<&Eh;>Gb(X*jl$R6@ zbxY3ZGJcJ*huZnh_hHuBr$_}4JD7d^6qLa-y)V{+CGwlX#3yLr{QDv0=A||v%jQR+ z%cJO9{`KW;67YRxU1}NjrH6arXz_o2TnD*JiPXvDdA@eW$wBz z=CsD;BNZ`|`;6V5s?h;wKS>el2=`T@U(xpK${l%HSIIN$Wi2%%2>N{8oSCP(H)XAO)_eVTMsOq>_x=`QemJ3SgXMM0*8IF4Kwc<(xP01;Wv7mb zx#?RQsd75PY4#*aIqg(wa3ni#qy;CtqC}^S0X28i_$iT?kB<9Eq19-ylfYVbb;X*Q z6owsGPIgFaH#KPmLXU*)b+t)%9v{JY!lH|HWmIys|Gp{R!Gr}CHQiLKW-d>!{-pD@ z<$9C2Hoo|H3m(VHD0z7VQ_BKr+to)P$%^ia^Mi{+%Zak8Q4a*HLT?T`+!KhWKlt(e z8?{p(`Sb+U`i%K3ar(u+gO}9=!fF=e>o-JvifttH{tAxYP}TDxNHm004xaeVZ_?zj zWE5e05v_`Ibs+8EnYuqaDogsJZC%MzB5G|xJ0NW}{;BQ4m1qv0vOBgH;|Vi}^Ai1H zK!Zn<9&SA?EU-b$QZq3Sp7+jj z+OC+bnmShMmYQE}X1Vg^#2v-FJLKA#s+PzpChQ$SEEf{L0s4zS?Qq#51xu)mo~j=|)XXjSLy~9YLVI@nvTe z_7p$aeJMo-o|X12QTvllGd2#Z*_v{bV&UeeV@N)omKpL*qdn|qOXliMX%Zc+>o3#j zWVpx^f3d{;Z6d{Omoyt55OH~QE%n*Nb#FDplH7)=`wgGGOWkrJF4p#3{Ud;)a1|ES znez_K%tdEU>{1qD_k6bRVHp?%yTd1KvdmKDam#{c1>?)Sp_fU%gOThUElc8U)Wtj0 zGVs1wVXDK(7*kYrZw!?vfAQr%$CwU3{UW5#q)gZJyScopwbc0Efssqy?mm!D(hiIn zctLXnDF2_OcjoOONAy%8Ms1?0xvdY8MWP;+zV||gQ=0U;4)!-7TT5k;u79Lrqu)IiL2{C;A~}a92O}s7NFzB*Zjxkal8T7r zOp}A;&>*2f^3?X;J8$lL@2)j*&5VmB(7k)_KUCFU^?hIQN>y3z6ge$93WYj_mX}dS zp^jissKYwPkHIVa^gdbe?GI-uwB~X6=Y9OqOZc6}<<3194SO>ew+Bw9D04e|TT@PF z6DLzsJ7)`fm*pch5-8MV6k6uCrhDAtu!p-QY53rP(ENziOX@O{&0p6KAL4)cSpIer zm4No2Y6}W?UccPm9Vw#|(&W65+oN4+dx*N*%J%l3RsC9TwazF$`qT8p^ZVbW&a&(z zM6c~!otBqBjy}#rmJqVg*c0t6;ViMtSH)kwsvF$GLm>^rL!lH`Er^GaAI2Vb_pJ!T zw)Bp9NYNuN#L4+T_-V@?s@&xGcygX$h1Hkm zC-Cc?iu#4s7sA5AQX0Zo6|oWA#v_eA$fs^KS!id*O8Ql6=jv%K+_SUGb0rR>RV?8Z z!&sE8LVqCFpiWt@t~VK0xLWq$v{rxqZ12v}D6#0cvbSJ-&}ry4%pBX2PAT#0mRtyf zICaVI=_+?jhT`wMzJSKsl}}xOYcSI*=r9(xt5>D133)wOX2tc*Rqz2i%YI`<9+hWhBV)!I9O&+2vd>B8X6kXBe+jTo4_3U>JJ~jH)~6xlT1+*DKodkMiPyNRpfZdO)S zjG%3dlatfC*x2m$c2#6L*i>+nh4fgv&i8j-uYV?EjM}pu`dIMUE8(W&dn^{qgzidL z>iYELNH`YzK20%_R{?QBgIkSFOFQ=>W@hpkWuTK=&5E+Xd$#v?mP;HbWQTosh$XG|Lm$htHB{QM3)2YWKnSs4tH`V0)18vn2(!wu7|@!6yWLNaA%y@vX_QmXC@sT$JsrfPesR zZ*NTlgB-9_8vo?gRVOWNZ3Xodviz7zwZ`1C5nM*1uO6fCujHpspYmIEUn@7@$~CIe zGxlD20fS_@8>KqqtQg7FQ?)t5Q8t(h{wRYzPe*5MN5Sj<^S=1@Yzj6NR+V1dQVlt!=r#yA>np=bO9cHsX6)*t^(YL}#eu>s!s>wRi(PvoZc7G&EEJ zjqYGP_$7BoPL2@m%Z4Tx`&B_$7Dwz?uiPn(mygfda3Zp1*Yw%u;?z{y-p(cmGxMET zA$#qB)AY@!thg!`3!PoVYc0+Vc7c23To1aU9KKZzv-WF|hvN~Me0xQ`p?WT_&MIDiS@ZbTAKwxt$ zvw!Mfl1Ill^QvJnkBW*4aiByI7PhmV(J$xIr&|zV6tS{zF5XT;A~DxPfvXr;Ue^l4 z(*e?8mgJO_I;yH~!O-7DM`uAO62277cTD7!D&YrMR)WVg4H&r>;#LqZdkReCf-c^W zDjV^%wvI&XFDbm|IbT3+^7rrZ;SmuyNC>9OA&B6>4u|$u?^YZncFjd1V}IXKas2;Jd^}3dn))(2zje<*SojV$^~AX!m^o8JI-9j2 zM%FmOHnNOKxmM0sF^N8Fp$6wu4{d%LeEx4aNRZ<~1) z^75_eS5P3AS*#6wjlqX`c#3H1&UFS-RbWPau9_CbSKIpfW>xnmHW=&2RAf(O_M&c;L#;%q;i$v+sNtt9s4F9=W4O)AV-gHWd`x zG}InseW^X-(xX+?Ey;z~u0h@^+aRMCjmRDvdI-17bX%4Wy4a!dF^+DH4NC5%*FTaJWC?IVc=o=Q%+-#m>c*j}ha}m+|mm7ID9-El9UELN^>Mve-OfxHj zA@40Aoa!dl(BO=B-}z+yn!gnxhF(CSYIIKl5GURQee;G+2&6*7ohDJA8q zGvnj!7{aM{OjH*lEcYUJ7Hp}{jHP`1Xi-;pXJPu)GXa}>lqBLH8d>@3>I7_RPR(A$ONJU^DF?rqjd9SWe*G{%uW*muudn7UW7*^iTS|OWWR2hN zJ9Y%Vq3HZMUNHUgM}bNCG`|WmhMR;(xg!vRt(o*I#GTsu~!M_YI7;lziOulV| zGf`26b4{&X-B*(W4Jc4Yjpget!1O?4|^}aWgteN$xdF%XfY4 zjkdoWdm4xJN}SxP2yG2)>N^{Ug37giKaazfw;SDALO9(%F0JcSKBQOvuuM6={T|q7 zp{Zzz^-M@fu-oFr)W$}3EzOV0UbYog`@=eyg8j+3PM&O})$&qSPEP&KSBlvDGo&I zWt*)9I&LjO-Z-h$n$TKNw}W`qV=zqt3@e>*VdPU^Pnl0yu^~*1t%AlOHLj2G7|O_u z3~6Qag4H!WiFUO5&dtXoX-wwEd#a|jjj)W=VA~}r8Sf4_j{^ZvGiGCOx)a* zL5z~OUSF`ycWxcrnd#KY>&ty|L^L}mM?F@EQOum=LcEao{rhFpN0ZiI0Fy*wa%Se4 zv~&?te@qn)=fuX-t|RULHLi#jx$D>?Taj+G`lzp3;9N&_@Ao*SQ~2W7*s$yn;%H*> z-VPrVI{Cpq`SG7>4<3-V%L)q{^+XL4PE`!2KYy;+GSkgzT$xT$6EyzWB~3{1VnPeX zMtXZ6?#WQ0?kAS=m9ln^zYl-+F1@qU$-{j;tYx}?U<#QkmZ|odj>lFA6lxmFBOT^8 zZR<@eQ3BQxkbMs>u36{@zIL8+aA9eOyCx|W^jE?!8jdTkWJ~PNC3F4t*KMd`Y>B+B z7Mn}M12uj%Tl?MkHWvol*AFzmo2}UqdEpt4MQj9BXk@ig21;M4njhseZ+*vPYGyXy zZ=M*=6hy-(3#E=I(E}L{c===u{`vDi?#RlrOGp?Q`);LOxq6i}_KebMt}|_WW6++8 zh9(Q@MNOzvokZgGKHPt@u{4|wIXz~s^A1wyZEr4fqxH({;w5%}N<)$|KOJk|JKvKH zKc-JLMJi%TZTg|4yMO=@9UUF`g}e%W_n%`T0x%{8tN~Z#mgg`Y6BroSDZV+RvAm@r zP|A&r%_2uoR6Q~@G&wbusqWjid8n2=7YpiLetbQFROL|AcT_A_bD$Aa0?8-g8mrx3 zD@YM%;DLN)JRKAVP&6-dN zQq;Eh=IZxUd2L>(N?hxwhQ~a9Ef;$VlboEqy1p((+@amy-`A^jFF4I0mf6>L&%@Ib zS6Hat*`~p=vq9uQ2flo%dhcEo6wyp*sB5szXYO4U7q6;Yp7Gv5Mm_eU17e^Fr@=>6 zxV~$5YmEx(7SW}TwPMs~&t5@`IE+0$M#*qJqYHoygEeosh#8$3r6FYXt>1Wk>r#Vb;C8|6suj#EMj8pZ?_UPp?YBJQ+$e$75U!E>Gs z%DJ^7lltKB7PGEOkG1u=j6^G_6+C}_CWGQ#-QGAMA)&FgRWL(caLQX_2T2YefBWE_ z87t;dh<7F8pr*^z$u|mo{W^?^*jFHZRW7(2DFrKr^ORx*EhoQ+LIuSyNq6pCN=AaG z!ks&JJP-CZp~g(7;WLAR{0+n>b#{a>^T*I&Bg^wD} z(o6ap93eZc>Fr&K031kV!q4A5Bz}%M9ZJi(uV4B5SZ>@yZVcZ4Bh;+AMY2%fWnsLBK04-V{)s%KIOn8Dw^9s0g2D_`dKASeXGlp&@jv`} z96T?*MDh3Wbiwg#h5(9`!jdNBig}(l z3jH<-K~{>HwRf@&D|pHc;uhWS7Es7aq2vcsjqMH{IDoqjd%j{(E@^2;{I*RA<66T_AULd>%VLH|KU==U74Os z&#o-_8CghH>g02Z+Ma)ez1S8-35h53T^X+zT?c6f&&@k@ATiL=vRq7TyTNSDhUf%O zb~v=qlU> zQTO625BsAck1|&pxY5U#lQT1k1ucc9O-yKiwVq7t(pRDQnmwXD0$?6Kd>Ha79l%}` z6eF(RkefDZjblTDGj|uYNel*tBSw5{u#-i0{_MGPQxg*@k;cBdVCPV&wIkpm;0I{l z1HzP3biR=7Kq|9h#5HkoLnH?erwi=6DN>B*djEV0}*pBEz$@9R*T)1 zjQ~o^21o?IT)op>(53=+UDJ^73y1+JSd7!#Q+%@pb@Q1GK@)$jDel>eWX|>W3yK0=~QM z^b+2EmHYpB_+3~WEK}jG{`LM#Z7pUd-mMX$YLR(cFQDhGT|&RhLy|QNkk72S-D|lj z!@g!uTffXMoaseCzyi#-*EG^lJ7W*d7v|r9;M>2X`R#^o?k&01bRmb%+qd^iIoQ}b z0G`7|MO|cOVX>NRPo5vCst9Hf#{o*i26M$W^W5~=b}@9Uql)2q@HG8y^g|#B!BSo<*x?D90lR%0zt#!HSS9O$H%F9t)6UiTlb!dNFs^f`S4F^qQuo zX{m`BZg48;V9!H@29zAoN_i{<4yNe8KFE4{dcGc#9H?Gjzv?*?PhISHP*yldobR!I z%c7EytQ_xqn#8L7XdckI&ZS}FtfWs_A3g-*R~xM{3%Qg{gfhc;Yg+$g$vw*$U>V-m zy{^$vR`zF6VSuw)!>S5NZ)rPO(v6klMYJ^1@2bIY00PY!w68IgkdOcy$u9Fjjs`82 z*Y8r_yrH1Fa3QAN+TDFOPL~=i0p6Rl_uGk0@Z0wQfO*Y8Uj8N19H6vVoU{R0Nc=vs zHi%U+`t24>w^*wbHl8xfHs$5>_5(IE~7nrclFI6PIt?gjh{}Z(M5l6pS_-{ z9p>!`#%01xBDc17?+uunay)*nf%U*>xy0Bb&C|RmCKT`Qy*;Pj*wD~j>0vyZ7Aes? zQZ-0w^V^?Vv_npY-05$0_T3BlHC%IxhvU0tW#<8wb^(@Y7NIF@W03=)Y}hq+%NH^V zAUY;32MJ<MpO1U}@})W&9UA!h3 zVANV-g@7Pq2f+8L?3>JzbV_PgNLoIAOa@oFvrV)&?-kkXH$Tum*w+DCH7h4aCX9vD zHE3_I1uOBWY!K7HyaM-UU0?5Vi^tGEd6Mk8zjY_@%_2J*uxCvpqgGvGB=PN)%hVwG zeGH-D^FI^dsg$rQ35YTNHUmQft-w4Bx^tVPSmH{Q^Cb0XVVR6aU1@nAy)p7$`D<^Z zjISqIx>#L<(z3s>Ou%K9yAAI@UYp+`d9X!2?03)wm{EInzC>PBly8g(W<%GQ4tX5l zpsklh@B!1UhRJ24zD9iJBV1*JX(LtKJ;+YT$h_-c%F38tct*L8t2yxT=j9D%zj@Q3 z*55Eiba{8VC~v$~l(CD>UM!o8@zPbuN*~nbbxbz!wQl3#_8%l-A6%5Rran|$42k60 z=e3NmsHkh)`M=hFXNX*8Ri5FBSa7qpKG)Ark784yAW~jgG2dVA5nPe~4cXmVC-afTRtSoV3;S>g^tX+8rf;fy68|m7j`wrjdueRl^i6zEx`@NV&E30;iJL z8f4YBu4qua=o$+-SH$_@fi$=P)$;9sG8H_IsVAZx|DgpyZuQ>)%!XH6VgwYOXIi0_ zMczuf5Yo$a3k$@|y!ig$=)ShluuB;HcAknV?dZu1QA8DAKZ(VWDt$FIwVBGq-j71a zr+Rx>q~d?4`F$TAlmsIMDVE=?`QnS`&x>Vsv8mB~<_cJ#M@WlBZAkSiZthdEQH5k` zA0ht**(^(Uu(sYS>8JB{DJtGc)pFX0!sPBDmmMB7Gk8|Mj)xJx5^ zV1oOP6MIwKejUiEVcK~9zm~H2WC?58L16FRw@DrteE$4721wH16*5BO(Aifa)vSk? zmo-!=o?}nQ&R@KEZ^r0fWrSryxZkBPb*W%cIu{?G22}q7e(>;DvOadB)jkMMg;3u> zjB8X^SI3BZl?GoD?o2Hu7`nx8ug|4`2V2AB20l8bcy2D`LZOe;gV<)v(4aX!;B$d@ z(gtP*A@zX}i=NqEjjWl46PiFG80Y)$ZCg%!3qtDa`R>?%nFv}DRE?3{;IgqbOKqKU z0-m_V+t|QhD6`GB@562EJ5U)w_N%3-`JIOX4s9*SzwOlr3 z_0pf#R*8^xY_BCAT<7NI9(Js!2ktFuYwPLL!~I0pt?g~AA75YLx978azzsz9a)30% z!U@TLiiTGPhT664yD17xBEDDTtN%8#(GCx+`I7U>W1roOS4OLAYis9D%+1Xy*$tLE zo1dZ=(bO-s>3|fnS-_`dj_>;QyT1zrV0Dl*XNJLZ_AfYlccxXKgkbQP3>DdX^e^(e z|GES$-2yuQqLgm11u;ko(1I`(pFI*m#AWs^WXx^2wrzJWuZ35v32$r1+tZa|5%zl) z$l$VLr!U>hNQ5Xtgrr&8pF&Mm)*sXkZB1Np$cpDAx8!75=Rw+m@RlQ$9^30(Dgw^a zcOgl5hSYrOgTRkf!E*6ZNF!%3Fiu83Bp@TT&{#2X@$mTg+*5Rd{8??=mHXQZo~sS4 zP)Hd^(dEm?$aGr@K{|x)1mJ)a;q*x2+6AH8C-{I>)nrrX>Hp*az+<?^JOc2?>u5D+M(E4~kv?yrrn9tgLjPXDR*)TWJ0&?Ierl)opzQR0LCz<<>>4pE+!v2n*V=v+N9-q8j zBt6_}A7VwqiBIp0-Iv5HT>@*5RM&`SXJ^+jO;dcmUuC$dM3cp3_@x!s{{Foa8XFQ~ zo;#sKK}^PC1B>v2aJ*qw--K#xZF^?<$UHuFdNHSodzmY?#Wf*2JE)%%!iSZ1CI@G3 zJ5XdTn<;Xe9hn`GP^s^mYWZcJtXBaL~2Jz6?o!(zqyFsl8mf+ENI zM8~=9mDv;Y3L<%fetdUx;}%dT>Ljxlc=`jh+MPS$OqQP>x8gnTj_S>bi__y*zPX#G z&Tw44ssgN^h&zvl&$f&LZZGl+&4F`OZ{8lLIEu8?)staL{4T)%%>MaTmZyxvT&K+1 z0DNM5FDDH@?yrd1db^}oIZHP+6)unU6~bu7>uG4j4-{@C1)Ec4!VW!nus`2-Lq0`z zQw>;>{-w#71dj~@q;<>T-ZvG?%j+P@w7>jQoJuIkIoJ4`uI|x+LS}T9WP+-ZQC4M@ z`1wnV8H(Gkol}u+k%@^q&ecY!$9ICNx6iI&VBu-zJVf9&*kXHQ{|%y|&Sxbvn!)$i)`IRlkmk5kbLNm!9uN+YT#2*woZ#^)0Gyg`4{;;Q*VrZ0>BD&whGx z*U)SDv24&6Q?u!K*MTPgQ#%Mjm{HuOV`f&pv82?cBxIO==!hsGcdjZ|1RG~t-S+)^ zmmK4s9JYBwE+nB{)ZRX#X-aTVORF3-DS5@k2E;x`8A>r8g+qrV%qz)IpI(g5he;U* z1<`F-6IE(nZ!EW2^r+S^UO;{15#Z=HHKmfrUOHVdP)2#vw&MHuq(sRuLsk1&xY4PL zeY(T=7a+Hg^K#8-ofbvtrO0(+s+>r`yr1!&6!!e39~ppDtMBih3P>}lcWSvc zzCky0qy>MRYP3 zYlf;ivHvf>D4#IIeqM>HyX=vkofo>Sht&jv7h~<$4y0dW3#az2$03mTbtAieQM0OO z9ei>wJ0EmcLP{?QrjZzdo#FDe%m`lt@vf;x4zKx`6~|Mpc9wVj?5hjZK)fM^UGJNi zpjz)*d2v#RZAzZB+}IE%cWpYOU+`f2e(VOZ=`E9zpL>po%W<2~zug+wHv6a7j7fH~W_^agVnav38d$pc&op(tso zNMO`*p;x*jIBkEn+iTg!biX>BDWmA#U@3j4+bDh49(<=M@AT?i#FIf45wF=%Vw@kahJ&-qCp)O$Ko|C6? zF_lAZ-Ntnf_4uT;(s69+&!2d|ce~pQwIH6_k5OWlG9`z`(}!hEAE^Rk_r8TD?88uhId*v5JSGq#sX|GIV&E2nd?8zOlyk zYhwTS%#H#^0q1LEd#A3ghB1Ub`?M1X0w79emZso<#1ZSI+g3n6;(DiVc>on zTe-xDE`iN&5~X#&TFMfX8Ct?{j6tebC2Q8Zr-QWDbPrIB!k0>l78-m+;_EOHURFEX zzJDsghL_q%WP(0MD2R=Vi!f4UIZz>_gzXkjuL4o5Q*Za7Pj@CKY3Q}IxDZyANIe=` zzg>T)XR8^AO_$nyZUMhdpmx=#Rs6ay32dKre#gnnE3aFR;Gplpb;H9nQa6Z4&I=_K z3EK7LgFIr-ef>GUz8Hehlfc*6j7QHCB=Mhbg*!1-bnF4m^PND@NJ|S>*eej}rr%*3 zI!d;~1`-BHjU>3x;wGZUQ4UM|9NnbFp3es6rIr(ihI!{!MQmXm)0N1YH>*6|ayIo~ zu}WN%o7=c=7$;u(8N+_)x}2lP5ifG)ki3Nh*4{a6(8YWKMq}l%Eb0HKe;zqvbc-{2^ByGq>=Uk_9M%EsjH_26AT_7vXfRmQy$1%#Kbkf2mD0}b1 z7)4w=-!(H7{7Eu8hid1I5!iG3Ikp5|DUaP)ME7iSZ#MAwCiv^Z!O5EFoedlpS{)9b za#^D0U>R%ThEIJkMh+F!)wYq7X0}w_G}YT0FJ~RU(OrRI}BTHB?Cx4`6@g7b? z+{?B7mo?e!xZF3Z#&@A+v0cQ*6R3|j-Q91Vr>B2!ollqfs*ED9OzHl8A`ShEqozT4 z*Oqh+xJgXS+UZM~Bk_2%c~c7uQQ)zK+~dTO*wIhi?_wu^;da$VHWT0iIVyX z44hNB*x8@U?V>&j_vVC(fRe$`ZSS(rYS-FC^{!K5^{|I#e2TP|)>LnZWCBlyPajcm znE$W+Vmh47pr?EqGu8Znz+Euvfhtigb<&sBFan{UCk6AbCL&Hr!gZVB|8>@N62^)iAA;2-Hs0r3g$1;q{0SZvA+8Y z78#lTexVSuu0vua6((sSYHIhW9nB~2>obuCPp=$l1M!4ybuitTT!{9n5C97c$z9eh zNH#GaKl*1F31-xU$rq~5~vewt~7`CopJ&325fq{fn8Pg{byT0SGtUaWK6!T_uw&-->00cYq$4GTD{zFt}hrH_bv+9 zo79uKybgXTym(;>iAfcvb!TVCqB~Qf1@gABA3gi2Et-&FSrdPGPs*3_`s(G65{(5jRwJJKQgXM$YF?HMz0#T{VVSylVSZGgvKUCsQuuxNX0a zYJCWGW>QjjTp;iEykawbZ4790k1P2&6qnkH=5#Zv0JeD7U#&_uUoPZyPaElk&4{Ns z>Qh~|b(sU$Dp2Ug3pGQm_V$zzTdu+OwDm4(X@x63c~VWwJ2?~0f+Tj`Z1?8oJO*lN zw#ywrc@d=dusv=c^cmOSka+Q;M?*-|?L;`!ojW?qg}Tl|gM+}zXN-CvKHJI;(|6vo zubeA1^BZYvQxqCz;IwnadSIo3KXlds&s!3jmTQUI256j(` zk`pC|P!`w!At?Fw?*t{8Ro5l#ZkaoCR%nVV5Tfdj^JmobCD2=m>*qVq%&Sr}FkA*j z44?#P-2Rc-EK!9cC_RRQ^rNVxpt&Jt&901)4v5j`8J4(JR06)#?g>Et3+aSSRa^Y) z1>+sZ6OKVqp8Z4nc+APjfPh->(KKfg@5zc`?QBlOcy~Y0$eL`1*$9KAZfJ<6Q22G@ z@6xa5;_s3Xb<#RK^tb%+R@41d1U>$@CXatrJpNDDP3lR3MkTI$A1!<^m37b^3z|HtV#aglc~jy{%U!vtBi;W zWuz)azap;4?4m#L6rf*#FN)f?Odv-_dJH5%d2lj$i67}(`1#WTkyitm?2C}Blp#ic zh@gTV7I`#{&!+$Q!N{b`-3>esY*Qv^c0u0?E{3C;Rz8gpIIu1o1VUkQZjQ~~-rmE* z10?aq1L7b$4uPB>(U{!1V+nvKr=d!0f!C%T{2IN??eAr`K#?LP80!W_{3ofuDOao` zJ1qPkAWvXsW@hK+7Ltx@G2^QpoRj?l;~peJKCcel20$r*I(TwwirLuM7{H+z0`TYe zqEggC{#)d))b0l4ISCIg0vN3A>RO7lj(`pqAcWvbSONI1{5fZNW)d|E_j0%i1Oy0) zCtXA^yT2R(25Ka_mTf>ok>0)6cWds-%d0+mlnQ!%(p01|J4l(K2`4Fn%Mgd~lpxmj zgiZ#kbLXytsseCJ3s9uP@O2`&3|)Xj$nrbb$EIQydgp2>B{eNAv+Sz3%n;!_G>_<2 zdzUjI+H<{Pi%`(1z&VzSv;;jPqm;0P)($lwHzQpa`;y0N0~Vf;F}#h8)Om(^^bZLQ z{u`in`90Y>h!`8`m;wE^-VcsHPzI^cmI6}FB*0Ld$O7|wzO!0$pHJMzhe#D;^Pa0*XsTg9T1acbJPu5;2iO8 z%Xtvet)Odbx*TY71#G%XVjf4{N2zlxciZ2wX*5d++VovUD<~;xnVF?S4h;5IYB!8q z8m>qzEsdFbSF_b(j}Z97KAXd*dL2dnfro-m4SUSQBTYsdn@2&81J1`LBt)RF7mRI* zlb9nCbAjL$@H!PYY=?9TRaR9|UA$?fZ!NuN3_^LB z9uyr&?+|PiNO;U7wm7>Sz0jT3`BmwF>u15Vb#--NyCrS?KqdtZOn`+#)7f-z z#HpS`s88i@6BF~HPsKT2zoqzlQqtwEot?z4VK!^oWzeTU?ZaI*XzO1ASAePsS``wC z_79;2GY{VKT%YYQ&lYUt|HfSnrn@Zgzj5N*%< z(L<2#I9nx!;rys!zTcag7AkwjXJ#M^u!nU5VMuJ(4Mk}DdUc-+b-`tX(URw%8QSLI zt8NfDKw&WtTyglY9RV96m5|@{cD#8B z`W^roN-U4aXX%5N;|Y2wlzE$3-0~>Xse1qg2Qy0MJvl;#hz=22HBQ(W9MNhiq5r%X z&yWacF(Ha}-H-kH73AJ^i5YOV>C#!@K5k_)0o?D4@3tbX&z*jN}Q> zZ1(>Bdp!-QXV0F|84Q4eP``C&z3D$!YPIM`e`hvTV2IjszRVH13ilM+H?zOBFRsj=y>_(RbZZ? zdbv)a9BbkRsW}kuMyr#!TERn01VIgI1KKX6zp>~3j8pl$_;_0h z(KfI!N=>_9$&^QUC)AZUJq!Vxy$9Ny09R9G-aHn|XR1A}jL|^-`l`9x z3I$7{t$u{5mh9Y>(C;7XBcB=aM!z%FH91z{bdQdfR^83bjk!JC_+&us{NkdfzJ6@# z)k7aN*|SuyX+AY%IvZ-L%WC6y`HbrI3mPKv5vICMm*k@F`j=o(JVAfXkI`W;xs7I< zjfEnn7bpB~A4Z{9E1zC6&!3;yYn{b7mk(uj6oe5swT(=ukN@%RE=x#kpzdkcs;a7a zA~F2IMe<{EWLkrzaFlbUsk5~tO4ghma$OqAdc>P`>vEEMR%&ajGRD<47>@8_JYEF4 zAR8UGyp4i_f;7MU@z^p@m2C7L-X+g0ZvArU*u0`L)-MijcYJ2qXlg93PrwL*ITFrTuQ zbSPf+tc0mbB`1NxR{N=eM_{^Ti~`fyc^H_STmW>~I(+eZC7S{PI=uAkJnH`T70`V1 zpc_+Mrp{pApV2(+^-AXb+3yAftt+8#Qx!ghrQW;F(#0>p!;_?XE%nq$(6DceN~ZSvf{Qp4!h6R0SozKqkT$LO(}%FGt%+J#OW=XKuRmwH!1Gi@-c z65n{C%jdx}q;GC4$hRCO5Wi>@nTFqrVS+9Q5hNz9-}`rF?H$g9*b)Gf~pG}Q&d+EptB z!>YkmtPWMyiuQz_1NaN=0SYPFk5ZgzHE!6pw) ziXZB6gB&!p-9LMY&RrSvF2}%z`8;_;sqLMV4&2k>j-82ktK%Hh57~^@G^MYg#?}#0 zzXNTYRc4rfh9raGHRiLg;`sZ*<$fv4g)0DIcUJ`|y;wdM{AI^`xV@uJr*TG1_X9^r zj?yaJ5NCu3 zj+ODDP+?cgT-{B6-w zUdOzHHk1e;*PGVF>K+y}dX}&HNhiORN^Z}bNa@G~(~^79{Oa0h?cDY1!>F5>-?M#U z853SL-k5C1E4aY5EWQbfscYd1Y!_Z5UzbjEz!z;0E-lSea||L>sQl!+r|~l$Dd`S+ z5q0vgW*WP$$58jNe>}TAwYH^DfCYcB;P?EpdCAbwsgl6igtZ++dK>2#7J9n7Qyp$z zN3&met&pa!kkMsjW1}f8{mg(sPqldL*s)2Egu7iin#E%M7{xSo=5Fwj`#ka_MO0M! z?-^npZsxd%a9X;Pn{h?b33bzpr*)JP!-6wu{Qv6W4_8QoFj()+$q)k57vSfY?{xf} zcWL8pmzZTom;sm0iKlrB+EPs5=zslo^e^Kdt~X&PZbCK)_FQTkB5YeAHs90V&sOiq zVvxJq#}m~yLj~@8)fztd)Q~+KYpM&OTx?ueyiG$QF+XmQUkR}q6MrF^iWJZqpw%Jb ziNxnUuYl+vASjry?i04x=ExhZ$sSHCaD|%u1^dFHGE-Q?H5g-Ij#}~=6py&twWHv^ z=U>;!2057WM&roSFZ$oe3Q12-Z`{Tg!eOLqEX2^Z_O9WP?9rNg*Ilg`$x&m)zhl)a zspPj;Lgh_c;wEl}V_eM#3O?smh77-YYA6`1Rd6pSC++01XMr+T%nSQbk7<8f?IRM2 zgypv?&eLR9LhA>ga*Z$zqFcOFuf`sZd(#OkzP;^gd!#6{mA?Q*$TUb~$ z4mi7f;II$n(f**w5>{yIrCFz#4wtSYmyYpU*x1177v6#QmXNf47SC^Ri8-u6bEA-> zh785Cr?z(%^|&k5;7*~zlTM6bOVkZ%2n?*lyE`s4w6wHZR9$OgFQoqJFBP|B_&!< zZjF7sAE}U*o?{5BLLNR9ijRo6pc^4z3dMhSumE!Dp;FuIni^w>je(&b^Rg}YagaXn zT}W*Vzu7fc4CZ^coS#D4*4CE%g_L^rq#GQ5-1d8a4`*pAWNG3GL*i2#8Js@fSA~clDlhZ-zJt_E znXUfcPJuLaG*;G74vY9?U*ApBqxuk~o*{wvJX^Q|Y==5n_nRcN+?ROE81iG!U@q`~ z;q`3wvD8an#oDsp;Dv)zAc+89e^_wSisMB}8y)$J?%)0`X1aMA6(xqmmh^jEks9pb z>R^h0l&%&xuS$1j5`tadPXzmNUZg;d{^I=MBd9pt-xnVOBX64t2Rjccq^JAwZO444 z&!myEmghYA3viF)&ZwVWke8r7@tX{mI+e$fzjz9(U^?)q|K3%MT#Z>w`r#*!!KvSO z%swYf9YXCs`F-&;K2ISHYcm*OJLqKSrum&CWHOvEc=XxrqlXXSbPs>heGZqwKM6Bs z3?eH)q0S)&4gVPb-X$IKcYv-QF&1d6F+qllLjAmf7#s@q>+gRO#{2Jo5=P?hXyO0g zA3qt_7%Q$aP+g^>FX)z4;iXz`pw?lbN~CYmE3rz@&W&NMU= z6CXV%{cL;f{VME-Os3oHdk)r~lyT6WQvUeFJj`opKbk2kt;C3NZ+1#!h!**zFVFZ~ zq@>?&S;}EUIk_;dN{c5EaeRsq0^S2lONaK>DE(4i)qN{c5iwMSFF}o{`E=xCKVO|t zsu6SN$)YwM;zSo-*AP1BsDoh{O_7d}o%Q@FN*CTlRpPbzfY|RN|2nccCho%T4P|FJ zKX2q?YCknoVoe=F?t<;^=*SVUre5ejWe*h968%N0`3)jn_cvpE!e?nTbAXeTZLW@& zS6HucfkAFADSV>ZY5CmzvWg;B!fS`*xo&KvrlV666KkSZT`3)zZ=CmtH-puWg!kNJ zeWyIt-P@a_$Stm8FI?l?*>)A(@JLxjyj)3K+_7$gMu12z>(r2RxyRipO zVW8{75JxcbEAFznxu>9`E~~ZXegcKGr)iTB{2iU?Mz5WnuI(=~j2&Jh&dFT5Me4wHO>rwopW)t|+ zHt7P96lB=@v)@exZQMZ`R&Lu};Nv4bzd+a7n_Gq7nttu_`Nm&r*lJRXIaP?cEd6MO zWS-CPv&I?4@QICOm03ASPxOX9Gr*AxYoc1j}lQ#B!xD=bX_=-YO z(RB@E{WlLPO7x1%3R1_DR%cW4uf?}A`bkN95->B?b%9rJ+tzP9f7n2g!uhn2deKV`5)KQx;*yQLtALGmzwuS zKK2@V=8gE&vU3{rX?yIK&$!BCwc~{35_h`=!e?U5zpgi^7;4Zk?@n(4q3Gq2EKvlMgjr!UR9NN+`Lmagw?O#D>~5 z{w^bp!k#}O^_kIpX5B$M<%pa8+7n1tCA42u^X5shDZShlhHJqkPZkbo?A)WV-(*n zI^dh$swc-N2J5L@JWbZ!cd_TwExj}>-?VVBfO#tg21Cl$bXw1~m&nHBKV0Cn>iSVv zv|d`4$Y(`=1;+HasOh_V}($A(TJtkQce>1~=Egz5KM zOyrkYccpVty)NaAep+fr>;VVDrrvpNKJT+!@f=ATP@i-yq>}A=n~xEP996N!VB*ku z6gUywUuc@2;A!Q)H&l@)Y7B$O%wogs?-zGwRT>cJs6P1n7ltRs#-`NA+v5c2d(va~ ze@b!QYZsh$#9+qJHLlXqG6X}vCwbLoX?Xm0iF5sJ;*f`YfGj!uAsL^0HM@1zp36I2 z(d*X8#zc)k{M#S$ejpPW5d01}V_JIB-k64Mzl!tSw#*ooi zUvvsxf`@eJgjK_jXg$13X#`h1CwgG8C!dVrmk=6flL#Y0jV+2HXCjw6ZGVr4l#(hEjUsMH)(Js` zDg4#^9K_~TJN{aYX0M^ytp-BIl3_rJ7hznj{<;yb#&Y@Gmqyyc)>az)JZ^2hTVrtY z=8~i7uOo*PLCxM#Y(Qrg<8N2F@}*G%6C%DnpGmkHnzX;(HiEl#U#dbz9y>4?3qmfb z;EDNtdz(xf315-`2dU~{B~Cr7GQs`fg5z>_euxExuXEL0$TA+pIAosu<9gM>Xcd4x zB&)S)F4D$Vt?L6;cEMS>xwj#LWSTaK1apuV?gvhR{x(9;ZYb{=S(pNgvz29*hMZhc z-bbewdV1;hmir!S`s?`f9^I{tg8%F!=6-0o>GX?={Ezmy;F6`ChlOG>sC3DmNS&u>HvSMN5}4Dk6i7H6w96 zNN4AF-#-sg$vf{d^5Xr*|F?3hCwik}9tqHJ$Iruax!zG(E*2T(SPqo+-2e@4t<5y? zya{8lcTbq9zLg>;h^iZTk zdQcfasUjePNQ@9lfS^E#geJp5nh*&INQXfPMWiGFNg%m9I_J(`aMwC(ox4_kNV1ZA z`F45t`#k%3pRI7?%|(!3{~`3FQe3JECR5tb;MDJJ^YZ1(v%1Z53ps1y&VVPD=2i6n z8~i_NFYfmzyFyG zC-N%z{_#qk>Zx=EaE4&^|AisX?fvi~xa((K)pyY1es4@Zz^ z;KGOkS{Z?04?+(h4F4UQln(4K#bAuU-z#7Io@e+2zTRZLg8lf7{}3E2{|0Cz$^w1> zwwn(HN%Y3DfFDKSH*Y^j@&q&g_`d?!yADNU(jqd)h0S)go%7W$K;}#0Hx7Xd-aV-n zuMKGX^mWvEX7`C!z^Tt%p6@8LgzNJ{I<-`r0{SOfyAl$;o;kAK>`{hmb{)343Mfxjr4IjPee)(?7O&Y$ZK-g;VP`HytS1@OWBz&R zX5N~!y({|MnDJThXbhyp4!^_eC!2CCEG#tpG6|6gDZx8D-yi7y#aOc8_30f=-TVq( z_IKZrqGLsiERbq`WPWXyQ|4KehRoNdGI&i5tIXRdljHkk0AXPtb(cRs+$Q9RP-}}O{K&2YG&-^8~ zQ+i~5gV3WOM*7^8(#~we7F!qi?|3H|5a+jORPKD?NYs$ax?dE9UbWK?DSH!$3Qc$j zZax%?V|C;h@6=c76?rV5A15N4=TsBrIzGZ5&o@ByxPrCb(Ok}jDxb-lt`;$KPi6f9 z?{ptRRkxxMgI(;+g`{;nWr{*LYmn@fZ+0sh&FDW`95IZ7u7@jIjDxtnN3z1&{=qKcz(OFeRf|KJ6L-Se_$>!TN%drrlb)1Qqn;vCjD@h?ZObD-7Jet_-gieq{sraBD z%CrQ}olZndp%ZJjC!(^)-x@}>tcynA%I_K{Dzb)RspTtCs9>AZUL0Q5QHi3IdTO?iS1AoQyZPH5$(G+w+pcK1$#LEh$2Y-KAjr=65e@9c6v zWm-Ss8n3NQiEbB_3|}`jeR@Q&JIG~k-V6ME4T_o))@WGZ51%S4sRgEtvtQ`GO^eW8 z?!V3+&b?qC->kO`To#0M=pXOC-=A3CkbdZ{Gl8{`<7KJ8?_nF-<8IqNh3{Xz)EM1z zP$41P0{e3^V219A>%iZd9BRSQL0jyk>*IFoZ=-M1@(XSCSs6smXzaj)M2KA|uy$_c zZlgxl3pQmY2dt@H4*vS4R_ZUPJRj2|#v8Q_z_gj!DuRTeVJ4sqweVXb-8^Pi&aI#4 zr+Q6M3z=1p*DD>ZaysP`{@Z#>;QSzWBpRka9&8dztTVJ|oT!RWI2iMVYz~Z(IQh*i zifhwwj^(MFi+{#nXZu@f^XNEkqpmS&_Mw$dC8O=sTs&bXMR@dP}-D-lfkx|)WMB9dM%}zL4m#-hC9$1w`2UbmN zTX0SJkPK;scgyPWbA7hA2hQM~BQPl@mkWG+=Y%w5=yNZir!&{(uZ8Gs-!hsb4Q+tN z!?O#bD7BucV$rODb+eFACue)}x1~EGx<|7e2b0TgQK3S5 z?22GMVVTi!-R;i=i>Q_jHKrcpNn_#W1A#rY-$PK=MK#tJxZhT4**$J{GmF&4MyB0f zU`+zNsBO4aNQ{OaU7{To>zcgs&hUz+JV~{qNhIDtEoKgH-lB7q_15{xsWtMo>P*vK z;B*>MtVNWZ*YtnRwU5Ox>im5p*`pp5YMIZtcKudk-o%Ew1OnmP%&_vfxBT>A^7Tml zpEkA}4w6?ENu(7-F<47gOK0`BOlO&p?I}LiYNCDxkeL-QoD)urM^F2il2tW(e*SG@K`2A*%8KGb@`;$H=I9qUv+BcC2;yXTy|WbL$Z20ri&EmS~MbeFA!N z9N7?gJkq3oH=jE#_-WC_Ysm?9ewOc=T>3*u*#;-@z?FI*Dk>n{=FDMo#nAv5sZB(# zArNIXN+@5+Fs1-<$8>sizAn5V#oOjOe6UmDu#J>BESm0VMAEhI_vrc1s8o(IvXd_k zwa?*?i-XS6!J}J5P-c9*atv)4d}Xj-3q&fMxq`iG*$$YA_M!UWb{%~y))9{HUaLEFJ_2P zDZPp>fwAS!`QaJpc(dU42yG6e{$S)Q?vYp>fBN+V%Z>u zJ*3O(``{Ymb*IWxBY}|{rilIheZ0S=DS0vex?|HD)2Fq|7ab>KZ?#O!_sowCBlsPQ zuXZplMOojVeUua~n0>$btiEkPh1UD1^t>cY*=s12=OZAlj$X{UB4oR3cYo;ws|K~u zzS(S_`z^pBUOkWjF)gn!G5p2z0b3_-(I2^IG}yMm9=I*)j@!9q9ujA*?B z)3I!gSrMsEeNijah_DISwsTqGOxuWr^Q`1L8i>eQ6U{C)zy~8vsYRaPtae_UvdvwE z91aMyuWN83-z}B%R1Us&+M&0%njRtX4D&uk0@^+ke9X8#-1!1$DK=X)*=LSw4_~0^ zl}v(>Dc>WxsV6mxi`=oT98e-9At@O`%`b0T#y|Ll3A|5yT^sCyQetbWiYsj#4p{qk-Oo7baz;4}1bPeNbT`5Q~ARK;|(2!c=P<&*0}&Syh!q zWo2dd9kUu%>pfB?XH$;vv?-Wk=@Dj{Hx~so6fNJYG8jkWSl>dLSQ7$lsvU&fXXvo3 zokhh)2#rwGii83`Fuw_SE^>s}3>K&M`1b0SZ=m49Tvb!>SVY`2%dLoeGpqG=8^z4D zkUZ*(&O`H{6U{FzgIO7oQqjTd0y>AYVoL}ulQPZND?mZcq$ULppCnbgtEqMh#(()- zcQrS~6Zn6vf*nr~d5=xJv+S=AQDd`~5c3NqyosH2HQ3K-4d_9aM&KSfSFL1<;vwwk zj!F$?m}sPp)7AKgNpW$D@3uVapS~6l>lEDMe&rs zTPcgrlb=dJNaoHqZT(8K&4o1S2H2;mKxCm2NL66Qi6;e)_;UF4UOk|p za$KMbjY>$%exqcYM;){ExQ{TCq|4^vklBN;d?B_LEjr1pw>l5!wA1*zimGE`M(CA+ zKHp4A>CX1|%2Yj%Ix05V#D_bt*}G9cmgB4&xjNCzFD@%wDESRo< z4a?ABj~r0Pa{SZO)GHQ?#n@Si<(Z^JP-DG#s~nxK%OcM-FxL_Z3uj-5VDXBjFO>4s z=GM53P=X$_O@l$N+|fR#{93)?d=cDEn6Hb=wRd67)v!asvN*q>u}`(;giMc=u%AfN z8@Di>YQrsZCr#HpIA+MnQy8`MSTTlK*2Ll-AGT!ffR3CBFCoB^mb!za{986%F=5N( zq?R40%Bbxi1t4?J)(?j@G_R#jBYfi@61iI_M4vywhZ!e=6;GFI_DJqykG5nlX?AaJ z!o8R5B+yS-Zjq)KKRX<)EUVXdGft$ti-zb2FhYPc4ar(w=*I;jLqexhGSqHeXkpo^ zK)$Am=#^5^jxBPgMLcNqku3{u(P_eX zv6}vOz^twbFB7@Q2=cEhZHkABn_)>LHm_p=5FE8TaeQd1yb8&M>t%XlbD zj@6n1MD%528G0r&sfC3FBjd5Xo2_h4c}l7IJ#qo7^k{j>2@T$wZ7w=p+gUQ}s@b*gm%6S^*;I&WZvbKFHX4=~>?=w+d8A z56Qp(Y?bRd<&iLxO6H~U2)Y%Xn#iE#kOp4YmAa0o08od>#^xw3o2Eph5)^y}OR5}R z-S|w-9Nia+^okpK@rUgs55itiX zA-`Vzm|OkYQbJnV>E4;bKhTEI4>RDk5$&Vpn=;dYw=yJzM|>M-)b0&NXRSO{!Bt-6 z0IazDT093Cfs>Oy0DFfqns%r;{HXm@+mp;5+1S-r{JVE&UoSo_J>hHR}O!5iF!;QB2{f=wm^G$IXlA z;^H9oZ(}3ac~B!FBqSR)b>E=3H>s9T{@euQ<1Pru%fI*nYF%-FJG8*Qo$^+>1okB4 z`sm8&60B$=R&1 zU}+YqC+RX!nT;7-x~CoU<@vz?#j{>qzk7uRdUUo&7D!KeaSm!g>HqYjT7gBc-T z=!_#-Qvuzom}olV~eF{phcqv|Ni*?kk^93{-=hw{4|nIf(r}$VJpj zHlj}9!VB9n7)&oid_pO(NTmGV98qZ{3zN|D#O|mvbVV-PT|~&#(C`lA=4hL!a5^?P zeC)*9_s=v%F*)nsEINb0F(Xiq8mj8nep2R(o-)-wlaxE7WJ{WkWmJBsV|&n*4s3J! zA(<7~F!D_3J!atxQcoW(JrI7I!FYcN->N&8H;afnWce38Rq9_9;O=s$P;elVM%3=| z8=0P&?~wi9Kc-EQkjDJ^Qu5mL%*VAWNq6(TW5jkenb?IN?3ANzJaIjTWD?V~j(KW; zlWR^hS1KsFT~>5sXO(m3&fa~jphepO3ou_UD)>s4HLQ-nnXEhMK0d#_Dy1FVU;L|u zRjVqq;j%&b1ic_LjRNSa!e>9|D=dPnAXGH1``K^QPBE7v5H?x4+`_?=XAU>Mr#zwz z!H0k=qrkCH)$%|Q z1k_%06JCEaPL4KB#W_03Zqe==i6w$ccXS<7Qr z!irJrGO(?nli&x+Fn>{2hZno|?;5bKJn;Y!iof&BSIvrljsGDbde68xtP9@wTTAqr ZyH{_b-L~=`p9$}MQzP@sID?xH{|72u)}H_X literal 0 HcmV?d00001 diff --git a/product_multi_image/images/product.png b/product_multi_image/images/product.png new file mode 100644 index 0000000000000000000000000000000000000000..2c43bedc28109547f98f9e6095af8f8af44c77ab GIT binary patch literal 87893 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 literal 0 HcmV?d00001 diff --git a/product_multi_image/images/url.png b/product_multi_image/images/url.png new file mode 100644 index 0000000000000000000000000000000000000000..00f0c3819aedc4c77fe31a14e21c12a10e189f35 GIT binary patch literal 27353 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. # -######################################################################### +# © 2009 Sharoon Thomas Open Labs Business Solutions +# © 2015 Antiun Ingeniería S.L. - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from . import product_product -from . import product_image -from . import res_company +from . import product_template diff --git a/product_multi_image/models/product_image.py b/product_multi_image/models/product_image.py deleted file mode 100644 index 55d5766fa112..000000000000 --- a/product_multi_image/models/product_image.py +++ /dev/null @@ -1,164 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# OpenERP, Odoo Source Management Solution -# Copyright (c) 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) -# Pedro M. Baeza -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## -import base64 -import urllib -import os -import logging -from openerp import models, fields, api, exceptions, _ -from openerp import tools - -_logger = logging.getLogger(__name__) - - -class ProductImage(models.Model): - _name = "product.image" - - @api.one - @api.depends('type', 'path', 'file_db_store', 'url') - def _get_image(self): - self.image = False - if self.type == 'file': - if self.path: - if os.path.exists(self.path): - try: - with open(self.path, 'rb') as f: - self.image = base64.b64encode(f.read()) - except Exception, e: - _logger.error("Can not open the image %s, error : %s", - self.path, e, exc_info=True) - else: - _logger.error("The image %s doesn't exist ", self.path) - elif self.type == 'url': - if self.url: - try: - (filename, header) = urllib.urlretrieve(self.url) - with open(filename, 'rb') as f: - self.image = base64.b64encode(f.read()) - except: - _logger.error("URL %s cannot be fetched", self.url) - elif self.type == 'db': - self.image = self.file_db_store - - @api.one - @api.depends('image') - def _get_image_sizes(self): - self.image_medium = False - self.image_small = False - if self.image: - try: - vals = tools.image_get_resized_images( - self.image, avoid_resize_medium=True) - self.image_small = vals['image_small'] - self.image_medium = vals['image_medium'] - except: - pass - - @api.multi - def _check_filestore(self): - """check if the filestore is created, and do it otherwise.""" - for product_image in self: - dir_path = os.path.dirname(product_image.path) - try: - if not os.path.exists(dir_path): - os.makedirs(dir_path) - except OSError, e: - raise exceptions.Warning( - _('The image filestore can not be created, %s') % e) - return True - - type = fields.Selection( - selection=[('url', 'URL'), ('file', 'OS file'), ('db', 'DB')], - default='db') - name = fields.Char(string='Image title', required=True) - extension = fields.Char(string='File extension') - # Trick for displaying the extension and not to change it, but allowing - # to save the real field (extension) - extension2 = fields.Char(string='File extension', related="extension", - readonly=True) - filename = fields.Char() - file_db_store = fields.Binary( - string='Image stored in database', filters='*.png,*.jpg,*.gif') - path = fields.Char(string="Image path", help="Image path") - url = fields.Char(string='Image remote URL') - image = fields.Binary( - compute="_get_image", string="File") - image_medium = fields.Binary( - compute="_get_image_sizes", string="Medium-sized image", - help="Medium-sized image. It is automatically resized as a 128 x " - "128 px 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_small = fields.Binary( - compute="_get_image_sizes", string="Small-sized image", - help="Small-sized image. It is automatically resized as a 64 x 64 px " - "image, with aspect ratio preserved. Use this field anywhere a " - "small image is required.") - comments = fields.Text(string='Comments') - product_id = fields.Many2one( - comodel_name='product.template', string='Product', required=True, - ondelete='cascade') - - def _make_pretty(self, name): - return name.replace('_', ' ').capitalize() - - @api.onchange('url') - def onchange_url(self): - if self.url: - filename = self.url.split('/')[-1] - self.name, self.extension = os.path.splitext(filename) - self.name = self._make_pretty(self.name) - - @api.onchange('path') - def onchange_path(self): - if self.path: - self.name, self.extension = os.path.splitext(os.path.basename( - self.path)) - self.name = self._make_pretty(self.name) - - @api.onchange('filename') - def onchange_filename(self): - if self.filename: - self.name, self.extension = os.path.splitext(self.filename) - self.name = self._make_pretty(self.name) - - @api.constrains('type', 'url') - def _check_url(self): - if self.type == 'url' and not self.url: - raise exceptions.ValidationError( - 'You must provide a URL for the product image.') - - @api.constrains('type', 'path') - def _check_path(self): - if self.type == 'file' and not self.path: - raise exceptions.ValidationError( - 'You must provide a file path for the product image.') - - @api.constrains('type', 'file_db_store') - def _check_store(self): - if self.type == 'db' and not self.file_db_store: - raise exceptions.ValidationError( - 'You must provide an attached file for the product image.') - - _sql_constraints = [ - ('uniq_name_product_id', 'UNIQUE(product_id, name)', - _('A product can have only one image with the same name')), - ] diff --git a/product_multi_image/models/product_product.py b/product_multi_image/models/product_product.py deleted file mode 100644 index 990e0dbff60b..000000000000 --- a/product_multi_image/models/product_product.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# OpenERP, Odoo Source Management Solution -# Copyright (c) 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) -# Pedro M. Baeza -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## -import logging -from openerp import models, fields, api, _ - -_logger = logging.getLogger(__name__) - - -class ProductProduct(models.Model): - _inherit = "product.template" - - @api.one - @api.depends('image_ids') - def _get_main_image(self): - self.product_image = False - self.image_medium = False - self.image_small = False - if self.image_ids: - self.product_image = self.image_ids[0].image - self.image_medium = self.image_ids[0].image_medium - self.image_small = self.image_ids[0].image_small - - def _set_image(self, image): - if self.image: - if self.image_ids: - self.image_ids[0].write({'type': 'db', - 'file_db_store': image}) - else: - self.image_ids = [(0, 0, {'type': 'db', - 'file_db_store': image, - 'name': _('Main image')})] - elif self.image_ids: - self.image_ids[0].unlink() - - @api.one - def _set_main_image(self): - self._set_image(self.product_image) - - @api.one - def _set_main_image_medium(self): - self._set_image(self.image_medium) - - @api.one - def _set_main_image_small(self): - self._set_image(self.image_small) - - image_ids = fields.One2many( - comodel_name='product.image', inverse_name='product_id', - string='Product images', copy=True) - product_image = fields.Binary( - string="Main image", compute="_get_main_image", store=False, - inverse="_set_main_image") - image_medium = fields.Binary( - compute="_get_main_image", inverse="_set_main_image_medium", - store=False) - image_small = fields.Binary( - compute="_get_main_image", inverse="_set_main_image_small", - store=False) - - @api.multi - def write(self, vals): - if 'image_medium' in vals and 'image_ids' in vals: - # Inhibit the write of the image when images tab has been touched - del vals['image_medium'] - return super(ProductProduct, self).write(vals) diff --git a/product_multi_image/models/product_template.py b/product_multi_image/models/product_template.py new file mode 100644 index 000000000000..5bad7cd63d3c --- /dev/null +++ b/product_multi_image/models/product_template.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# © 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) +# Pedro M. Baeza +# © 2015 Antiun Ingeniería S.L. - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp.osv import orm, fields + + +class ProductTemplate(orm.Model): + """Reference core image fields to multi-image variants. + + It is needed to use v7 api here because core model fields use the ``multi`` + attribute, that has no equivalent in v8, and it needs to be disabled or + bad things will happen. + """ + _name = "product.template" + _inherit = [_name, "base_multi_image.owner"] + _columns = { + "image": fields.related( + "image_main", + type="binary", + store=False, + multi=False), + "image_medium": fields.related( + "image_main_medium", + type="binary", + store=False, + multi=False), + "image_small": fields.related( + "image_main_small", + type="binary", + store=False, + multi=False) + } diff --git a/product_multi_image/models/res_company.py b/product_multi_image/models/res_company.py deleted file mode 100644 index 3453ba5a3d0f..000000000000 --- a/product_multi_image/models/res_company.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Author Nicolas Bessi & Guewen Baconnier. Copyright Camptocamp SA -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -############################################################################## - -from openerp import models, fields, api - - -class ResCompany(models.Model): - """Override company to add images configuration""" - _inherit = "res.company" - - local_media_repository = fields.Char( - string='Images Repository Path', - help='Local directory on the Odoo server where all images are ' - 'stored.') - - @api.multi - def get_local_media_repository(self): - if self: - return self.local_media_repository - else: - return self.env.user.company_id.local_media_repository diff --git a/product_multi_image/security/ir.model.access.csv b/product_multi_image/security/ir.model.access.csv deleted file mode 100644 index c74a7a86a587..000000000000 --- a/product_multi_image/security/ir.model.access.csv +++ /dev/null @@ -1,3 +0,0 @@ -"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_product_images","access_product_images","model_product_image","base.group_user",1,0,0,0 -"access_product_images_manager","access_product_images_manager","model_product_image","base.group_sale_manager",1,1,1,1 diff --git a/product_multi_image/static/description/icon.png b/product_multi_image/static/description/icon.png index c11adb164a2ec5b2574c0d84aa478db7fbcf74e0..b37cfe46958152fd3e24a9fe24252cedc7057942 100644 GIT binary patch delta 15129 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 A4*&oF literal 14901 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 YO|$mlkxT~fz+54mik5QeEsL=K2f3bfYXATM diff --git a/product_multi_image/static/description/icon.svg b/product_multi_image/static/description/icon.svg index 8d552fcb96b4..7d0b12cd8670 100644 --- a/product_multi_image/static/description/icon.svg +++ b/product_multi_image/static/description/icon.svg @@ -1,6 +1,4 @@ - - + width="128" + version="1.1" + viewBox="0 0 128 128" + id="svg2"> Drawings Icon + id="stop3842" /> + id="stop3844" /> + id="stop3631" /> + id="stop3633" /> + y1="627.34003" + x2="355.06" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient3629" + y2="689.96997" + id="linearGradient3637" /> + style="color-interpolation-filters:sRGB" + id="filter3711"> + id="feGaussianBlur3713" /> + - + id="linearGradient4174" + xlink:href="#linearGradient3629" /> - - - + id="linearGradient4248" + xlink:href="#linearGradient3629" /> - + + + + + y1="627.34003" + x1="265.67999" + gradientTransform="matrix(0.77469246,0,0,0.77284478,74.87419,156.55306)" + gradientUnits="userSpaceOnUse" + id="linearGradient4270" + xlink:href="#linearGradient3629" /> - + transform="translate(-254.06,-602.12)" + id="layer1"> + transform="matrix(0.79659619,-0.014519,0.014519,0.79659619,-533.49855,-1718.7955)" + id="g15039"> + transform="translate(0,-1.1071)" + style="fill:#c59474;stroke-width:2" + id="g14939"> + + + style="fill:#c59474;stroke:#000000;stroke-width:2" + d="m 953.49,2985.4 -13.569,-13.569" + id="path14904" /> + style="fill:#c59474;stroke:#000000;stroke-width:2" + d="m 1037.5,2986 13.439,-13.439" + id="path14906" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + style="fill:#ffffff;stroke:#000000;stroke-width:1.43970001" + d="m 950.8,3104.3 106.27,11.066 -6.7006,3.4621 6.2371,5.8748 -6.7507,2.0472 5.2319,3.57 -6.1066,1.8393 7.6109,4.6428 -5.6003,-0.033 3.9717,3.7138 -4.5986,5.2965 5.7665,1.4255 -6.6695,4.2559 3.8018,5.3461 -5.3491,0.5432 6.8854,2.6421 -111.49,-11.609 7.2288,-3.6476 -6.1842,-3.3942 8.2378,-4.3675 -9.2074,-4.2589 7.0588,-2.0152 -4.4778,-1.8418 4.1453,-0.9434 -4.4177,-5.4104 4.733,-0.6072 -5.2246,-9.6196 8.3191,-2.159 -8.4535,-2.5304 z" + id="path15270" /> + STUFF + transform="matrix(0.35961318,-0.08031075,0.08031075,0.35961318,173.44837,490.44362)" + id="g4254"> + id="g4256"> + style="fill:url(#linearGradient4266);stroke:#000000;stroke-width:1px;filter:url(#filter3711)" + id="path4258" /> + style="fill:url(#linearGradient4268)" + id="path4260" /> + style="fill:url(#linearGradient4270);stroke:#b8b8b8;stroke-width:0.77376807" + id="path4262" /> + transform="matrix(0.36847179,0,0,0.36847179,228.25428,446.55033)" + id="g4229"> + + + + + + + + + transform="translate(-254.06,-602.12)" + id="layer4" /> diff --git a/product_multi_image/views/product_image_view.xml b/product_multi_image/views/product_image_view.xml deleted file mode 100644 index 113906c2ce69..000000000000 --- a/product_multi_image/views/product_image_view.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - product.image.form - product.image - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - - product.image.tree - product.image - - - - - - - - - - product.image.kanban - product.image - - - - - - -

- X -
- - - -
-
- - - - -
-

- -
-
-
-
-
- - - - - - - - diff --git a/product_multi_image/views/product_product_view.xml b/product_multi_image/views/product_product_view.xml index 8c9524e9ba1b..97cb073e1ac3 100644 --- a/product_multi_image/views/product_product_view.xml +++ b/product_multi_image/views/product_product_view.xml @@ -3,15 +3,20 @@ - product.product.images + Add multi images product.template - + - - + + diff --git a/product_multi_image/views/res_company_view.xml b/product_multi_image/views/res_company_view.xml deleted file mode 100644 index a5080856d390..000000000000 --- a/product_multi_image/views/res_company_view.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - res.company.form.product_multi_image - res.company - - - - - - - - - - - - From 93d10e8ee8ad26d363158a68003cd1bb740a95bb Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Fri, 11 Mar 2016 17:09:33 +0100 Subject: [PATCH 03/14] Fix bugs found in review time, improve README. --- product_multi_image/README.rst | 27 ++++++++++++++++--- product_multi_image/__init__.py | 2 +- product_multi_image/__openerp__.py | 2 +- product_multi_image/hooks.py | 6 ++--- product_multi_image/models/__init__.py | 2 +- .../{product_template.py => product.py} | 13 ++++----- 6 files changed, 37 insertions(+), 15 deletions(-) rename product_multi_image/models/{product_template.py => product.py} (77%) diff --git a/product_multi_image/README.rst b/product_multi_image/README.rst index cad298158cb5..6bf4fc8f0816 100644 --- a/product_multi_image/README.rst +++ b/product_multi_image/README.rst @@ -6,15 +6,32 @@ Multiple Images in Products =========================== -This module implements the possibility to have multiple images for a product, -that it's to say, an image gallery. +This module implements the possibility to have multiple images for a product +template, a.k.a. an image gallery. + +Installation +============ + +To install this module, you need to: + +* Install ``base_multi_image`` from + `OCA/server-tools `_. Usage ===== To use this module, you need to: -* Go to ... +#. Go to *Sales > Products > Products* and choose a product template. +#. Go to the new *Images* tab. +#. Add a new image. +#. Refresh the page. +#. The first image in the collection is the main image for the product. +#. Go to *Sales > Products > Product Variants* and choose a product variant. +#. It shares the main image and collection with its template. +#. If you change the main image from the variant, it becomes the variant's main + image but does not appear in the template. +#. If you change images from the *Images* tab, it changes in the template too. .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot @@ -25,6 +42,10 @@ Known issues / Roadmap * Provide proper migration scripts from module product_images from 7.0. * Migrate to v8 api when https://github.com/odoo/odoo/issues/10799 gets fixed. +* If you try to sort images before saving the product variant or template, you + will get an error similar to ``DataError: invalid input syntax for integer: + "one2many_v_id_62"``. This bug has not been fixed yet, but a workaround is to + save and edit again to sort images. Bug Tracker =========== diff --git a/product_multi_image/__init__.py b/product_multi_image/__init__.py index 6a3b99e1c5b1..5d63d578baea 100644 --- a/product_multi_image/__init__.py +++ b/product_multi_image/__init__.py @@ -5,4 +5,4 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import models -from .hooks import post_init_hook +from .hooks import pre_init_hook diff --git a/product_multi_image/__openerp__.py b/product_multi_image/__openerp__.py index dc19d1dae2b1..974c41e7d8b7 100644 --- a/product_multi_image/__openerp__.py +++ b/product_multi_image/__openerp__.py @@ -13,7 +13,7 @@ "license": "AGPL-3", "website": "http://www.serviciosbaeza.com", "category": "Sales Management", - "post_init_hook": "post_init_hook", + "pre_init_hook": "pre_init_hook", "depends": [ "base_multi_image", "product", diff --git a/product_multi_image/hooks.py b/product_multi_image/hooks.py index 5815ccba4849..2544d4f2732d 100644 --- a/product_multi_image/hooks.py +++ b/product_multi_image/hooks.py @@ -2,8 +2,8 @@ # © 2016 Antiun Ingeniería S.L. - Jairo Llopis # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp.addons.base_multi_image.hooks import post_init_hook_for_submodules +from openerp.addons.base_multi_image.hooks import pre_init_hook_for_submodules -def post_init_hook(cr, registry): - post_init_hook_for_submodules(cr, registry, "product.template", "image") +def pre_init_hook(cr): + pre_init_hook_for_submodules(cr, "product.template", "image") diff --git a/product_multi_image/models/__init__.py b/product_multi_image/models/__init__.py index 6c137603cbe6..e87be69eb5df 100644 --- a/product_multi_image/models/__init__.py +++ b/product_multi_image/models/__init__.py @@ -3,4 +3,4 @@ # © 2015 Antiun Ingeniería S.L. - Jairo Llopis # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from . import product_template +from . import product diff --git a/product_multi_image/models/product_template.py b/product_multi_image/models/product.py similarity index 77% rename from product_multi_image/models/product_template.py rename to product_multi_image/models/product.py index 5bad7cd63d3c..dc0b653394e3 100644 --- a/product_multi_image/models/product_template.py +++ b/product_multi_image/models/product.py @@ -4,16 +4,17 @@ # © 2015 Antiun Ingeniería S.L. - Jairo Llopis # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +"""Reference core image fields to multi-image variants. + +It is needed to use v7 api here because core model fields use the ``multi`` +attribute, that has no equivalent in v8, and it needs to be disabled or +bad things will happen. +""" + from openerp.osv import orm, fields class ProductTemplate(orm.Model): - """Reference core image fields to multi-image variants. - - It is needed to use v7 api here because core model fields use the ``multi`` - attribute, that has no equivalent in v8, and it needs to be disabled or - bad things will happen. - """ _name = "product.template" _inherit = [_name, "base_multi_image.owner"] _columns = { From 8355decc4cf64b7ddf071b691455f6360d1636b1 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Tue, 26 Apr 2016 13:00:40 +0200 Subject: [PATCH 04/14] product_multi_image: Handle images in variants --- product_multi_image/README.rst | 36 +++-- product_multi_image/__init__.py | 5 +- product_multi_image/__openerp__.py | 9 +- product_multi_image/hooks.py | 7 +- product_multi_image/i18n/es.po | 87 +++++++++++ product_multi_image/models/__init__.py | 8 +- product_multi_image/models/image.py | 22 +++ product_multi_image/models/product_product.py | 128 +++++++++++++++++ .../{product.py => product_template.py} | 17 ++- product_multi_image/tests/__init__.py | 4 + .../tests/test_product_multi_image.py | 135 ++++++++++++++++++ product_multi_image/views/image_view.xml | 49 +++++++ .../views/product_product_view.xml | 26 ---- .../views/product_template_view.xml | 31 ++++ 14 files changed, 507 insertions(+), 57 deletions(-) create mode 100644 product_multi_image/i18n/es.po create mode 100644 product_multi_image/models/image.py create mode 100644 product_multi_image/models/product_product.py rename product_multi_image/models/{product.py => product_template.py} (66%) create mode 100644 product_multi_image/tests/__init__.py create mode 100644 product_multi_image/tests/test_product_multi_image.py create mode 100644 product_multi_image/views/image_view.xml delete mode 100644 product_multi_image/views/product_product_view.xml create mode 100644 product_multi_image/views/product_template_view.xml diff --git a/product_multi_image/README.rst b/product_multi_image/README.rst index 6bf4fc8f0816..3b6e90c6019d 100644 --- a/product_multi_image/README.rst +++ b/product_multi_image/README.rst @@ -20,18 +20,28 @@ To install this module, you need to: Usage ===== -To use this module, you need to: +You can manage your images at Product template level: #. Go to *Sales > Products > Products* and choose a product template. -#. Go to the new *Images* tab. -#. Add a new image. +#. Go to the *Images* tab. +#. Add a new image or edit the existing ones. +#. You can select for which variants you want to make available the image. + Keep it empty for making visible in all. #. Refresh the page. -#. The first image in the collection is the main image for the product. +#. The first image in the collection is the main image for the product + template. + +Going to product variants form, you can manage also your images, but take +into account this behaviour: + #. Go to *Sales > Products > Product Variants* and choose a product variant. -#. It shares the main image and collection with its template. -#. If you change the main image from the variant, it becomes the variant's main - image but does not appear in the template. -#. If you change images from the *Images* tab, it changes in the template too. +#. If you add an image here, the image is actually added to the product + template, and restricted to this variant. +#. When editing an existing image, the image is changed generally for all + the variants where is enabled, not only for this variant. +#. When removing an image from this form, if the image is only in this variant, + the image is removed. Otherwise, the image gets restricted to the rest of + the variants where is available. .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot @@ -40,6 +50,15 @@ To use this module, you need to: Known issues / Roadmap ====================== +* When you change the image on the product variant, the preview image of the + *Images* tab doesn't get refreshed until you refresh the browser, or if you + go to its template, but the image has been actually saved! +* The field "Available in these variants" appears when opening the image + from the product variant. +* Add logic for handling to add images with the same name that another variant + of the same template, renaming the new image to a unique name. +* Add logic for handling to add the same image in several variants to a + already in another variant for not duplicating bytes. * Provide proper migration scripts from module product_images from 7.0. * Migrate to v8 api when https://github.com/odoo/odoo/issues/10799 gets fixed. * If you try to sort images before saving the product variant or template, you @@ -67,7 +86,6 @@ Original implementation This module is inspired in previous module *product_images* from OpenLabs and Akretion. - Contributors ------------ diff --git a/product_multi_image/__init__.py b/product_multi_image/__init__.py index 5d63d578baea..8516734f7277 100644 --- a/product_multi_image/__init__.py +++ b/product_multi_image/__init__.py @@ -1,8 +1,5 @@ # -*- coding: utf-8 -*- -# © 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) -# Pedro M. Baeza -# © 2015 Antiun Ingeniería S.L. - Jairo Llopis -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). from . import models from .hooks import pre_init_hook diff --git a/product_multi_image/__openerp__.py b/product_multi_image/__openerp__.py index 974c41e7d8b7..3e1ffc9e301a 100644 --- a/product_multi_image/__openerp__.py +++ b/product_multi_image/__openerp__.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- -# © 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) -# Pedro M. Baeza +# © 2014-2016 Pedro M. Baeza # © 2015 Antiun Ingeniería S.L. - Jairo Llopis # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { "name": "Multiple Images in Products", - "version": "8.0.1.0.0", + "version": "8.0.2.0.0", "author": "Serv. Tecnol. Avanzados - Pedro M. Baeza, " "Antiun Ingeniería, " + "Tecnativa, " "Odoo Community Association (OCA)", "license": "AGPL-3", "website": "http://www.serviciosbaeza.com", @@ -19,7 +19,8 @@ "product", ], "data": [ - 'views/product_product_view.xml', + 'views/image_view.xml', + 'views/product_template_view.xml', ], 'installable': True, "images": [ diff --git a/product_multi_image/hooks.py b/product_multi_image/hooks.py index 2544d4f2732d..976450afe76e 100644 --- a/product_multi_image/hooks.py +++ b/product_multi_image/hooks.py @@ -2,7 +2,12 @@ # © 2016 Antiun Ingeniería S.L. - Jairo Llopis # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp.addons.base_multi_image.hooks import pre_init_hook_for_submodules +try: + from openerp.addons.base_multi_image.hooks import ( + pre_init_hook_for_submodules) +except ImportError: + # Don't complain, as this will be solved as dependency when needed + pass def pre_init_hook(cr): diff --git a/product_multi_image/i18n/es.po b/product_multi_image/i18n/es.po new file mode 100644 index 000000000000..a5f9eab7d822 --- /dev/null +++ b/product_multi_image/i18n/es.po @@ -0,0 +1,87 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_multi_image +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-26 18:40+0000\n" +"PO-Revision-Date: 2016-04-26 18:40+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: product_multi_image +#: view:base_multi_image.image:product_multi_image.image_form_view +msgid "(keep empty for being visible for all variants)" +msgstr "(dejar vacío para hacerlo visible para todas las variantes)" + +#. module: product_multi_image +#: help:base_multi_image.image,product_variant_ids:0 +msgid "If you leave it empty, all variants will show this image. Selecting one or several of the available variants, you restrict the availability of the image to that variants." +msgstr "Si lo deja vacío, todas las variantes mostrarán esta imagen. Seleccionando una o más de las variantes disponibles, restringirá la disponibilidad de la imagen a esas variantes." + +#. module: product_multi_image +#: field:product.product,image_ids:0 +#: view:product.template:product_multi_image.view_product_template_form_img_inh +#: field:product.template,image_ids:0 +msgid "Images" +msgstr "Imágenes" + +#. module: product_multi_image +#: field:product.product,image_main:0 +#: field:product.template,image_main:0 +msgid "Main image" +msgstr "Imagen principal" + +#. module: product_multi_image +#: field:product.product,image_main_medium:0 +#: field:product.template,image_main_medium:0 +msgid "Medium image" +msgstr "Imagen media" + +#. module: product_multi_image +#: model:ir.model,name:product_multi_image.model_product_product +msgid "Product" +msgstr "Producto" + +#. module: product_multi_image +#: model:ir.model,name:product_multi_image.model_product_template +msgid "Product Template" +msgstr "Plantilla de producto" + +#. module: product_multi_image +#: field:base_multi_image.image,product_variant_count:0 +msgid "Product variant count" +msgstr "Nº de variantes" + +#. module: product_multi_image +#: field:product.product,image_main_small:0 +#: field:product.template,image_main_small:0 +msgid "Small image" +msgstr "Imagen pequeña" + +#. module: product_multi_image +#: view:base_multi_image.image:product_multi_image.image_kanban_view +msgid "Visible in" +msgstr "Visible en" + +#. module: product_multi_image +#: view:base_multi_image.image:product_multi_image.image_kanban_view +msgid "Visible in all variants" +msgstr "Visible en todas las variantes" + +#. module: product_multi_image +#: field:base_multi_image.image,product_variant_ids:0 +msgid "Visible in these variants" +msgstr "Visible en estas variantes" + +#. module: product_multi_image +#: view:base_multi_image.image:product_multi_image.image_kanban_view +msgid "variant(s)" +msgstr "variante(s)" + diff --git a/product_multi_image/models/__init__.py b/product_multi_image/models/__init__.py index e87be69eb5df..b04f1b699264 100644 --- a/product_multi_image/models/__init__.py +++ b/product_multi_image/models/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# © 2009 Sharoon Thomas Open Labs Business Solutions -# © 2015 Antiun Ingeniería S.L. - Jairo Llopis -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). -from . import product +from . import image +from . import product_template +from . import product_product diff --git a/product_multi_image/models/image.py b/product_multi_image/models/image.py new file mode 100644 index 000000000000..ea81701dc315 --- /dev/null +++ b/product_multi_image/models/image.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# © 2016 Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). + +from openerp import api, fields, models + + +class Image(models.Model): + _inherit = "base_multi_image.image" + + product_variant_ids = fields.Many2many( + comodel_name="product.product", string="Visible in these variants", + help="If you leave it empty, all variants will show this image. " + "Selecting one or several of the available variants, you " + "restrict the availability of the image to those variants.") + product_variant_count = fields.Integer( + compute="_compute_product_variant_count") + + @api.multi + def _compute_product_variant_count(self): + for image in self: + image.product_variant_count = len(image.product_variant_ids) diff --git a/product_multi_image/models/product_product.py b/product_multi_image/models/product_product.py new file mode 100644 index 000000000000..f230661ce439 --- /dev/null +++ b/product_multi_image/models/product_product.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +# © 2016 Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). + +from openerp import api, fields, models +from openerp.osv import orm +from openerp.osv import fields as old_fields + + +class ProductProduct(models.Model): + _name = "product.product" + _inherit = [_name, "base_multi_image.owner"] + + # Make this field computed for getting only the available images + image_ids = fields.One2many( + compute="_compute_image_ids", comodel_name="base_multi_image.image", + inverse="_inverse_image_ids") + image_main = fields.Binary(inverse="_inverse_main_image_large") + image_main_medium = fields.Binary(inverse="_inverse_main_image_medium") + image_main_small = fields.Binary(inverse="_inverse_main_image_small") + + @api.multi + def _inverse_main_image(self, image): + for product in self: + if image: + product.image_ids[0].write({ + 'file_db_store': image, + 'storage': 'db', + }) + else: + product.image_ids = [(3, product.image_ids[0].id)] + + @api.multi + def _inverse_main_image_large(self): + for product in self: + product._inverse_main_image(product.image_main) + + @api.multi + def _inverse_main_image_medium(self): + for product in self: + product._inverse_main_image(product.image_main_medium) + + @api.multi + def _inverse_main_image_small(self): + for product in self: + product._inverse_main_image(product.image_main_small) + + @api.multi + @api.depends('product_tmpl_id', 'product_tmpl_id.image_ids', + 'product_tmpl_id.image_ids.product_variant_ids') + def _compute_image_ids(self): + for product in self: + images = product.product_tmpl_id.image_ids.filtered( + lambda x: (not x.product_variant_ids or + product.id in x.product_variant_ids.ids)) + product.image_ids = [(6, 0, images.ids)] + + @api.multi + def _inverse_image_ids(self): + for product in self: + # Remember the list of images that were before changes + previous_images = product.product_tmpl_id.image_ids.filtered( + lambda x: (not x.product_variant_ids or + product.id in x.product_variant_ids.ids)) + for image in product.image_ids: + if isinstance(image.id, models.NewId): + # Image added + image.owner_id = product.product_tmpl_id.id + image.owner_model = "product.template" + image.product_variant_ids = [(6, 0, product.ids)] + image.create(image._convert_to_write(image._cache)) + else: + previous_images -= image + # Update existing records + image.write(image._convert_to_write(image._cache)) + for image in previous_images: + # Images removed + if not image.product_variant_ids: + variants = product.product_tmpl_id.product_variant_ids + else: + variants = image.product_variant_ids + variants -= product + if not variants: + # Remove the image, as there's no variant that contains it + image.unlink() + else: + # Leave the images for the rest of the variants + image.product_variant_ids = variants.ids + + @api.multi + @api.depends('image_ids', 'product_tmpl_id.image_ids', + 'product_tmpl_id.image_ids.product_variant_ids') + def _get_multi_image(self): + """Needed for changing dependencies in this class.""" + super(ProductProduct, self)._get_multi_image() + + @api.multi + def unlink(self): + obj = self.with_context(bypass_image_removal=True) + # Remove images that are linked only to the product variant + for product in self: + images2remove = product.image_ids.filtered( + lambda image: (product in image.product_variant_ids and + len(image.product_variant_ids) == 1)) + images2remove.unlink() + return super(ProductProduct, obj).unlink() + + +class ProductProductOld(orm.Model): + """It is needed to use v7 api here because core model fields use the + ``multi`` attribute, that has no equivalent in v8, and it needs to be + disabled or bad things will happen. For more reference, see + https://github.com/odoo/odoo/issues/10799 + + Needed for getting the correct data in the inheritance chain. Probably + in v10 this won't be needed as the inheritance has been globally + redesigned. + """ + _name = "product.product" + _inherit = [_name, "base_multi_image.owner"] + _columns = { + "image": old_fields.related( + "image_main", type="binary", store=False, multi=False), + "image_medium": old_fields.related( + "image_main_medium", type="binary", store=False, multi=False), + "image_small": old_fields.related( + "image_main_small", type="binary", store=False, multi=False) + } diff --git a/product_multi_image/models/product.py b/product_multi_image/models/product_template.py similarity index 66% rename from product_multi_image/models/product.py rename to product_multi_image/models/product_template.py index dc0b653394e3..2bfeb104ce2e 100644 --- a/product_multi_image/models/product.py +++ b/product_multi_image/models/product_template.py @@ -1,20 +1,19 @@ # -*- coding: utf-8 -*- -# © 2014 Serv. Tecnol. Avanzados (http://www.serviciosbaeza.com) -# Pedro M. Baeza +# © 2014-2016 Pedro M. Baeza # © 2015 Antiun Ingeniería S.L. - Jairo Llopis # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -"""Reference core image fields to multi-image variants. - -It is needed to use v7 api here because core model fields use the ``multi`` -attribute, that has no equivalent in v8, and it needs to be disabled or -bad things will happen. -""" - from openerp.osv import orm, fields class ProductTemplate(orm.Model): + """Reference core image fields to multi-image variants. + + It is needed to use v7 api here because core model fields use the ``multi`` + attribute, that has no equivalent in v8, and it needs to be disabled or + bad things will happen. For more reference, see + https://github.com/odoo/odoo/issues/10799 + """ _name = "product.template" _inherit = [_name, "base_multi_image.owner"] _columns = { diff --git a/product_multi_image/tests/__init__.py b/product_multi_image/tests/__init__.py new file mode 100644 index 000000000000..1cb2279beb42 --- /dev/null +++ b/product_multi_image/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). + +from . import test_product_multi_image diff --git a/product_multi_image/tests/test_product_multi_image.py b/product_multi_image/tests/test_product_multi_image.py new file mode 100644 index 000000000000..e57f8a0e8e87 --- /dev/null +++ b/product_multi_image/tests/test_product_multi_image.py @@ -0,0 +1,135 @@ +# -*- coding: utf-8 -*- +# © 2016 Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). + +from openerp.tests import common + + +class TestProductMultiImage(common.TransactionCase): + def setUp(self): + super(TestProductMultiImage, self).setUp() + self.transparent_image = ( # 1x1 Transparent GIF + "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7") + self.grey_image = ( # 1x1 Grey GIF + 'R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw ==') + self.black_image = ( # 1x1 Black GIF + "R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=") + self.attribute = self.env['product.attribute'].create({ + 'name': 'Test attribute', + }) + self.value_1 = self.env['product.attribute.value'].create({ + 'name': "Test value 1", + 'attribute_id': self.attribute.id, + }) + self.value_2 = self.env['product.attribute.value'].create({ + 'name': "Test value 2", + 'attribute_id': self.attribute.id, + }) + self.product_template = self.env['product.template'].create({ + 'name': "Test product", + 'attribute_line_ids': [ + (0, 0, { + 'attribute_id': self.attribute.id, + 'value_ids': [(6, 0, (self.value_1 + self.value_2).ids)], + })], + 'image_ids': [(0, 0, { + 'storage': 'db', + 'name': 'Image 1', + 'file_db_store': self.transparent_image, + 'owner_model': 'product.template', + }), (0, 0, { + 'storage': 'db', + 'name': 'Image 2', + 'file_db_store': self.black_image, + 'owner_model': 'product.template', + })], + }) + self.product_1 = self.product_template.product_variant_ids[0] + self.product_2 = self.product_template.product_variant_ids[1] + + def test_all_images(self): + self.assertEqual(len(self.product_template.image_ids), 2) + self.assertEqual(len(self.product_1.image_ids), 2) + self.assertEqual(len(self.product_2.image_ids), 2) + + def test_restrict_one_image(self): + self.product_template.image_ids[0].product_variant_ids = [ + (6, 0, self.product_1.ids)] + self.assertEqual(len(self.product_1.image_ids), 2) + self.assertEqual(len(self.product_2.image_ids), 1) + self.assertEqual(self.product_1.image, self.transparent_image) + self.assertEqual(self.product_2.image, self.black_image) + + def test_add_image_variant(self): + self.product_1.image_ids = [ + (0, 0, {'storage': 'db', + 'file_db_store': self.grey_image})] + self.product_template.refresh() + self.assertEqual(len(self.product_template.image_ids), 3) + self.assertEqual( + self.product_template.image_ids[-1].product_variant_ids, + self.product_1) + + def test_remove_image_variant(self): + self.product_1.image_ids = [(3, self.product_1.image_ids[0].id)] + self.product_template.refresh() + self.assertEqual(len(self.product_template.image_ids), 2) + self.assertEqual( + self.product_template.image_ids[0].product_variant_ids, + self.product_2) + + def test_remove_image_all_variants(self): + self.product_1.image_ids = [(3, self.product_1.image_ids[0].id)] + self.product_2.image_ids = [(3, self.product_2.image_ids[0].id)] + self.product_template.refresh() + self.assertEqual(len(self.product_template.image_ids), 1) + + def test_edit_image_variant(self): + text = 'Test name changed' + self.product_1.image_ids[0].name = text + self.product_template.refresh() + self.assertEqual(self.product_template.image_ids[0].name, text) + + def test_edit_main_image(self): + self.product_1.image = self.grey_image + self.assertEqual( + self.product_1.image_ids[0].image_main, self.grey_image) + self.assertEqual( + self.product_template.image_ids[0].image_main, self.grey_image) + + def test_remove_main_image(self): + self.product_1.image = False + self.assertEqual(len(self.product_1.image_ids), 1) + self.assertEqual( + self.product_template.image_ids[0].product_variant_ids, + self.product_2) + + def test_create_variant_afterwards(self): + """Create a template, assign an image, and then create the variant. + Check that the images are not lost. + """ + template = self.env['product.template'].create({ + 'name': 'Test 2', + 'image_ids': [(0, 0, { + 'storage': 'db', + 'name': 'Image 1', + 'file_db_store': self.transparent_image, + 'owner_model': 'product.template', + })], + }) + self.assertEqual(len(template.image_ids), 1) + template.write({ + 'attribute_line_ids': [ + (0, 0, { + 'attribute_id': self.attribute.id, + 'value_ids': [(6, 0, (self.value_1 + self.value_2).ids)], + })], + }) + self.assertEqual(len(template.image_ids), 1) + self.assertEqual(len(template.product_variant_ids[0].image_ids), 1) + + def test_remove_variant_with_image(self): + self.product_template.image_ids[0].product_variant_ids = [ + (6, 0, self.product_1.ids)] + self.product_1.unlink() + self.assertEqual(len(self.product_template.image_ids), 1) diff --git a/product_multi_image/views/image_view.xml b/product_multi_image/views/image_view.xml new file mode 100644 index 000000000000..e2f9b0bcc477 --- /dev/null +++ b/product_multi_image/views/image_view.xml @@ -0,0 +1,49 @@ + + + + + + + Multi image form + base_multi_image.image + + primary + + + + + + + + + Product multi image kanban + base_multi_image.image + + primary + + + + + + + + + + Visible in all variants + + + Visible in variant(s) + + + + + + + + + diff --git a/product_multi_image/views/product_product_view.xml b/product_multi_image/views/product_product_view.xml deleted file mode 100644 index 97cb073e1ac3..000000000000 --- a/product_multi_image/views/product_product_view.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Add multi images - product.template - - - - - - - - - - - - diff --git a/product_multi_image/views/product_template_view.xml b/product_multi_image/views/product_template_view.xml new file mode 100644 index 000000000000..ef1152f689e3 --- /dev/null +++ b/product_multi_image/views/product_template_view.xml @@ -0,0 +1,31 @@ + + + + + + + Add multi images + product.template + + + + + + + + + + + + From 64ea2ddc046b0109636d94fc66be4dd7d66e432f Mon Sep 17 00:00:00 2001 From: Dave Lasley Date: Fri, 4 Nov 2016 13:07:27 -0700 Subject: [PATCH 05/14] [MIG] product_multi_image: Upgrade to v9 * Upgrade product_multi_image to v9 * Add server-tools to oca_dependencies --- product_multi_image/README.rst | 9 +++------ product_multi_image/__openerp__.py | 8 ++++---- product_multi_image/i18n/es.po | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/product_multi_image/README.rst b/product_multi_image/README.rst index 3b6e90c6019d..0c1ece6a6c5f 100644 --- a/product_multi_image/README.rst +++ b/product_multi_image/README.rst @@ -45,7 +45,7 @@ into account this behaviour: .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/135/8.0 + :target: https://runbot.odoo-community.org/runbot/135/9.0 Known issues / Roadmap ====================== @@ -72,11 +72,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, -help us smashing it by providing a detailed and welcomed `feedback -`_. +help us smashing it by providing a detailed and welcomed feedback. Credits ======= @@ -92,6 +88,7 @@ Contributors * Pedro M. Baeza * Rafael Blasco * Jairo Llopis +* Dave Lasley Maintainer ---------- diff --git a/product_multi_image/__openerp__.py b/product_multi_image/__openerp__.py index 3e1ffc9e301a..39590a2c2c38 100644 --- a/product_multi_image/__openerp__.py +++ b/product_multi_image/__openerp__.py @@ -5,13 +5,13 @@ { "name": "Multiple Images in Products", - "version": "8.0.2.0.0", - "author": "Serv. Tecnol. Avanzados - Pedro M. Baeza, " - "Antiun Ingeniería, " + "version": "9.0.1.0.0", + "author": "Antiun Ingeniería, " "Tecnativa, " + "LasLabs, " "Odoo Community Association (OCA)", "license": "AGPL-3", - "website": "http://www.serviciosbaeza.com", + "website": "https://www.tecnativa.com", "category": "Sales Management", "pre_init_hook": "pre_init_hook", "depends": [ diff --git a/product_multi_image/i18n/es.po b/product_multi_image/i18n/es.po index a5f9eab7d822..b1dc6691f3ce 100644 --- a/product_multi_image/i18n/es.po +++ b/product_multi_image/i18n/es.po @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 8.0\n" +"Project-Id-Version: Odoo Server 9.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-26 18:40+0000\n" "PO-Revision-Date: 2016-04-26 18:40+0000\n" From 8fd189647952a323b75d0765d067366879e66746 Mon Sep 17 00:00:00 2001 From: Dave Lasley Date: Fri, 4 Nov 2016 13:48:38 -0700 Subject: [PATCH 06/14] [MIG] product_multi_image: Upgrade to v10 * Migrate product_multi_image to v10 * Remove old api from `product.product` * Add test coverage for hooks and variant count * Fix oca depends * Add uninstall hook --- product_multi_image/README.rst | 2 +- product_multi_image/__init__.py | 2 +- .../{__openerp__.py => __manifest__.py} | 3 +- product_multi_image/hooks.py | 12 +++- product_multi_image/i18n/es.po | 2 +- product_multi_image/i18n/sv.po | 2 +- product_multi_image/models/image.py | 2 +- product_multi_image/models/product_product.py | 45 +++++-------- .../models/product_template.py | 41 +++++------- .../tests/test_product_multi_image.py | 67 +++++++++++++++++-- product_multi_image/views/image_view.xml | 6 +- .../views/product_template_view.xml | 6 +- 12 files changed, 117 insertions(+), 73 deletions(-) rename product_multi_image/{__openerp__.py => __manifest__.py} (92%) diff --git a/product_multi_image/README.rst b/product_multi_image/README.rst index 0c1ece6a6c5f..f6c85336eb53 100644 --- a/product_multi_image/README.rst +++ b/product_multi_image/README.rst @@ -45,7 +45,7 @@ into account this behaviour: .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/135/9.0 + :target: https://runbot.odoo-community.org/runbot/135/10.0 Known issues / Roadmap ====================== diff --git a/product_multi_image/__init__.py b/product_multi_image/__init__.py index 8516734f7277..7dd26d2bd58d 100644 --- a/product_multi_image/__init__.py +++ b/product_multi_image/__init__.py @@ -2,4 +2,4 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). from . import models -from .hooks import pre_init_hook +from .hooks import pre_init_hook, uninstall_hook diff --git a/product_multi_image/__openerp__.py b/product_multi_image/__manifest__.py similarity index 92% rename from product_multi_image/__openerp__.py rename to product_multi_image/__manifest__.py index 39590a2c2c38..50467e5e39a3 100644 --- a/product_multi_image/__openerp__.py +++ b/product_multi_image/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Multiple Images in Products", - "version": "9.0.1.0.0", + "version": "10.0.1.0.0", "author": "Antiun Ingeniería, " "Tecnativa, " "LasLabs, " @@ -14,6 +14,7 @@ "website": "https://www.tecnativa.com", "category": "Sales Management", "pre_init_hook": "pre_init_hook", + "uninstall_hook": "uninstall_hook", "depends": [ "base_multi_image", "product", diff --git a/product_multi_image/hooks.py b/product_multi_image/hooks.py index 976450afe76e..9b772e4952a3 100644 --- a/product_multi_image/hooks.py +++ b/product_multi_image/hooks.py @@ -4,11 +4,19 @@ try: from openerp.addons.base_multi_image.hooks import ( - pre_init_hook_for_submodules) + pre_init_hook_for_submodules, + uninstall_hook_for_submodules, + ) except ImportError: - # Don't complain, as this will be solved as dependency when needed pass def pre_init_hook(cr): pre_init_hook_for_submodules(cr, "product.template", "image") + pre_init_hook_for_submodules(cr, "product.product", "image_variant") + + +def uninstall_hook(cr, registry): + """Remove multi images for models that no longer use them.""" + uninstall_hook_for_submodules(cr, registry, "product.template") + uninstall_hook_for_submodules(cr, registry, "product.product") diff --git a/product_multi_image/i18n/es.po b/product_multi_image/i18n/es.po index b1dc6691f3ce..d43e6c9caf56 100644 --- a/product_multi_image/i18n/es.po +++ b/product_multi_image/i18n/es.po @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 9.0\n" +"Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-26 18:40+0000\n" "PO-Revision-Date: 2016-04-26 18:40+0000\n" diff --git a/product_multi_image/i18n/sv.po b/product_multi_image/i18n/sv.po index ba538d6ff125..489a8d03c5ae 100644 --- a/product_multi_image/i18n/sv.po +++ b/product_multi_image/i18n/sv.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: OpenERP Server 5.0.14\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" +"Report-Msgid-Bugs-To: support@odoo.com\n" "POT-Creation-Date: 2010-11-22 10:19:32+0000\n" "PO-Revision-Date: 2010-11-22 10:19:32+0000\n" "Last-Translator: <>\n" diff --git a/product_multi_image/models/image.py b/product_multi_image/models/image.py index ea81701dc315..84ecb3ffe3d7 100644 --- a/product_multi_image/models/image.py +++ b/product_multi_image/models/image.py @@ -2,7 +2,7 @@ # © 2016 Pedro M. Baeza # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). -from openerp import api, fields, models +from odoo import api, fields, models class Image(models.Model): diff --git a/product_multi_image/models/product_product.py b/product_multi_image/models/product_product.py index f230661ce439..59dcae5e18d8 100644 --- a/product_multi_image/models/product_product.py +++ b/product_multi_image/models/product_product.py @@ -2,9 +2,7 @@ # © 2016 Pedro M. Baeza # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). -from openerp import api, fields, models -from openerp.osv import orm -from openerp.osv import fields as old_fields +from odoo import api, fields, models class ProductProduct(models.Model): @@ -13,12 +11,27 @@ class ProductProduct(models.Model): # Make this field computed for getting only the available images image_ids = fields.One2many( - compute="_compute_image_ids", comodel_name="base_multi_image.image", - inverse="_inverse_image_ids") + comodel_name="base_multi_image.image", + compute="_compute_image_ids", + inverse="_inverse_image_ids", + ) image_main = fields.Binary(inverse="_inverse_main_image_large") image_main_medium = fields.Binary(inverse="_inverse_main_image_medium") image_main_small = fields.Binary(inverse="_inverse_main_image_small") + image = fields.Binary( + related='image_main', + store=False, + ) + image_medium = fields.Binary( + related='image_main_medium', + store=False, + ) + image_small = fields.Binary( + related='image_main_small', + store=False, + ) + @api.multi def _inverse_main_image(self, image): for product in self: @@ -104,25 +117,3 @@ def unlink(self): len(image.product_variant_ids) == 1)) images2remove.unlink() return super(ProductProduct, obj).unlink() - - -class ProductProductOld(orm.Model): - """It is needed to use v7 api here because core model fields use the - ``multi`` attribute, that has no equivalent in v8, and it needs to be - disabled or bad things will happen. For more reference, see - https://github.com/odoo/odoo/issues/10799 - - Needed for getting the correct data in the inheritance chain. Probably - in v10 this won't be needed as the inheritance has been globally - redesigned. - """ - _name = "product.product" - _inherit = [_name, "base_multi_image.owner"] - _columns = { - "image": old_fields.related( - "image_main", type="binary", store=False, multi=False), - "image_medium": old_fields.related( - "image_main_medium", type="binary", store=False, multi=False), - "image_small": old_fields.related( - "image_main_small", type="binary", store=False, multi=False) - } diff --git a/product_multi_image/models/product_template.py b/product_multi_image/models/product_template.py index 2bfeb104ce2e..214488ba609c 100644 --- a/product_multi_image/models/product_template.py +++ b/product_multi_image/models/product_template.py @@ -3,33 +3,22 @@ # © 2015 Antiun Ingeniería S.L. - Jairo Llopis # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp.osv import orm, fields +from odoo import fields, models -class ProductTemplate(orm.Model): - """Reference core image fields to multi-image variants. - - It is needed to use v7 api here because core model fields use the ``multi`` - attribute, that has no equivalent in v8, and it needs to be disabled or - bad things will happen. For more reference, see - https://github.com/odoo/odoo/issues/10799 - """ +class ProductTemplate(models.Model): _name = "product.template" _inherit = [_name, "base_multi_image.owner"] - _columns = { - "image": fields.related( - "image_main", - type="binary", - store=False, - multi=False), - "image_medium": fields.related( - "image_main_medium", - type="binary", - store=False, - multi=False), - "image_small": fields.related( - "image_main_small", - type="binary", - store=False, - multi=False) - } + + image = fields.Binary( + related='image_main', + store=False, + ) + image_medium = fields.Binary( + related='image_main_medium', + store=False, + ) + image_small = fields.Binary( + related='image_main_small', + store=False, + ) diff --git a/product_multi_image/tests/test_product_multi_image.py b/product_multi_image/tests/test_product_multi_image.py index e57f8a0e8e87..82441d350199 100644 --- a/product_multi_image/tests/test_product_multi_image.py +++ b/product_multi_image/tests/test_product_multi_image.py @@ -1,8 +1,11 @@ # -*- coding: utf-8 -*- # © 2016 Pedro M. Baeza +# Copyright 2016 LasLabs Inc. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl-3). -from openerp.tests import common +from odoo.tests import common + +from odoo.addons.product_multi_image import hooks class TestProductMultiImage(common.TransactionCase): @@ -117,7 +120,13 @@ def test_create_variant_afterwards(self): 'owner_model': 'product.template', })], }) - self.assertEqual(len(template.image_ids), 1) + self.assertEqual( + len(template.image_ids), 1, + 'Product template did not start with singleton image_ids. ' + 'Got %s' % ( + template.image_ids, + ), + ) template.write({ 'attribute_line_ids': [ (0, 0, { @@ -125,11 +134,61 @@ def test_create_variant_afterwards(self): 'value_ids': [(6, 0, (self.value_1 + self.value_2).ids)], })], }) - self.assertEqual(len(template.image_ids), 1) - self.assertEqual(len(template.product_variant_ids[0].image_ids), 1) + self.assertEqual( + len(template.image_ids), 1, + 'Product template did not retain the singleton image_ids. ' + 'Got %s' % ( + template.image_ids, + ), + ) + for variant in template.product_variant_ids: + self.assertEqual( + len(variant.image_ids), 1, + 'Product variant did not receive the image_ids. Got %s' % ( + variant.image_ids, + ) + ) def test_remove_variant_with_image(self): self.product_template.image_ids[0].product_variant_ids = [ (6, 0, self.product_1.ids)] self.product_1.unlink() self.assertEqual(len(self.product_template.image_ids), 1) + + def test_image_product_variant_count(self): + """ It should provide a total of variants related to image """ + image = self.product_1.image_ids[0] + image.product_variant_ids = [(6, 0, self.product_1.ids)] + self.assertEqual( + image.product_variant_count, 1, + ) + + def test_pre_init_hook_product(self): + """ It should populate the ``image_ids`` on existing product """ + product = self.env.ref('product.product_product_2') + self.assertEqual( + len(product.image_ids), 1, + ) + + def test_pre_init_hook_template(self): + """ It should populate the ``image_ids`` on existing template """ + product = self.env.ref('product.product_product_2_product_template') + self.assertEqual( + len(product.image_ids), 1, + ) + + def test_uninstall_hook_product(self): + """ It should remove ``image_ids`` associated with products """ + hooks.uninstall_hook(self.env.cr, self.registry) + images = self.env['base_multi_image.image'].search( + [("owner_model", "=", 'product.product')], + ) + self.assertFalse(len(images)) + + def test_uninstall_hook_teplate(self): + """ It should remove ``image_ids`` associated with templates """ + hooks.uninstall_hook(self.env.cr, self.registry) + images = self.env['base_multi_image.image'].search( + [("owner_model", "=", 'product.template')], + ) + self.assertFalse(len(images)) diff --git a/product_multi_image/views/image_view.xml b/product_multi_image/views/image_view.xml index e2f9b0bcc477..9f6a57e3828e 100644 --- a/product_multi_image/views/image_view.xml +++ b/product_multi_image/views/image_view.xml @@ -1,8 +1,7 @@ - - + Multi image form @@ -45,5 +44,4 @@ - - + diff --git a/product_multi_image/views/product_template_view.xml b/product_multi_image/views/product_template_view.xml index ef1152f689e3..ed9d150aa9d5 100644 --- a/product_multi_image/views/product_template_view.xml +++ b/product_multi_image/views/product_template_view.xml @@ -2,8 +2,7 @@ - - + Add multi images @@ -27,5 +26,4 @@ - - + From b071051d5d7f7ee25737028fff6890a36c6d96a6 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Wed, 8 Feb 2017 12:19:12 +0100 Subject: [PATCH 07/14] [fix] prod image update broken w/ no image on template #228 --- product_multi_image/models/product_product.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/product_multi_image/models/product_product.py b/product_multi_image/models/product_product.py index 59dcae5e18d8..869c4fed181d 100644 --- a/product_multi_image/models/product_product.py +++ b/product_multi_image/models/product_product.py @@ -35,13 +35,19 @@ class ProductProduct(models.Model): @api.multi def _inverse_main_image(self, image): for product in self: + has_images = bool(product.image_ids) if image: - product.image_ids[0].write({ + write_vals = { 'file_db_store': image, 'storage': 'db', - }) + } + if has_images: + product.image_ids[0].write(write_vals) + else: + product.image_ids = [(0, False, write_vals)] else: - product.image_ids = [(3, product.image_ids[0].id)] + if has_images: + product.image_ids = [(3, product.image_ids[0].id)] @api.multi def _inverse_main_image_large(self): From 1fd7fb9b3d56e63190315918d1d6c44e2ecd397c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Fern=C3=A1ndez=20=40PlanetaTIC?= Date: Wed, 13 Jun 2018 17:36:09 +0200 Subject: [PATCH 08/14] [IMP] product_multi_image: Improve uninstall hook to move images from multi to single mode --- product_multi_image/hooks.py | 4 +++- product_multi_image/tests/test_product_multi_image.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/product_multi_image/hooks.py b/product_multi_image/hooks.py index 9b772e4952a3..689fa6f701a4 100644 --- a/product_multi_image/hooks.py +++ b/product_multi_image/hooks.py @@ -18,5 +18,7 @@ def pre_init_hook(cr): def uninstall_hook(cr, registry): """Remove multi images for models that no longer use them.""" - uninstall_hook_for_submodules(cr, registry, "product.template") + uninstall_hook_for_submodules(cr, registry, "product.template", + field="image", field_medium="image_medium", + field_small="image_small") uninstall_hook_for_submodules(cr, registry, "product.product") diff --git a/product_multi_image/tests/test_product_multi_image.py b/product_multi_image/tests/test_product_multi_image.py index 82441d350199..69e16ef10788 100644 --- a/product_multi_image/tests/test_product_multi_image.py +++ b/product_multi_image/tests/test_product_multi_image.py @@ -5,7 +5,7 @@ from odoo.tests import common -from odoo.addons.product_multi_image import hooks +from .. import hooks class TestProductMultiImage(common.TransactionCase): From cab5a0224fce8dd84c1f8c1b6e42ada0a8ab57ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Fern=C3=A1ndez=20=40PlanetaTIC?= Date: Thu, 5 Jul 2018 13:15:33 +0200 Subject: [PATCH 09/14] [FIX] product_multi_image: Do not resize large image to small/medium when saved from single image --- .../models/product_template.py | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/product_multi_image/models/product_template.py b/product_multi_image/models/product_template.py index 214488ba609c..ce3738e1ce7b 100644 --- a/product_multi_image/models/product_template.py +++ b/product_multi_image/models/product_template.py @@ -3,7 +3,7 @@ # © 2015 Antiun Ingeniería S.L. - Jairo Llopis # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import fields, models +from odoo import api, fields, models class ProductTemplate(models.Model): @@ -22,3 +22,30 @@ class ProductTemplate(models.Model): related='image_main_small', store=False, ) + + @api.multi + def write(self, vals): + if set(['image', 'image_medium', 'image_small']) & set(vals.keys()): + # medium/small image is saved as large + # on load image will be medium/small resized on the fly + if 'image' in vals: + pass + elif 'image_medium' in vals: + vals['image'] = vals['image_medium'] + del vals['image_medium'] + elif 'image_small' in vals: + vals['image'] = vals['image_small'] + del vals['image_small'] + return super(ProductTemplate, self).write(vals) + + @api.multi + def _set_multi_image_main_medium(self): + # on save product module resizes large image to medium + # medium image should not overwrite the large + pass + + @api.multi + def _set_multi_image_main_small(self): + # on save product module resizes large image to small + # small image should not overwrite the large + pass From 0c73ade55fe298c9b3a21c5a34d5969709523529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Fern=C3=A1ndez=20=40PlanetaTIC?= Date: Thu, 5 Jul 2018 13:28:05 +0200 Subject: [PATCH 10/14] [FIX] product_default_image: Fix on install hook when image field has been changed to non-store --- product_default_image/hooks.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/product_default_image/hooks.py b/product_default_image/hooks.py index cbc2464b2cbc..e45cda57f99a 100644 --- a/product_default_image/hooks.py +++ b/product_default_image/hooks.py @@ -10,9 +10,17 @@ def find_templates_with_imgs(cr, registry): with cr.savepoint(): env = api.Environment(cr, SUPERUSER_ID, {}) - tmpls = env['product.template'].search([ - ('image', '!=', False), - ]) + ProductTemplate = env['product.template'] + if ProductTemplate._fields['image'].store: + tmpls = ProductTemplate.search([ + ('image', '!=', False), + ]) + else: + # some modules (like product_multi_image) could change image to + # non-store, so it is necessary to get all product templates and + # filter them + tmpls = ProductTemplate.search([]) + tmpls = tmpls.filtered(lambda tmpl: tmpl.image) tmpls.write({ 'image_type': CUSTOM, }) From 2b5d8cc53831534e6b52bcfa5805212890c9e0e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Fern=C3=A1ndez=20=40PlanetaTIC?= Date: Fri, 20 Jul 2018 13:16:22 +0200 Subject: [PATCH 11/14] [FIX] product_multi_image: Fix image removal from variants --- product_multi_image/models/product_product.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/product_multi_image/models/product_product.py b/product_multi_image/models/product_product.py index 869c4fed181d..0155cd452776 100644 --- a/product_multi_image/models/product_product.py +++ b/product_multi_image/models/product_product.py @@ -104,7 +104,7 @@ def _inverse_image_ids(self): image.unlink() else: # Leave the images for the rest of the variants - image.product_variant_ids = variants.ids + image.product_variant_ids = [(6, 0, variants.ids)] @api.multi @api.depends('image_ids', 'product_tmpl_id.image_ids', From 73383975d1f34fadf212d6ac2beaafcd72ea95c9 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 10 Jul 2019 07:24:42 +0000 Subject: [PATCH 12/14] [UPD] Update product_multi_image.pot --- product_multi_image/i18n/es.po | 57 ++++++------ .../i18n/product_multi_image.pot | 86 +++++++++++++++++++ product_multi_image/i18n/sv.po | 84 ++++++++++++++++-- 3 files changed, 197 insertions(+), 30 deletions(-) create mode 100644 product_multi_image/i18n/product_multi_image.pot diff --git a/product_multi_image/i18n/es.po b/product_multi_image/i18n/es.po index d43e6c9caf56..ff8dabadacd3 100644 --- a/product_multi_image/i18n/es.po +++ b/product_multi_image/i18n/es.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * product_multi_image +# * product_multi_image # msgid "" msgstr "" @@ -10,37 +10,48 @@ msgstr "" "PO-Revision-Date: 2016-04-26 18:40+0000\n" "Last-Translator: <>\n" "Language-Team: \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" #. module: product_multi_image -#: view:base_multi_image.image:product_multi_image.image_form_view +#: model:ir.ui.view,arch_db:product_multi_image.image_form_view msgid "(keep empty for being visible for all variants)" msgstr "(dejar vacío para hacerlo visible para todas las variantes)" #. module: product_multi_image -#: help:base_multi_image.image,product_variant_ids:0 -msgid "If you leave it empty, all variants will show this image. Selecting one or several of the available variants, you restrict the availability of the image to that variants." -msgstr "Si lo deja vacío, todas las variantes mostrarán esta imagen. Seleccionando una o más de las variantes disponibles, restringirá la disponibilidad de la imagen a esas variantes." +#: model:ir.ui.view,arch_db:product_multi_image.image_kanban_view +#, fuzzy +msgid "Visible in all variants" +msgstr "Visible en todas las variantes" + +#. module: product_multi_image +#: model:ir.model.fields,help:product_multi_image.field_base_multi_image_image_product_variant_ids +#, fuzzy +msgid "" +"If you leave it empty, all variants will show this image. Selecting one or " +"several of the available variants, you restrict the availability of the " +"image to those variants." +msgstr "" +"Si lo deja vacío, todas las variantes mostrarán esta imagen. Seleccionando " +"una o más de las variantes disponibles, restringirá la disponibilidad de la " +"imagen a esas variantes." #. module: product_multi_image -#: field:product.product,image_ids:0 -#: view:product.template:product_multi_image.view_product_template_form_img_inh -#: field:product.template,image_ids:0 +#: model:ir.model.fields,field_description:product_multi_image.field_product_product_image_ids +#: model:ir.ui.view,arch_db:product_multi_image.view_product_template_form_img_inh msgid "Images" msgstr "Imágenes" #. module: product_multi_image -#: field:product.product,image_main:0 -#: field:product.template,image_main:0 +#: model:ir.model.fields,field_description:product_multi_image.field_product_product_image_main msgid "Main image" msgstr "Imagen principal" #. module: product_multi_image -#: field:product.product,image_main_medium:0 -#: field:product.template,image_main_medium:0 +#: model:ir.model.fields,field_description:product_multi_image.field_product_product_image_main_medium msgid "Medium image" msgstr "Imagen media" @@ -55,33 +66,31 @@ msgid "Product Template" msgstr "Plantilla de producto" #. module: product_multi_image -#: field:base_multi_image.image,product_variant_count:0 +#: model:ir.model.fields,field_description:product_multi_image.field_base_multi_image_image_product_variant_count msgid "Product variant count" msgstr "Nº de variantes" #. module: product_multi_image -#: field:product.product,image_main_small:0 -#: field:product.template,image_main_small:0 +#: model:ir.model.fields,field_description:product_multi_image.field_product_product_image_main_small msgid "Small image" msgstr "Imagen pequeña" #. module: product_multi_image -#: view:base_multi_image.image:product_multi_image.image_kanban_view +#: model:ir.ui.view,arch_db:product_multi_image.image_kanban_view msgid "Visible in" msgstr "Visible en" #. module: product_multi_image -#: view:base_multi_image.image:product_multi_image.image_kanban_view -msgid "Visible in all variants" -msgstr "Visible en todas las variantes" - -#. module: product_multi_image -#: field:base_multi_image.image,product_variant_ids:0 +#: model:ir.model.fields,field_description:product_multi_image.field_base_multi_image_image_product_variant_ids msgid "Visible in these variants" msgstr "Visible en estas variantes" #. module: product_multi_image -#: view:base_multi_image.image:product_multi_image.image_kanban_view +#: model:ir.model,name:product_multi_image.model_base_multi_image_image +msgid "base_multi_image.image" +msgstr "" + +#. module: product_multi_image +#: model:ir.ui.view,arch_db:product_multi_image.image_kanban_view msgid "variant(s)" msgstr "variante(s)" - diff --git a/product_multi_image/i18n/product_multi_image.pot b/product_multi_image/i18n/product_multi_image.pot new file mode 100644 index 000000000000..a9636245096b --- /dev/null +++ b/product_multi_image/i18n/product_multi_image.pot @@ -0,0 +1,86 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_multi_image +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: product_multi_image +#: model:ir.ui.view,arch_db:product_multi_image.image_form_view +msgid "(keep empty for being visible for all variants)" +msgstr "" + +#. module: product_multi_image +#: model:ir.ui.view,arch_db:product_multi_image.image_kanban_view +msgid "Visible in all variants" +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,help:product_multi_image.field_base_multi_image_image_product_variant_ids +msgid "If you leave it empty, all variants will show this image. Selecting one or several of the available variants, you restrict the availability of the image to those variants." +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,field_description:product_multi_image.field_product_product_image_ids +#: model:ir.ui.view,arch_db:product_multi_image.view_product_template_form_img_inh +msgid "Images" +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,field_description:product_multi_image.field_product_product_image_main +msgid "Main image" +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,field_description:product_multi_image.field_product_product_image_main_medium +msgid "Medium image" +msgstr "" + +#. module: product_multi_image +#: model:ir.model,name:product_multi_image.model_product_product +msgid "Product" +msgstr "" + +#. module: product_multi_image +#: model:ir.model,name:product_multi_image.model_product_template +msgid "Product Template" +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,field_description:product_multi_image.field_base_multi_image_image_product_variant_count +msgid "Product variant count" +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,field_description:product_multi_image.field_product_product_image_main_small +msgid "Small image" +msgstr "" + +#. module: product_multi_image +#: model:ir.ui.view,arch_db:product_multi_image.image_kanban_view +msgid "Visible in" +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,field_description:product_multi_image.field_base_multi_image_image_product_variant_ids +msgid "Visible in these variants" +msgstr "" + +#. module: product_multi_image +#: model:ir.model,name:product_multi_image.model_base_multi_image_image +msgid "base_multi_image.image" +msgstr "" + +#. module: product_multi_image +#: model:ir.ui.view,arch_db:product_multi_image.image_kanban_view +msgid "variant(s)" +msgstr "" + diff --git a/product_multi_image/i18n/sv.po b/product_multi_image/i18n/sv.po index 489a8d03c5ae..5227a1c3bc50 100644 --- a/product_multi_image/i18n/sv.po +++ b/product_multi_image/i18n/sv.po @@ -1,22 +1,94 @@ # Translation of OpenERP Server. # This file contains the translation of the following modules: -# * product_images_olbs +# * product_images_olbs # msgid "" msgstr "" "Project-Id-Version: OpenERP Server 5.0.14\n" -"Report-Msgid-Bugs-To: support@odoo.com\n" +"Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-22 10:19:32+0000\n" "PO-Revision-Date: 2010-11-22 10:19:32+0000\n" "Last-Translator: <>\n" "Language-Team: \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" -#. module: product_images_olbs -#: model:ir.module.module,shortdesc:product_images_olbs.module_meta_information -msgid "Product Image Gallery" -msgstr "Product Image Gallery" +#. module: product_multi_image +#: model:ir.ui.view,arch_db:product_multi_image.image_form_view +msgid "(keep empty for being visible for all variants)" +msgstr "" + +#. module: product_multi_image +#: model:ir.ui.view,arch_db:product_multi_image.image_kanban_view +msgid "Visible in all variants" +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,help:product_multi_image.field_base_multi_image_image_product_variant_ids +msgid "" +"If you leave it empty, all variants will show this image. Selecting one or " +"several of the available variants, you restrict the availability of the " +"image to those variants." +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,field_description:product_multi_image.field_product_product_image_ids +#: model:ir.ui.view,arch_db:product_multi_image.view_product_template_form_img_inh +msgid "Images" +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,field_description:product_multi_image.field_product_product_image_main +msgid "Main image" +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,field_description:product_multi_image.field_product_product_image_main_medium +msgid "Medium image" +msgstr "" + +#. module: product_multi_image +#: model:ir.model,name:product_multi_image.model_product_product +msgid "Product" +msgstr "" + +#. module: product_multi_image +#: model:ir.model,name:product_multi_image.model_product_template +msgid "Product Template" +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,field_description:product_multi_image.field_base_multi_image_image_product_variant_count +msgid "Product variant count" +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,field_description:product_multi_image.field_product_product_image_main_small +msgid "Small image" +msgstr "" + +#. module: product_multi_image +#: model:ir.ui.view,arch_db:product_multi_image.image_kanban_view +msgid "Visible in" +msgstr "" + +#. module: product_multi_image +#: model:ir.model.fields,field_description:product_multi_image.field_base_multi_image_image_product_variant_ids +msgid "Visible in these variants" +msgstr "" + +#. module: product_multi_image +#: model:ir.model,name:product_multi_image.model_base_multi_image_image +msgid "base_multi_image.image" +msgstr "" + +#. module: product_multi_image +#: model:ir.ui.view,arch_db:product_multi_image.image_kanban_view +msgid "variant(s)" +msgstr "" +#~ msgid "Product Image Gallery" +#~ msgstr "Product Image Gallery" From 99bf185309e44c70c38291976cd5e5dde6ccb5ca Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 10 Jul 2019 08:20:52 +0000 Subject: [PATCH 13/14] [UPD] addons table in README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d7ecd86852c9..1b10fe858996 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ addon | version | summary [product_default_image](product_default_image/) | 10.0.1.0.0 | Apply default images to new and existing products. [product_manufacturer](product_manufacturer/) | 10.0.1.0.0 | Product Manufacturers [product_multi_category](product_multi_category/) | 10.0.1.0.0 | Product - Many Categories +[product_multi_image](product_multi_image/) | 10.0.1.0.0 | Multiple Images in Products [product_pricelist_tier](product_pricelist_tier/) | 10.0.1.0.0 | Extends pricelists with tiered pricing. [product_profile](product_profile/) | 10.0.1.0.0 | Allow to configure a product in 1 click [product_profile_example](product_profile_example/) | 10.0.1.0.1 | Product Profile Use Case From 17a18b99ebb4af9eae43870dab70801817642005 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 10 Jul 2019 08:20:53 +0000 Subject: [PATCH 14/14] [ADD] setup.py --- setup/_metapackage/VERSION.txt | 2 +- setup/_metapackage/setup.py | 1 + setup/product_multi_image/odoo/__init__.py | 1 + setup/product_multi_image/odoo/addons/__init__.py | 1 + setup/product_multi_image/odoo/addons/product_multi_image | 1 + setup/product_multi_image/setup.py | 6 ++++++ 6 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 setup/product_multi_image/odoo/__init__.py create mode 100644 setup/product_multi_image/odoo/addons/__init__.py create mode 120000 setup/product_multi_image/odoo/addons/product_multi_image create mode 100644 setup/product_multi_image/setup.py diff --git a/setup/_metapackage/VERSION.txt b/setup/_metapackage/VERSION.txt index f8205f581fd2..1a60a8cacf8c 100644 --- a/setup/_metapackage/VERSION.txt +++ b/setup/_metapackage/VERSION.txt @@ -1 +1 @@ -10.0.20181212.0 \ No newline at end of file +10.0.20190710.0 \ No newline at end of file diff --git a/setup/_metapackage/setup.py b/setup/_metapackage/setup.py index 9d510bf73b72..99d47b8612b3 100644 --- a/setup/_metapackage/setup.py +++ b/setup/_metapackage/setup.py @@ -16,6 +16,7 @@ 'odoo10-addon-product_default_image', 'odoo10-addon-product_manufacturer', 'odoo10-addon-product_multi_category', + 'odoo10-addon-product_multi_image', 'odoo10-addon-product_pricelist_tier', 'odoo10-addon-product_profile', 'odoo10-addon-product_profile_example', diff --git a/setup/product_multi_image/odoo/__init__.py b/setup/product_multi_image/odoo/__init__.py new file mode 100644 index 000000000000..de40ea7ca058 --- /dev/null +++ b/setup/product_multi_image/odoo/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/setup/product_multi_image/odoo/addons/__init__.py b/setup/product_multi_image/odoo/addons/__init__.py new file mode 100644 index 000000000000..de40ea7ca058 --- /dev/null +++ b/setup/product_multi_image/odoo/addons/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/setup/product_multi_image/odoo/addons/product_multi_image b/setup/product_multi_image/odoo/addons/product_multi_image new file mode 120000 index 000000000000..9dbd0dafa1fa --- /dev/null +++ b/setup/product_multi_image/odoo/addons/product_multi_image @@ -0,0 +1 @@ +../../../../product_multi_image \ No newline at end of file diff --git a/setup/product_multi_image/setup.py b/setup/product_multi_image/setup.py new file mode 100644 index 000000000000..28c57bb64031 --- /dev/null +++ b/setup/product_multi_image/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)