fix: Add script to repair corrupted stock.move.line records missing product_id.
This commit is contained in:
parent
f35ab6f9c5
commit
314f028ecf
57
fix_corrupted_move_lines.py
Normal file
57
fix_corrupted_move_lines.py
Normal file
@ -0,0 +1,57 @@
|
||||
# Save this script and run it using the Odoo shell:
|
||||
# odoo-bin shell -c <your_config> -d <your_database> < fix_corrupted_move_lines.py
|
||||
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
def fix_corrupted_move_lines(env):
|
||||
_logger.info("Scanning for corrupted stock.move.lines with missing product_id...")
|
||||
|
||||
# Search for all move lines that do not have a product_id
|
||||
# We use a raw SQL query to aggressively find them even if ORM hides them,
|
||||
# but we will try to use ORM first.
|
||||
|
||||
env.cr.execute("""
|
||||
SELECT id, move_id
|
||||
FROM stock_move_line
|
||||
WHERE product_id IS NULL AND move_id IS NOT NULL
|
||||
""")
|
||||
|
||||
corrupted_lines = env.cr.fetchall()
|
||||
|
||||
if not corrupted_lines:
|
||||
_logger.info("No corrupted move lines found!")
|
||||
print("No corrupted move lines found.")
|
||||
return
|
||||
|
||||
_logger.info(f"Found {len(corrupted_lines)} corrupted move lines. Fixing...")
|
||||
print(f"Found {len(corrupted_lines)} corrupted move lines. Fixing...")
|
||||
|
||||
fixed_count = 0
|
||||
for line_id, move_id in corrupted_lines:
|
||||
try:
|
||||
# Find the parent move to get the correct product_id
|
||||
move = env['stock.move'].browse(move_id)
|
||||
if not move.exists() or not move.product_id:
|
||||
_logger.warning(f"Could not fix move line {line_id}: Parent move {move_id} is missing or has no product.")
|
||||
continue
|
||||
|
||||
# Perform a hard SQL update to bypass any ORM constraints that might crash
|
||||
env.cr.execute("""
|
||||
UPDATE stock_move_line
|
||||
SET product_id = %s
|
||||
WHERE id = %s
|
||||
""", (move.product_id.id, line_id))
|
||||
|
||||
fixed_count += 1
|
||||
print(f"Fixed move line {line_id} -> Assigned product_id {move.product_id.id} ({move.product_id.display_name})")
|
||||
|
||||
except Exception as e:
|
||||
_logger.error(f"Error fixing line {line_id}: {e}")
|
||||
|
||||
env.cr.commit()
|
||||
_logger.info(f"Successfully fixed {fixed_count} move lines.")
|
||||
print(f"Successfully fixed {fixed_count} move lines. Please refresh your Odoo browser.")
|
||||
|
||||
# Execute the fix
|
||||
fix_corrupted_move_lines(env)
|
||||
Loading…
Reference in New Issue
Block a user