mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-29 20:16:44 +00:00
Backport for data migration fix (#4401)
* Add migration test (#4398) * Add migration test Looking at older data migration which removes stock items which are "scheduled_for_deletion" * Account for parent / child relationships (cherry picked from commit 89ac0a623b51256748d346f4e95ae371c2a14d47) * linting
This commit is contained in:
parent
5ff7468bfc
commit
a55fe5941c
@ -22,7 +22,13 @@ def delete_scheduled(apps, schema_editor):
|
|||||||
|
|
||||||
if items.count() > 0:
|
if items.count() > 0:
|
||||||
logger.info(f"Removing {items.count()} stock items scheduled for deletion")
|
logger.info(f"Removing {items.count()} stock items scheduled for deletion")
|
||||||
items.delete()
|
|
||||||
|
# Ensure any parent / child relationships are updated!
|
||||||
|
for item in items:
|
||||||
|
childs = StockItem.objects.filter(parent=item)
|
||||||
|
childs.update(parent=item.parent)
|
||||||
|
|
||||||
|
item.delete()
|
||||||
|
|
||||||
Task = apps.get_model('django_q', 'schedule')
|
Task = apps.get_model('django_q', 'schedule')
|
||||||
|
|
||||||
|
@ -67,3 +67,65 @@ class TestSerialNumberMigration(MigratorTestCase):
|
|||||||
# Check that the StockItem maximum serial number
|
# Check that the StockItem maximum serial number
|
||||||
self.assertEqual(big_ref_item.serial, '9999999999999999999999999999999999999999999999999999999999999')
|
self.assertEqual(big_ref_item.serial, '9999999999999999999999999999999999999999999999999999999999999')
|
||||||
self.assertEqual(big_ref_item.serial_int, 0x7fffffff)
|
self.assertEqual(big_ref_item.serial_int, 0x7fffffff)
|
||||||
|
|
||||||
|
|
||||||
|
class TestScheduledForDeletionMigration(MigratorTestCase):
|
||||||
|
"""Test data migration for removing 'scheduled_for_deletion' field"""
|
||||||
|
|
||||||
|
migrate_from = ('stock', '0066_stockitem_scheduled_for_deletion')
|
||||||
|
migrate_to = ('stock', helpers.getNewestMigrationFile('stock'))
|
||||||
|
|
||||||
|
def prepare(self):
|
||||||
|
"""Create some initial stock items"""
|
||||||
|
|
||||||
|
Part = self.old_state.apps.get_model('part', 'part')
|
||||||
|
StockItem = self.old_state.apps.get_model('stock', 'stockitem')
|
||||||
|
|
||||||
|
for idx in range(5):
|
||||||
|
part = Part.objects.create(
|
||||||
|
name=f'Part_{idx}',
|
||||||
|
description='Just a part, nothing to see here',
|
||||||
|
active=True,
|
||||||
|
level=0, tree_id=0,
|
||||||
|
lft=0, rght=0,
|
||||||
|
)
|
||||||
|
|
||||||
|
for jj in range(5):
|
||||||
|
StockItem.objects.create(
|
||||||
|
part=part,
|
||||||
|
quantity=jj + 5,
|
||||||
|
level=0, tree_id=0,
|
||||||
|
lft=0, rght=0,
|
||||||
|
scheduled_for_deletion=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# For extra points, create some parent-child relationships between stock items
|
||||||
|
part = Part.objects.first()
|
||||||
|
|
||||||
|
item_1 = StockItem.objects.create(
|
||||||
|
part=part,
|
||||||
|
quantity=100,
|
||||||
|
level=0, tree_id=0,
|
||||||
|
lft=0, rght=0,
|
||||||
|
scheduled_for_deletion=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
for _ii in range(3):
|
||||||
|
StockItem.objects.create(
|
||||||
|
part=part,
|
||||||
|
quantity=200,
|
||||||
|
level=0, tree_id=0,
|
||||||
|
lft=0, rght=0,
|
||||||
|
scheduled_for_deletion=False,
|
||||||
|
parent=item_1,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(StockItem.objects.count(), 29)
|
||||||
|
|
||||||
|
def test_migration(self):
|
||||||
|
"""Test that all stock items were actually removed"""
|
||||||
|
|
||||||
|
StockItem = self.new_state.apps.get_model('stock', 'stockitem')
|
||||||
|
|
||||||
|
# All the "scheduled for deletion" items have been removed
|
||||||
|
self.assertEqual(StockItem.objects.count(), 3)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user