Skip to content

Commit

Permalink
Merge PR #653 into 12.0
Browse files Browse the repository at this point in the history
Signed-off-by jgrandguillaume
  • Loading branch information
OCA-git-bot committed Sep 11, 2019
2 parents 0f8a166 + a6998d6 commit 373d958
Show file tree
Hide file tree
Showing 15 changed files with 823 additions and 0 deletions.
1 change: 1 addition & 0 deletions setup/stock_location_zone/odoo/addons/stock_location_zone
6 changes: 6 additions & 0 deletions setup/stock_location_zone/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
85 changes: 85 additions & 0 deletions stock_location_zone/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
===================
Stock Location Zone
===================

.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--warehouse-lightgray.png?logo=github
:target: https://github.com/OCA/stock-logistics-warehouse/tree/12.0/stock_location_zone
:alt: OCA/stock-logistics-warehouse
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-12-0/stock-logistics-warehouse-12-0-stock_location_zone
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/153/12.0
:alt: Try me on Runbot

|badge1| |badge2| |badge3| |badge4| |badge5|

Add coordinate attributes on stock location.
Define picking zone with links to picking type.

**Table of contents**

.. contents::
:local:

Configuration
=============

In Inventory Settings, you must have:

* Storage Locations

Set coordinate attibute on the locations.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/stock-logistics-warehouse/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 <https://github.com/OCA/stock-logistics-warehouse/issues/new?body=module:%20stock_location_zone%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
~~~~~~~

* BCIM
* Okia

Contributors
~~~~~~~~~~~~

* Syvain Van Hoof (Okia sprl) <[email protected]>
* Jacques-Etienne Baudoux (BCIM) <[email protected]>

Maintainers
~~~~~~~~~~~

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

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.

This module is part of the `OCA/stock-logistics-warehouse <https://github.com/OCA/stock-logistics-warehouse/tree/12.0/stock_location_zone>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions stock_location_zone/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
24 changes: 24 additions & 0 deletions stock_location_zone/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Copyright 2017 Syvain Van Hoof (Okia sprl) <[email protected]>
# Copyright 2016-2019 Jacques-Etienne Baudoux (BCIM) <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

{
'name': 'Stock Location Zone',
'version': '12.0.1.0.0',
'author': "BCIM, Okia, Camptocamp, Odoo Community Association (OCA)",
'website': "https://github.com/OCA/stock-logistics-warehouse",
'summary': "Add coordinate attributes on stock location. "
"Define picking zone with links to picking type.",
'category': 'Stock Management',
'depends': [
'stock',
],
'data': [
'views/stock_picking_zone.xml',
'views/stock_location.xml',
'security/ir.model.access.csv',
],
'installable': True,
'development_status': 'Alpha',
'license': 'AGPL-3',
}
2 changes: 2 additions & 0 deletions stock_location_zone/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import stock_picking_zone
from . import stock_location
144 changes: 144 additions & 0 deletions stock_location_zone/models/stock_location.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
# Copyright 2017 Sylvain Van Hoof <[email protected]>
# Copyright 2018-2019 Jacques-Etienne Baudoux (BCIM sprl) <[email protected]>
# Copyright 2019 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from psycopg2 import sql

from odoo import _, api, fields, models, SUPERUSER_ID
from odoo.tools.sql import index_exists, _schema


def create_unique_index_where(cr, indexname, tablename, expressions, where):
"""Create the given unique index unless it exists."""
if index_exists(cr, indexname):
return

args = ', '.join(expressions)
# pylint: disable=sql-injection
cr.execute(
sql.SQL(
'CREATE UNIQUE INDEX {} ON {} ({}) WHERE {}').format(
sql.Identifier(indexname),
sql.Identifier(tablename),
sql.SQL(args),
sql.SQL(where),
)
)
_schema.debug(
"Table %r: created unique index %r (%s) WHERE {}",
tablename, indexname, args, where
)


class StockLocation(models.Model):
_inherit = 'stock.location'

# FIXME: add in selection: shuttle, tray (module vertical lift)
kind = fields.Selection([
('zone', 'Picking Zone'),
('area', 'Area'),
('bin', 'Bin')],
string='Kind')

picking_zone_id = fields.Many2one(
'stock.picking.zone',
string='Picking zone',
index=True,
)

picking_type_id = fields.Many2one(
related='picking_zone_id.picking_type_id',
help="Picking type for operations from this location",
oldname='barcode_picking_type_id')

area = fields.Char(
'Area',
compute='_compute_area', store=True,
oldname='zone')

@api.depends('name', 'kind', 'location_id.area')
def _compute_area(self):
for location in self:
if location.kind == 'area':
location.area = location.name
else:
location.area = location.location_id.area

corridor = fields.Char('Corridor', help="Street")
row = fields.Char('Row', help="Side in the street")
rack = fields.Char('Rack', oldname='shelf', help="House number")
level = fields.Char('Level', help="Height on the shelf")
posx = fields.Integer('Box (X)')
posy = fields.Integer('Box (Y)')
posz = fields.Integer('Box (Z)')

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}'")

@api.multi
@api.onchange('corridor', 'row', 'rack', 'level',
'posx', 'posy', 'posz')
def _compute_name(self):
for location in self:
if not 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.
location.name = template.format(**location._cache)

@api.multi
@api.returns('self', lambda value: value.id)
def copy(self, default=None):
self.ensure_one()
default = dict(default or {})
if 'name' not in default:
default['name'] = _("%s (copy)") % (self.name)
return super().copy(default=default)

@api.model_cr
def init(self):
env = api.Environment(self._cr, SUPERUSER_ID, {})
self._init_zone_index(env)

def _init_zone_index(self, env):
"""Add unique index on name per zone
We cannot use _sql_constraints because it doesn't support
WHERE conditions. We need to apply the unique constraint
only within the same zone, otherwise the constraint fails
even on demo data (locations created automatically for
warehouses).
"""
index_name = 'stock_location_unique_name_zone_index'
create_unique_index_where(
env.cr, index_name, self._table,
['name', 'picking_zone_id'],
'picking_zone_id IS NOT NULL'
)

@classmethod
def _init_constraints_onchanges(cls):
# As the unique index created in this model acts as a unique
# constraints but cannot be registered in '_sql_constraints'
# (it doesn't support WHERE clause), associate an error
# message manually (reproduce what _sql_constraints does).
key = 'unique_name_zone'
message = ('Another location with the same name exists in the same'
' zone. Please rename the location.')
cls.pool._sql_error[cls._table + '_' + key] = message
super()._init_constraints_onchanges()
26 changes: 26 additions & 0 deletions stock_location_zone/models/stock_picking_zone.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Copyright 2017 Syvain Van Hoof (Okia sprl) <[email protected]>
# Copyright 2017-2019 Jacques-Etienne Baudoux (BCIM sprl) <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from odoo import fields, models


class PickingZone(models.Model):
_name = 'stock.picking.zone'
_description = "Stock Picking Zone"

name = fields.Char('Name', required=True, translate=True)
code = fields.Char('Code', required=True)
picking_type_id = fields.Many2one(
'stock.picking.type',
string='Pick Type',
help="Picking type for operations from this location",
)

_sql_constraints = [
(
'unique_picking_zone',
'unique (code)',
'The picking zone code must be unique',
)
]
5 changes: 5 additions & 0 deletions stock_location_zone/readme/CONFIGURE.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
In Inventory Settings, you must have:

* Storage Locations

Set coordinate attibute on the locations.
3 changes: 3 additions & 0 deletions stock_location_zone/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
* Syvain Van Hoof (Okia sprl) <[email protected]>
* Jacques-Etienne Baudoux (BCIM) <[email protected]>
* Guewen Baconnier (Camptocamp) <[email protected]>
2 changes: 2 additions & 0 deletions stock_location_zone/readme/DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Add coordinate attributes on stock location.
Define picking zone with links to picking type.
3 changes: 3 additions & 0 deletions stock_location_zone/security/ir.model.access.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_picking_zone,access_picking_zone,model_stock_picking_zone,base.group_user,1,0,0,0
access_picking_zone_manager,access_picking_zone_manager,model_stock_picking_zone,base.group_system,1,1,1,1
Loading

0 comments on commit 373d958

Please sign in to comment.