Source code for tcms.management.migrations.0009_build_to_version
import json
from django.conf import settings
from django.db import migrations, models
from django.forms.models import model_to_dict
[docs]
def forwards(apps, schema_editor):
build_model = apps.get_model("management", "Build")
version_model = apps.get_model("management", "Version")
for build in build_model.objects.all():
# backup current values
file_name = f"kiwitcms-management-migration-0009-build_to_version-{build.pk}"
file_name = settings.TEMP_DIR / file_name
with file_name.open("w") as outfile:
json.dump(model_to_dict(build), outfile)
# then adjust the value for the `version` field
qset = version_model.objects.filter(product=build.product)
version = qset.filter(value="unspecified").first()
# if Version "unspecified" has been removed then pin builds
# to the first version found for the same product
if not version:
version = qset.first()
build.version = version.pk
build.save()
[docs]
def backwards(apps, schema_editor):
build_model = apps.get_model("management", "Build")
for build in build_model.objects.all():
# restore product field value
file_name = f"kiwitcms-management-migration-0009-build_to_version-{build.pk}"
file_name = settings.TEMP_DIR / file_name
with file_name.open("r") as infile:
data = json.load(infile)
build.product = data["product"]
build.save()
[docs]
class Migration(migrations.Migration):
dependencies = [
("management", "0008_increase_product_name_size"),
]
operations = [
migrations.AlterModelOptions(
name="build",
options={
"ordering": ["name"],
"verbose_name": "Build",
"verbose_name_plural": "Builds",
},
),
# add new `version` field as integer
migrations.AddField(
model_name="build",
name="version",
field=models.IntegerField(default=0),
preserve_default=False,
),
# assign appropriate values from other DB records
migrations.RunPython(forwards, backwards),
# convert `version` field to FK
migrations.AlterField(
model_name="build",
name="version",
field=models.ForeignKey(
on_delete=models.deletion.CASCADE,
related_name="build",
to="management.version",
),
),
migrations.AlterUniqueTogether(
name="build",
unique_together={("version", "name")},
),
migrations.RemoveField(
model_name="build",
name="product",
),
]