mirror of
https://github.com/bringout/oca-technical.git
synced 2026-04-20 00:32:00 +02:00
69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
# Copyright 2019-20 ForgeFlow S.L. (https://www.forgeflow.com)
|
|
# Copyright 2019-20 Camptocamp SA
|
|
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
|
|
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class StockBuffer(models.Model):
|
|
_inherit = "stock.buffer"
|
|
|
|
route_ids = fields.Many2many(
|
|
"stock.route",
|
|
string="Allowed routes",
|
|
compute="_compute_route_ids",
|
|
)
|
|
route_id = fields.Many2one(
|
|
"stock.route",
|
|
string="Route",
|
|
domain="[('id', 'in', route_ids)]",
|
|
ondelete="restrict",
|
|
)
|
|
|
|
@api.depends("product_id", "warehouse_id", "warehouse_id.route_ids", "location_id")
|
|
def _compute_route_ids(self):
|
|
route_obj = self.env["stock.route"]
|
|
for record in self:
|
|
wh_routes = record.warehouse_id.route_ids
|
|
routes = route_obj.browse()
|
|
if record.product_id:
|
|
routes += record.product_id.mapped(
|
|
"route_ids"
|
|
) | record.product_id.mapped("categ_id").mapped("total_route_ids")
|
|
if record.warehouse_id:
|
|
routes |= wh_routes
|
|
parents = record.get_parents()
|
|
record.route_ids = self._get_location_routes_of_parents(routes, parents)
|
|
|
|
def _get_location_routes_of_parents(self, routes, parents):
|
|
return routes.filtered(
|
|
lambda route: (
|
|
# at least one rule of the route must have a destination location
|
|
# reaching the buffer
|
|
route.rule_ids.filtered(lambda rule: rule.action != "push").mapped(
|
|
"location_dest_id"
|
|
)
|
|
& parents
|
|
)
|
|
or any(rule.action == "buy" for rule in route.rule_ids)
|
|
)
|
|
|
|
def get_parents(self):
|
|
location = self.location_id
|
|
result = location
|
|
while location.location_id:
|
|
location = location.location_id
|
|
result |= location
|
|
return result
|
|
|
|
def _values_source_location_from_route(self):
|
|
values = super()._values_source_location_from_route()
|
|
if self.route_id:
|
|
values["route_ids"] = self.route_id
|
|
return values
|
|
|
|
def write(self, vals):
|
|
res = super().write(vals)
|
|
if "route_id" in vals:
|
|
self._calc_distributed_source_location()
|
|
return res
|