[MIG] bemade_so_followers_to_picking to 18.0
This commit is contained in:
parent
975870333a
commit
8662ad3ffd
6 changed files with 255 additions and 0 deletions
1
bemade_so_followers_to_picking/__init__.py
Normal file
1
bemade_so_followers_to_picking/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
from . import models
|
||||||
21
bemade_so_followers_to_picking/__manifest__.py
Normal file
21
bemade_so_followers_to_picking/__manifest__.py
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
{
|
||||||
|
"name": "Add SO Followers to Picking",
|
||||||
|
"version": "18.0.0.0.1",
|
||||||
|
"category": "Extra Tools",
|
||||||
|
"summary": "Add SO Followers to Picking",
|
||||||
|
"description": """
|
||||||
|
Add SO Followers to Picking
|
||||||
|
""",
|
||||||
|
"author": "Bemade",
|
||||||
|
"website": "https://www.bemade.org",
|
||||||
|
"depends": [
|
||||||
|
"sale_management",
|
||||||
|
"purchase",
|
||||||
|
"stock",
|
||||||
|
],
|
||||||
|
"data": [],
|
||||||
|
"auto_install": False,
|
||||||
|
"installable": True,
|
||||||
|
"license": "OPL-1",
|
||||||
|
}
|
||||||
1
bemade_so_followers_to_picking/models/__init__.py
Normal file
1
bemade_so_followers_to_picking/models/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
from . import stock_picking
|
||||||
20
bemade_so_followers_to_picking/models/stock_picking.py
Normal file
20
bemade_so_followers_to_picking/models/stock_picking.py
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
from odoo import models, api
|
||||||
|
|
||||||
|
|
||||||
|
class StockPicking(models.Model):
|
||||||
|
_inherit = "stock.picking"
|
||||||
|
|
||||||
|
@api.model_create_multi
|
||||||
|
def create(self, vals_list):
|
||||||
|
pickings = super().create(vals_list)
|
||||||
|
|
||||||
|
for picking, vals in zip(pickings, vals_list):
|
||||||
|
if "origin" in vals:
|
||||||
|
sale_order = self.env["sale.order"].search(
|
||||||
|
[("name", "=", vals["origin"])], limit=1
|
||||||
|
)
|
||||||
|
if sale_order:
|
||||||
|
for follower in sale_order.message_follower_ids:
|
||||||
|
picking.message_subscribe(partner_ids=[follower.partner_id.id])
|
||||||
|
|
||||||
|
return pickings
|
||||||
1
bemade_so_followers_to_picking/tests/__init__.py
Normal file
1
bemade_so_followers_to_picking/tests/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
from . import test_so_followers_to_picking
|
||||||
|
|
@ -0,0 +1,211 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo.tests.common import TransactionCase
|
||||||
|
from odoo import Command
|
||||||
|
|
||||||
|
|
||||||
|
class TestSOFollowersToPicking(TransactionCase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super().setUpClass()
|
||||||
|
|
||||||
|
# Create test partners
|
||||||
|
cls.partner_1 = cls.env['res.partner'].create({
|
||||||
|
'name': 'Test Partner 1',
|
||||||
|
'email': 'partner1@test.com',
|
||||||
|
})
|
||||||
|
|
||||||
|
cls.partner_2 = cls.env['res.partner'].create({
|
||||||
|
'name': 'Test Partner 2',
|
||||||
|
'email': 'partner2@test.com',
|
||||||
|
})
|
||||||
|
|
||||||
|
cls.customer = cls.env['res.partner'].create({
|
||||||
|
'name': 'Test Customer',
|
||||||
|
'email': 'customer@test.com',
|
||||||
|
})
|
||||||
|
|
||||||
|
# Create a test product
|
||||||
|
cls.product = cls.env['product.product'].create({
|
||||||
|
'name': 'Test Product',
|
||||||
|
'type': 'consu',
|
||||||
|
'list_price': 100.0,
|
||||||
|
})
|
||||||
|
|
||||||
|
# Get stock locations and picking types
|
||||||
|
cls.warehouse = cls.env['stock.warehouse'].search([], limit=1)
|
||||||
|
cls.stock_location = cls.warehouse.lot_stock_id
|
||||||
|
cls.customer_location = cls.env['stock.location'].search([('usage', '=', 'customer')], limit=1)
|
||||||
|
cls.picking_type_out = cls.warehouse.out_type_id
|
||||||
|
|
||||||
|
def test_followers_copied_to_picking_on_create(self):
|
||||||
|
"""Test that followers from sale order are copied to stock picking when created"""
|
||||||
|
|
||||||
|
# Create a sale order
|
||||||
|
sale_order = self.env['sale.order'].create({
|
||||||
|
'partner_id': self.customer.id,
|
||||||
|
'order_line': [Command.create({
|
||||||
|
'product_id': self.product.id,
|
||||||
|
'product_uom_qty': 1,
|
||||||
|
'price_unit': 100.0,
|
||||||
|
})],
|
||||||
|
})
|
||||||
|
|
||||||
|
# Add followers to the sale order
|
||||||
|
sale_order.message_subscribe(partner_ids=[self.partner_1.id, self.partner_2.id])
|
||||||
|
|
||||||
|
# Verify followers are added to sale order
|
||||||
|
follower_partner_ids = sale_order.message_follower_ids.mapped('partner_id.id')
|
||||||
|
self.assertIn(self.partner_1.id, follower_partner_ids)
|
||||||
|
self.assertIn(self.partner_2.id, follower_partner_ids)
|
||||||
|
|
||||||
|
# Confirm the sale order to generate picking
|
||||||
|
sale_order.action_confirm()
|
||||||
|
|
||||||
|
# Get the generated picking
|
||||||
|
picking = self.env['stock.picking'].search([('origin', '=', sale_order.name)], limit=1)
|
||||||
|
|
||||||
|
# Verify that followers from sale order are copied to picking
|
||||||
|
picking_follower_partner_ids = picking.message_follower_ids.mapped('partner_id.id')
|
||||||
|
self.assertIn(self.partner_1.id, picking_follower_partner_ids)
|
||||||
|
self.assertIn(self.partner_2.id, picking_follower_partner_ids)
|
||||||
|
|
||||||
|
def test_followers_copied_when_picking_created_manually(self):
|
||||||
|
"""Test that followers are copied when picking is created manually with origin"""
|
||||||
|
|
||||||
|
# Create a sale order
|
||||||
|
sale_order = self.env['sale.order'].create({
|
||||||
|
'partner_id': self.customer.id,
|
||||||
|
'order_line': [Command.create({
|
||||||
|
'product_id': self.product.id,
|
||||||
|
'product_uom_qty': 1,
|
||||||
|
'price_unit': 100.0,
|
||||||
|
})],
|
||||||
|
})
|
||||||
|
|
||||||
|
# Add followers to the sale order
|
||||||
|
sale_order.message_subscribe(partner_ids=[self.partner_1.id])
|
||||||
|
|
||||||
|
# Create a picking manually with the sale order name as origin
|
||||||
|
picking = self.env['stock.picking'].create({
|
||||||
|
'partner_id': self.customer.id,
|
||||||
|
'picking_type_id': self.picking_type_out.id,
|
||||||
|
'location_id': self.stock_location.id,
|
||||||
|
'location_dest_id': self.customer_location.id,
|
||||||
|
'origin': sale_order.name,
|
||||||
|
})
|
||||||
|
|
||||||
|
# Verify that followers from sale order are copied to picking
|
||||||
|
picking_follower_partner_ids = picking.message_follower_ids.mapped('partner_id.id')
|
||||||
|
self.assertIn(self.partner_1.id, picking_follower_partner_ids)
|
||||||
|
|
||||||
|
def test_no_followers_when_no_matching_sale_order(self):
|
||||||
|
"""Test that no followers are added when there's no matching sale order"""
|
||||||
|
|
||||||
|
# Create a picking with a non-existent origin
|
||||||
|
picking = self.env['stock.picking'].create({
|
||||||
|
'partner_id': self.customer.id,
|
||||||
|
'picking_type_id': self.picking_type_out.id,
|
||||||
|
'location_id': self.stock_location.id,
|
||||||
|
'location_dest_id': self.customer_location.id,
|
||||||
|
'origin': 'NON_EXISTENT_SO',
|
||||||
|
})
|
||||||
|
|
||||||
|
# Verify that no additional followers are added (only the default ones)
|
||||||
|
# The picking should only have system followers, not any from a sale order
|
||||||
|
initial_follower_count = len(picking.message_follower_ids)
|
||||||
|
|
||||||
|
# Create another picking with same origin to ensure consistent behavior
|
||||||
|
picking2 = self.env['stock.picking'].create({
|
||||||
|
'partner_id': self.customer.id,
|
||||||
|
'picking_type_id': self.picking_type_out.id,
|
||||||
|
'location_id': self.stock_location.id,
|
||||||
|
'location_dest_id': self.customer_location.id,
|
||||||
|
'origin': 'ANOTHER_NON_EXISTENT_SO',
|
||||||
|
})
|
||||||
|
|
||||||
|
# Both pickings should have the same number of followers (system defaults only)
|
||||||
|
self.assertEqual(len(picking.message_follower_ids), len(picking2.message_follower_ids))
|
||||||
|
|
||||||
|
def test_no_followers_when_no_origin(self):
|
||||||
|
"""Test that no followers are added when picking has no origin"""
|
||||||
|
|
||||||
|
# Create a sale order with followers
|
||||||
|
sale_order = self.env['sale.order'].create({
|
||||||
|
'partner_id': self.customer.id,
|
||||||
|
'order_line': [Command.create({
|
||||||
|
'product_id': self.product.id,
|
||||||
|
'product_uom_qty': 1,
|
||||||
|
'price_unit': 100.0,
|
||||||
|
})],
|
||||||
|
})
|
||||||
|
|
||||||
|
sale_order.message_subscribe(partner_ids=[self.partner_1.id])
|
||||||
|
|
||||||
|
# Create a picking without origin
|
||||||
|
picking = self.env['stock.picking'].create({
|
||||||
|
'partner_id': self.customer.id,
|
||||||
|
'picking_type_id': self.picking_type_out.id,
|
||||||
|
'location_id': self.stock_location.id,
|
||||||
|
'location_dest_id': self.customer_location.id,
|
||||||
|
# No origin specified
|
||||||
|
})
|
||||||
|
|
||||||
|
# Verify that the sale order follower is not copied to the picking
|
||||||
|
picking_follower_partner_ids = picking.message_follower_ids.mapped('partner_id.id')
|
||||||
|
self.assertNotIn(self.partner_1.id, picking_follower_partner_ids)
|
||||||
|
|
||||||
|
def test_multiple_pickings_created_together(self):
|
||||||
|
"""Test that followers are copied correctly when multiple pickings are created together"""
|
||||||
|
|
||||||
|
# Create two sale orders with different followers
|
||||||
|
sale_order_1 = self.env['sale.order'].create({
|
||||||
|
'partner_id': self.customer.id,
|
||||||
|
'order_line': [Command.create({
|
||||||
|
'product_id': self.product.id,
|
||||||
|
'product_uom_qty': 1,
|
||||||
|
'price_unit': 100.0,
|
||||||
|
})],
|
||||||
|
})
|
||||||
|
|
||||||
|
sale_order_2 = self.env['sale.order'].create({
|
||||||
|
'partner_id': self.customer.id,
|
||||||
|
'order_line': [Command.create({
|
||||||
|
'product_id': self.product.id,
|
||||||
|
'product_uom_qty': 1,
|
||||||
|
'price_unit': 100.0,
|
||||||
|
})],
|
||||||
|
})
|
||||||
|
|
||||||
|
# Add different followers to each sale order
|
||||||
|
sale_order_1.message_subscribe(partner_ids=[self.partner_1.id])
|
||||||
|
sale_order_2.message_subscribe(partner_ids=[self.partner_2.id])
|
||||||
|
|
||||||
|
# Create multiple pickings at once
|
||||||
|
pickings = self.env['stock.picking'].create([
|
||||||
|
{
|
||||||
|
'partner_id': self.customer.id,
|
||||||
|
'picking_type_id': self.picking_type_out.id,
|
||||||
|
'location_id': self.stock_location.id,
|
||||||
|
'location_dest_id': self.customer_location.id,
|
||||||
|
'origin': sale_order_1.name,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'partner_id': self.customer.id,
|
||||||
|
'picking_type_id': self.picking_type_out.id,
|
||||||
|
'location_id': self.stock_location.id,
|
||||||
|
'location_dest_id': self.customer_location.id,
|
||||||
|
'origin': sale_order_2.name,
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
# Verify that each picking has the correct followers
|
||||||
|
picking_1_followers = pickings[0].message_follower_ids.mapped('partner_id.id')
|
||||||
|
picking_2_followers = pickings[1].message_follower_ids.mapped('partner_id.id')
|
||||||
|
|
||||||
|
self.assertIn(self.partner_1.id, picking_1_followers)
|
||||||
|
self.assertNotIn(self.partner_2.id, picking_1_followers)
|
||||||
|
|
||||||
|
self.assertIn(self.partner_2.id, picking_2_followers)
|
||||||
|
self.assertNotIn(self.partner_1.id, picking_2_followers)
|
||||||
Loading…
Reference in a new issue