diff --git a/InvenTree/part/migrations/0109_auto_20230517_1048.py b/InvenTree/part/migrations/0109_auto_20230517_1048.py index 7f5c551830..9b7bfd8430 100644 --- a/InvenTree/part/migrations/0109_auto_20230517_1048.py +++ b/InvenTree/part/migrations/0109_auto_20230517_1048.py @@ -22,7 +22,7 @@ def update_template_units(apps, schema_editor): ureg = InvenTree.conversion.get_unit_registry() n_converted = 0 - invalid_units = [] + invalid_units = set() for template in PartParameterTemplate.objects.all(): @@ -69,8 +69,8 @@ def update_template_units(apps, schema_editor): break if not found: - print(f"warningCould not find unit match for {template.units}") - invalid_units.append(template.units) + print(f"warning: Could not find unit match for {template.units}") + invalid_units.add(template.units) print(f"Updated units for {n_templates} parameter templates") diff --git a/InvenTree/part/migrations/0111_auto_20230521_1350.py b/InvenTree/part/migrations/0111_auto_20230521_1350.py new file mode 100644 index 0000000000..41689200e2 --- /dev/null +++ b/InvenTree/part/migrations/0111_auto_20230521_1350.py @@ -0,0 +1,89 @@ +# Generated by Django 3.2.19 on 2023-05-21 13:50 + +import pint + +from django.core.exceptions import ValidationError +from django.db import migrations + +import InvenTree.conversion + + +def migrate_part_units(apps, schema_editor): + """Update the units field for each Part object: + + - Check if the units are valid + - Attempt to convert to valid units (if possible) + """ + + Part = apps.get_model('part', 'Part') + + parts = Part.objects.exclude(units=None).exclude(units='') + n_parts = parts.count() + + ureg = InvenTree.conversion.get_unit_registry() + + invalid_units = set() + n_converted = 0 + + for part in parts: + + # Override '%' units (which are invalid) + if part.units == '%': + part.units = 'percent' + part.save() + continue + + # Test if unit is 'valid' + try: + ureg.Unit(part.units) + continue + except pint.errors.UndefinedUnitError: + pass + + # Check a lower-case version + try: + ureg.Unit(part.units.lower()) + print(f"Found unit match: {part.units} -> {part.units.lower()}") + part.units = part.units.lower() + part.save() + n_converted += 1 + continue + except pint.errors.UndefinedUnitError: + pass + + found = False + + # Attempt to convert to a valid unit + for unit in ureg: + if unit.lower() == part.units.lower(): + print("Found unit match: {part.units} -> {unit}") + part.units = str(unit) + part.save() + n_converted += 1 + found = True + break + + if not found: + print(f"Warning: Invalid units for part '{part}': {part.units}") + invalid_units.add(part.units) + + print(f"Updated units for {n_parts} parts") + + if n_converted > 0: + print(f"Converted units for {n_converted} parts") + + if len(invalid_units) > 0: + print(f"Found {len(invalid_units)} invalid units:") + for unit in invalid_units: + print(f" - {unit}") + + +class Migration(migrations.Migration): + + dependencies = [ + ('part', '0110_alter_part_units'), + ] + + operations = [ + migrations.RunPython(code=migrate_part_units, reverse_code=migrations.RunPython.noop) + ]