Coverage for src/backend/InvenTree/part/migrations/0111_auto_20230521_1350.py: 21%
55 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
1# Generated by Django 3.2.19 on 2023-05-21 13:50
3import pint
5from django.core.exceptions import ValidationError
6from django.db import migrations
8import InvenTree.conversion
11def migrate_part_units(apps, schema_editor):
12 """Update the units field for each Part object:
14 - Check if the units are valid
15 - Attempt to convert to valid units (if possible)
16 """
18 Part = apps.get_model('part', 'Part')
20 parts = Part.objects.exclude(units=None).exclude(units='')
21 n_parts = parts.count()
23 if n_parts == 0: 23 ↛ 27line 23 didn't jump to line 27 because the condition on line 23 was always true
24 # Escape early
25 return
27 ureg = InvenTree.conversion.get_unit_registry()
29 invalid_units = set()
30 n_converted = 0
32 for part in parts:
34 # Override '%' units (which are invalid)
35 if part.units == '%':
36 part.units = 'percent'
37 part.save()
38 continue
40 # Test if unit is 'valid'
41 try:
42 ureg.Unit(part.units)
43 continue
44 except Exception:
45 pass
47 # Check a lower-case version
48 try:
49 ureg.Unit(part.units.lower())
50 print(f"Found unit match: {part.units} -> {part.units.lower()}")
51 part.units = part.units.lower()
52 part.save()
53 n_converted += 1
54 continue
55 except Exception:
56 pass
58 found = False
60 # Attempt to convert to a valid unit
61 for unit in ureg:
62 if unit.lower() == part.units.lower():
63 print("Found unit match: {part.units} -> {unit}")
64 part.units = str(unit)
65 part.save()
66 n_converted += 1
67 found = True
68 break
70 if not found:
71 print(f"Warning: Invalid units for part '{part}': {part.units}")
72 invalid_units.add(part.units)
74 print(f"Updated units for {n_parts} parts")
76 if n_converted > 0:
77 print(f"Converted units for {n_converted} parts")
79 if len(invalid_units) > 0:
80 print(f"Found {len(invalid_units)} invalid units:")
81 for unit in invalid_units:
82 print(f" - {unit}")
85class Migration(migrations.Migration):
87 atomic = False
89 dependencies = [
90 ('part', '0110_alter_part_units'),
91 ]
93 operations = [
94 migrations.RunPython(code=migrate_part_units, reverse_code=migrations.RunPython.noop)
95 ]