2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-06-17 04:25:42 +00:00
Files
InvenTree/InvenTree/part/migrations/0109_auto_20230517_1048.py
2023-05-22 00:01:27 +10:00

148 lines
3.9 KiB
Python

# Generated by Django 3.2.19 on 2023-05-17 10:48
import pint
from django.core.exceptions import ValidationError
from django.db import migrations
import InvenTree.conversion
def update_template_units(apps, schema_editor):
"""Update the units for each parameter template:
- Check if the units are valid
- Attempt to convert to valid units (if possible)
"""
PartParameterTemplate = apps.get_model('part', 'PartParameterTemplate')
n_templates = PartParameterTemplate.objects.count()
ureg = InvenTree.conversion.get_unit_registry()
n_converted = 0
invalid_units = set()
for template in PartParameterTemplate.objects.all():
# Skip empty units
if not template.units:
continue
# Override '%' units (which are invalid)
if template.units == '%':
template.units = 'percent'
template.save()
n_converted += 1
continue
# Test if unit is 'valid'
try:
ureg.Unit(template.units)
continue
except pint.errors.UndefinedUnitError:
pass
# Check a lower-case version
try:
ureg.Unit(template.units.lower())
print(f"Found unit match: {template.units} -> {template.units.lower()}")
template.units = template.units.lower()
template.save()
n_converted += 1
continue
except pint.errors.UndefinedUnitError:
pass
found = False
# Attempt to convert to a valid unit
# Look for capitalization issues (e.g. "Ohm" -> "ohm")
for unit in ureg:
if unit.lower() == template.units.lower():
print(f"Found unit match: {template.units} -> {unit}")
template.units = str(unit)
template.save()
n_converted += 1
found = True
break
if not found:
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")
if n_converted > 0:
print(f" - Converted {n_converted} units")
if len(invalid_units) > 0:
print(f" - Found {len(invalid_units)} invalid units:")
for unit in invalid_units:
print(f" - {unit}")
def convert_to_numeric_value(value: str, units: str):
"""Convert a value (with units) to a numeric value.
Defaults to zero if the value cannot be converted.
"""
# Default value is null
result = None
if units:
try:
result = InvenTree.conversion.convert_physical_value(value, units)
result = float(result.magnitude)
except (ValidationError, ValueError):
pass
else:
try:
result = float(value)
except ValueError:
pass
return result
def update_parameter_values(apps, schema_editor):
"""Update the parameter values for all parts:
- Calculate the 'data_numeric' value for each parameter
- If the template has invalid units, we'll ignore
"""
PartParameter = apps.get_model('part', 'PartParameter')
n_params = PartParameter.objects.count()
# Convert each parameter value to a the specified units
for parameter in PartParameter.objects.all():
parameter.data_numeric = convert_to_numeric_value(parameter.data, parameter.template.units)
parameter.save()
if n_params > 0:
print(f"Updated {n_params} parameter values")
class Migration(migrations.Migration):
dependencies = [
('part', '0108_auto_20230516_1334'),
]
operations = [
migrations.RunPython(
update_template_units,
reverse_code=migrations.RunPython.noop
),
migrations.RunPython(
update_parameter_values,
reverse_code=migrations.RunPython.noop
)
]