From f0cf7ee193c9fc322e98d74365d72a1b1e7edc79 Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Thu, 19 Dec 2019 13:13:20 +0100 Subject: [PATCH] [MIG] stock_location_bin_name: Migration to 13.0 --- .../odoo/addons/stock_location_bin_name | 1 + setup/stock_location_bin_name/setup.py | 6 +++ stock_location_bin_name/__manifest__.py | 4 +- .../models/stock_location.py | 46 +++++++++++++------ 4 files changed, 42 insertions(+), 15 deletions(-) create mode 120000 setup/stock_location_bin_name/odoo/addons/stock_location_bin_name create mode 100644 setup/stock_location_bin_name/setup.py diff --git a/setup/stock_location_bin_name/odoo/addons/stock_location_bin_name b/setup/stock_location_bin_name/odoo/addons/stock_location_bin_name new file mode 120000 index 000000000000..cb6599b26933 --- /dev/null +++ b/setup/stock_location_bin_name/odoo/addons/stock_location_bin_name @@ -0,0 +1 @@ +../../../../stock_location_bin_name \ No newline at end of file diff --git a/setup/stock_location_bin_name/setup.py b/setup/stock_location_bin_name/setup.py new file mode 100644 index 000000000000..28c57bb64031 --- /dev/null +++ b/setup/stock_location_bin_name/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/stock_location_bin_name/__manifest__.py b/stock_location_bin_name/__manifest__.py index 23898c0c3a03..9d81d6f3c50c 100644 --- a/stock_location_bin_name/__manifest__.py +++ b/stock_location_bin_name/__manifest__.py @@ -4,12 +4,12 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) { "name": "Stock Location Bin Name", - "version": "12.0.1.0.0", + "version": "13.0.1.0.0", "author": "BCIM, Okia, Camptocamp, Odoo Community Association (OCA)", "website": "https://github.com/OCA/stock-logistics-warehouse", "summary": "Compute bin stock location name automatically", "category": "Stock Management", - "depends": ["stock_location_zone", "stock_location_attribute"], + "depends": ["stock_location_zone", "stock_location_position"], "data": ["views/stock_location.xml"], "installable": True, "development_status": "Alpha", diff --git a/stock_location_bin_name/models/stock_location.py b/stock_location_bin_name/models/stock_location.py index 80593687e560..5a4c38b10590 100644 --- a/stock_location_bin_name/models/stock_location.py +++ b/stock_location_bin_name/models/stock_location.py @@ -2,11 +2,38 @@ # Copyright 2016-2019 Jacques-Etienne Baudoux (BCIM) # Copyright 2019 Camptocamp SA # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +import string + from odoo import api, fields, models -class StockLocation(models.Model): +class PartialFormatter(string.Formatter): + def __init__(self, missing="~", bad_fmt="!"): + self.missing = missing + self.bad_fmt = bad_fmt + + def get_field(self, field_name, args, kwargs): + # Handle a key not found + try: + val = super().get_field(field_name, args, kwargs) + except (KeyError, AttributeError): + val = None, field_name + return val + + def format_field(self, value, spec): + # handle an invalid format + if value is None: + return self.missing + try: + return super().format_field(value, spec) + except ValueError: + if self.bad_fmt is not None: + return self.bad_fmt + else: + raise + +class StockLocation(models.Model): _inherit = "stock.location" location_name_format = fields.Char( @@ -14,19 +41,10 @@ class StockLocation(models.Model): help="Format string that will compute the name of the location. " "Use location fields. Example: " "'{area}-{corridor:0>2}.{rack:0>3}" - ".{level:0>2}'", - ) - - area = fields.Char( - string="Area", - # Field used for _onchange_attribute_compute_name, so we - # have the name in the record's cache. Does not need to be - # stored as we already have 'area_location_id' - related="area_location_id.name", - readonly=True, + ".{level:0>2}'\n" + "Missing fields are replaced by '~' and formatting errors by '!'.", ) - @api.multi @api.onchange("corridor", "row", "rack", "level", "posx", "posy", "posz") def _onchange_attribute_compute_name(self): for location in self: @@ -44,4 +62,6 @@ def _onchange_attribute_compute_name(self): # We should have the record's values in the cache at this # point. We must be cautious not to leak an environment through # relational fields. - location.name = template.format(**location._cache) + values = dict(location._cache) + values["area"] = area.name + location.name = PartialFormatter().format(template, **values)