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
« 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
3from django.db import migrations
5def convert_to_numeric_value(value: str, units: str):
6 """Convert a value (with units) to a numeric value.
8 Defaults to zero if the value cannot be converted.
9 """
11 import InvenTree.conversion
13 # Default value is null
14 result = None
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
28 return result
31def copy_manufacturer_part_parameters(apps, schema_editor):
32 """Copy ManufacturerPartParameter to Parameter."""
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 = []
40 content_type, _created = ContentType.objects.get_or_create(app_label='company', model='manufacturerpart')
42 N = ManufacturerPartParameter.objects.count()
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.")
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()
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 )
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 ))
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.")
74 assert Parameter.objects.filter(model_type=content_type).count() == len(parameters)
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")
81 OLD_KEY = 'PART_PARAMETER_ENFORCE_UNITS'
82 NEW_KEY = 'PARAMETER_ENFORCE_UNITS'
84 try:
85 setting = GlobalSetting.objects.get(key=OLD_KEY)
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
97class Migration(migrations.Migration):
98 """Perform data migration for the ManufacturerPartParameter model."""
100 atomic = False
102 dependencies = [
103 ("common", "0040_parametertemplate_parameter"),
104 ("part", "0145_auto_20251203_1238"),
105 ]
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 ]