diff --git a/src/website/shared/migrations/0049_nixpackage_nixderivation_package.py b/src/website/shared/migrations/0049_nixpackage_nixderivation_package.py new file mode 100644 index 00000000..372a3e11 --- /dev/null +++ b/src/website/shared/migrations/0049_nixpackage_nixderivation_package.py @@ -0,0 +1,44 @@ +from django.db import migrations, models, transaction +import django.db.models.deletion + +def populate_package_field(apps, schema_editor): + NixPackage = apps.get_model('shared', 'NixPackage') + NixDerivation = apps.get_model('shared', 'NixDerivation') + + with transaction.atomic(): + for derivation in NixDerivation.objects.all(): + package, _ = NixPackage.objects.get_or_create(name=derivation.attribute) + derivation.package = package + derivation.save() + +def reverse_populate_package_field(apps, schema_editor): + NixDerivation = apps.get_model('shared', 'NixDerivation') + NixDerivation.objects.update(package=None) + + +class Migration(migrations.Migration): + + dependencies = [ + ('shared', '0048_remove_attribute_suffix'), + ] + + operations = [ + migrations.CreateModel( + name='NixPackage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, unique=True)), + ], + ), + migrations.AddField( + model_name='nixderivation', + name='package', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='shared.nixpackage'), + ), + migrations.RunPython(populate_package_field, reverse_populate_package_field), + migrations.AlterField( + model_name='nixderivation', + name='package', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shared.nixpackage'), + ), + ] diff --git a/src/website/shared/models/nix_evaluation.py b/src/website/shared/models/nix_evaluation.py index 7a1b4d46..996c12f7 100644 --- a/src/website/shared/models/nix_evaluation.py +++ b/src/website/shared/models/nix_evaluation.py @@ -270,6 +270,13 @@ class Meta: # type: ignore[override] unique_together = ("channel", "commit_sha1") +class NixPackage(models.Model): + name = models.CharField(max_length=255, unique=True) + + def __str__(self) -> str: + return self.name + + class NixDerivation(models.Model): """ This represents a Nix derivation "evaluated", @@ -279,6 +286,7 @@ class NixDerivation(models.Model): - parsing the .drv """ + package = models.ForeignKey(NixPackage, on_delete=models.CASCADE, null=True) attribute = models.CharField(max_length=255) derivation_path = models.CharField(max_length=255) dependencies = models.ManyToManyField(NixDerivationOutput)