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

1# Generated by Django 3.2.19 on 2023-05-21 13:50 

2 

3import pint 

4 

5from django.core.exceptions import ValidationError 

6from django.db import migrations 

7 

8import InvenTree.conversion 

9 

10 

11def migrate_part_units(apps, schema_editor): 

12 """Update the units field for each Part object: 

13 

14 - Check if the units are valid 

15 - Attempt to convert to valid units (if possible) 

16 """ 

17 

18 Part = apps.get_model('part', 'Part') 

19 

20 parts = Part.objects.exclude(units=None).exclude(units='') 

21 n_parts = parts.count() 

22 

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 

26 

27 ureg = InvenTree.conversion.get_unit_registry() 

28 

29 invalid_units = set() 

30 n_converted = 0 

31 

32 for part in parts: 

33 

34 # Override '%' units (which are invalid) 

35 if part.units == '%': 

36 part.units = 'percent' 

37 part.save() 

38 continue 

39 

40 # Test if unit is 'valid' 

41 try: 

42 ureg.Unit(part.units) 

43 continue 

44 except Exception: 

45 pass 

46 

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 

57 

58 found = False 

59 

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 

69 

70 if not found: 

71 print(f"Warning: Invalid units for part '{part}': {part.units}") 

72 invalid_units.add(part.units) 

73 

74 print(f"Updated units for {n_parts} parts") 

75 

76 if n_converted > 0: 

77 print(f"Converted units for {n_converted} parts") 

78 

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}") 

83 

84 

85class Migration(migrations.Migration): 

86 

87 atomic = False 

88 

89 dependencies = [ 

90 ('part', '0110_alter_part_units'), 

91 ] 

92 

93 operations = [ 

94 migrations.RunPython(code=migrate_part_units, reverse_code=migrations.RunPython.noop) 

95 ]