Coverage for src/backend/InvenTree/common/migrations/0041_auto_20251203_1244.py: 45%

52 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 17:47 +0000

1# Generated by Django 5.2.8 on 2025-12-03 12:44 

2 

3from django.db import migrations 

4 

5def convert_to_numeric_value(value: str, units: str): 

6 """Convert a value (with units) to a numeric value. 

7 

8 Defaults to zero if the value cannot be converted. 

9 """ 

10 

11 import InvenTree.conversion 

12 

13 # Default value is null 

14 result = None 

15 

16 if units: 

17 try: 

18 result = InvenTree.conversion.convert_physical_value(value, units) 

19 result = float(result.magnitude) 

20 except Exception: 

21 pass 

22 else: 

23 try: 

24 result = float(value) 

25 except Exception: 

26 pass 

27 

28 return result 

29 

30 

31def copy_manufacturer_part_parameters(apps, schema_editor): 

32 """Copy ManufacturerPartParameter to Parameter.""" 

33 

34 ManufacturerPartParameter = apps.get_model("company", "ManufacturerPartParameter") 

35 Parameter = apps.get_model("common", "Parameter") 

36 ParameterTemplate = apps.get_model("common", "ParameterTemplate") 

37 ContentType = apps.get_model("contenttypes", "ContentType") 

38 parameters = [] 

39 

40 content_type, _created = ContentType.objects.get_or_create(app_label='company', model='manufacturerpart') 

41 

42 N = ManufacturerPartParameter.objects.count() 

43 

44 if N > 0: 44 ↛ 45line 44 didn't jump to line 45 because the condition on line 44 was never true

45 print(f"\nMigrating {N} ManufacturerPartParameter objects to the Parameter table.") 

46 

47 for parameter in ManufacturerPartParameter.objects.all(): 47 ↛ 49line 47 didn't jump to line 49 because the loop on line 47 never started

48 # Find the corresponding ParameterTemplate 

49 template = ParameterTemplate.objects.filter(name=parameter.name).first() 

50 

51 if not template: 

52 # A matching template does not exist - let's create one 

53 template = ParameterTemplate.objects.create( 

54 name=parameter.name, 

55 description='', 

56 units=parameter.units or '', 

57 model_type=None, 

58 checkbox=False 

59 ) 

60 

61 parameters.append(Parameter( 

62 template=template, 

63 model_type=content_type, 

64 model_id=parameter.manufacturer_part.id, 

65 data=parameter.value, 

66 data_numeric=convert_to_numeric_value(parameter.value, parameter.units), 

67 )) 

68 

69 if len(parameters) > 0: 69 ↛ 70line 69 didn't jump to line 70 because the condition on line 69 was never true

70 assert ParameterTemplate.objects.count() > 0 

71 Parameter.objects.bulk_create(parameters) 

72 print(f"\nMigrated {len(parameters)} ManufacturerPartParameter instances.") 

73 

74 assert Parameter.objects.filter(model_type=content_type).count() == len(parameters) 

75 

76 

77def update_global_setting(apps, schema_editor): 

78 """Update global setting key from PART_PARAMETER_ENFORCE_UNITS to PARAMETER_ENFORCE_UNITS.""" 

79 GlobalSetting = apps.get_model("common", "InvenTreeSetting") 

80 

81 OLD_KEY = 'PART_PARAMETER_ENFORCE_UNITS' 

82 NEW_KEY = 'PARAMETER_ENFORCE_UNITS' 

83 

84 try: 

85 setting = GlobalSetting.objects.get(key=OLD_KEY) 

86 

87 if setting is not None: 

88 # Remove any existing new key 

89 GlobalSetting.objects.filter(key=NEW_KEY).delete() 

90 setting.key = NEW_KEY 

91 setting.save() 

92 print(f"Updated global setting key from {OLD_KEY} to {NEW_KEY}.") 

93 except GlobalSetting.DoesNotExist: 

94 pass 

95 

96 

97class Migration(migrations.Migration): 

98 """Perform data migration for the ManufacturerPartParameter model.""" 

99 

100 atomic = False 

101 

102 dependencies = [ 

103 ("common", "0040_parametertemplate_parameter"), 

104 ("part", "0145_auto_20251203_1238"), 

105 ] 

106 

107 operations = [ 

108 migrations.RunPython( 

109 update_global_setting, 

110 reverse_code=migrations.RunPython.noop 

111 ), 

112 migrations.RunPython( 

113 copy_manufacturer_part_parameters, 

114 reverse_code=migrations.RunPython.noop 

115 ), 

116 ]