浏览代码

feat(api): switch TokenDomainPolicy.id to UUID

Peter Thomassen 1 年之前
父节点
当前提交
5223964754

+ 48 - 0
api/desecapi/migrations/0033_alter_tokendomainpolicy_id.py

@@ -0,0 +1,48 @@
+# Generated by Django 4.2.7 on 2023-11-23 13:10
+
+from django.db import migrations, models
+import uuid
+
+
+def forwards_func(apps, schema_editor):
+    TokenDomainPolicy = apps.get_model("desecapi", "TokenDomainPolicy")
+    db_alias = schema_editor.connection.alias
+    for policy in TokenDomainPolicy.objects.using(db_alias).all():
+        policy.id_uuid = uuid.uuid4()
+        policy.save()
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("desecapi", "0032_tokendomainpolicy_token_user_and_more"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="tokendomainpolicy",
+            name="id_uuid",
+            field=models.UUIDField(null=True),
+        ),
+        migrations.RunPython(forwards_func),
+        migrations.AlterField(
+            model_name="tokendomainpolicy",
+            name="id_uuid",
+            field=models.UUIDField(default=uuid.uuid4, editable=False, serialize=False),
+        ),
+        migrations.RemoveField(
+            model_name="tokendomainpolicy",
+            name="id",
+        ),
+        migrations.RenameField(
+            model_name="tokendomainpolicy",
+            old_name="id_uuid",
+            new_name="id",
+        ),
+        migrations.AlterField(
+            model_name="tokendomainpolicy",
+            name="id",
+            field=models.UUIDField(
+                default=uuid.uuid4, editable=False, primary_key=True, serialize=False
+            ),
+        ),
+    ]

+ 1 - 0
api/desecapi/models/domains.py

@@ -79,6 +79,7 @@ class Domain(ExportModelOperationsMixin("Domain"), models.Model):
         # Avoid super().__init__(owner=None, ...) to not mess up *values instantiation in django.db.models.Model.from_db
         super().__init__(*args, **kwargs)
         if (
+            # self._state.adding may be incorrect during signal processing (change tracker)
             self.pk is None
             and kwargs.get("renewal_state") is None
             and self.is_locally_registrable

+ 2 - 1
api/desecapi/models/tokens.py

@@ -143,6 +143,7 @@ class Token(ExportModelOperationsMixin("Token"), rest_framework.authtoken.models
     ),
 )
 class TokenDomainPolicy(ExportModelOperationsMixin("TokenDomainPolicy"), models.Model):
+    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
     token = models.ForeignKey(Token, on_delete=models.CASCADE)
     domain = models.ForeignKey("Domain", on_delete=models.CASCADE, null=True)
     perm_dyndns = models.BooleanField(default=False)
@@ -164,7 +165,7 @@ class TokenDomainPolicy(ExportModelOperationsMixin("TokenDomainPolicy"), models.
 
     def clean(self):
         default_policy = self.token.get_policy(domain=None)
-        if self.pk:  # update
+        if not self._state.adding:  # update
             # Can't change policy's default status ("domain NULLness") to maintain policy precedence
             if (self.domain is None) != (self.pk == default_policy.pk):
                 raise ValidationError(