mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
@@ -0,0 +1 @@
|
||||
../../../../stock_location_bin_name
|
||||
6
setup/stock_location_bin_name/setup.py
Normal file
6
setup/stock_location_bin_name/setup.py
Normal file
@@ -0,0 +1,6 @@
|
||||
import setuptools
|
||||
|
||||
setuptools.setup(
|
||||
setup_requires=['setuptools-odoo'],
|
||||
odoo_addon=True,
|
||||
)
|
||||
1
stock_location_bin_name/__init__.py
Normal file
1
stock_location_bin_name/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import models
|
||||
17
stock_location_bin_name/__manifest__.py
Normal file
17
stock_location_bin_name/__manifest__.py
Normal file
@@ -0,0 +1,17 @@
|
||||
# Copyright 2017 Syvain Van Hoof (Okia sprl) <sylvainvh@okia.be>
|
||||
# Copyright 2016-2019 Jacques-Etienne Baudoux (BCIM) <je@bcim.be>
|
||||
# Copyright 2019 Camptocamp SA
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
||||
{
|
||||
"name": "Stock Location Bin Name",
|
||||
"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_position"],
|
||||
"data": ["views/stock_location.xml"],
|
||||
"installable": True,
|
||||
"development_status": "Alpha",
|
||||
"license": "AGPL-3",
|
||||
}
|
||||
1
stock_location_bin_name/models/__init__.py
Normal file
1
stock_location_bin_name/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import stock_location
|
||||
67
stock_location_bin_name/models/stock_location.py
Normal file
67
stock_location_bin_name/models/stock_location.py
Normal file
@@ -0,0 +1,67 @@
|
||||
# Copyright 2017 Syvain Van Hoof (Okia sprl) <sylvainvh@okia.be>
|
||||
# Copyright 2016-2019 Jacques-Etienne Baudoux (BCIM) <je@bcim.be>
|
||||
# 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 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(
|
||||
"Location Name Format",
|
||||
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}'\n"
|
||||
"Missing fields are replaced by '~' and formatting errors by '!'.",
|
||||
)
|
||||
|
||||
@api.onchange("corridor", "row", "rack", "level", "posx", "posy", "posz")
|
||||
def _onchange_attribute_compute_name(self):
|
||||
for location in self:
|
||||
if not location.location_kind == "bin":
|
||||
continue
|
||||
area = location
|
||||
while area and not area.location_name_format:
|
||||
area = area.location_id
|
||||
if not area:
|
||||
continue
|
||||
template = area.location_name_format
|
||||
# We don't want to use the full browse record as it would
|
||||
# give too much access to internals for the users.
|
||||
# We cannot use location.read() as we may have a NewId.
|
||||
# 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.
|
||||
values = dict(location._cache)
|
||||
values["area"] = area.name
|
||||
location.name = PartialFormatter().format(template, **values)
|
||||
4
stock_location_bin_name/readme/CONTRIBUTORS.rst
Normal file
4
stock_location_bin_name/readme/CONTRIBUTORS.rst
Normal file
@@ -0,0 +1,4 @@
|
||||
* Syvain Van Hoof (Okia sprl) <sylvainvh@okia.be>
|
||||
* Jacques-Etienne Baudoux (BCIM) <je@bcim.be>
|
||||
* Guewen Baconnier (Camptocamp) <guewen.baconnier@camptocamp.com>
|
||||
* Akim Juillerat <akim.juillerat@camptocamp.com>
|
||||
2
stock_location_bin_name/readme/DESCRIPTION.rst
Normal file
2
stock_location_bin_name/readme/DESCRIPTION.rst
Normal file
@@ -0,0 +1,2 @@
|
||||
This module allows to compute automatically Bin location names based on
|
||||
locations attributes.
|
||||
16
stock_location_bin_name/views/stock_location.xml
Normal file
16
stock_location_bin_name/views/stock_location.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="stock_location_form_inherit" model="ir.ui.view">
|
||||
<field name="name">stock.location.name.format</field>
|
||||
<field name="model">stock.location</field>
|
||||
<field name="inherit_id" ref="stock.view_location_form" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="usage" position="after">
|
||||
<field
|
||||
name="location_name_format"
|
||||
attrs="{'invisible': [('location_kind', '=', 'bin')]}"
|
||||
/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user