0037_remove_tokendomainpolicy_perm_dyndns.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. # Generated by Django 5.0rc1 on 2023-12-01 15:01
  2. from django.db import migrations, transaction
  3. from django.db.models import OuterRef, Subquery
  4. @transaction.atomic
  5. def forwards_func(apps, schema_editor):
  6. TokenDomainPolicy = apps.get_model("desecapi", "TokenDomainPolicy")
  7. db_alias = schema_editor.connection.alias
  8. # Tokens with perm_dyndns effectively have perm_write for type=A/AAAA on any subname of their domain. We create
  9. # corresponding policies explicitly. Uniqueness violation cannot occur (no polices with non-NULL type exist).
  10. # We don't need to do anything for policies with perm_dyndns=False; perm_write determines their capabilities.
  11. queryset = TokenDomainPolicy.objects.using(db_alias)
  12. TokenDomainPolicy.objects.bulk_create(
  13. [
  14. TokenDomainPolicy(
  15. token=policy.token,
  16. domain=policy.domain,
  17. subname=None,
  18. type=type_,
  19. perm_write=True,
  20. )
  21. for policy in queryset.filter(perm_dyndns=True).all()
  22. for type_ in ("A", "AAAA")
  23. ]
  24. )
  25. # Now clean up (non-default) policies which have no further use, i.e. where perm_dyndns was different from the
  26. # default policy (that was taken care of above), but perm_write is equal to the default policy (that's useless).
  27. default_policy = queryset.filter(
  28. token=OuterRef("token"),
  29. domain__isnull=True,
  30. subname__isnull=True,
  31. type__isnull=True,
  32. )
  33. queryset.filter(
  34. domain__isnull=False, perm_write=Subquery(default_policy.values("perm_write"))
  35. ).exclude(perm_dyndns=Subquery(default_policy.values("perm_dyndns"))).delete()
  36. class Migration(migrations.Migration):
  37. atomic = False
  38. dependencies = [
  39. ("desecapi", "0036_remove_tokendomainpolicy_default_policy_on_insert_and_more"),
  40. ]
  41. operations = [
  42. migrations.RunPython(forwards_func, atomic=True),
  43. migrations.RemoveField(
  44. model_name="tokendomainpolicy",
  45. name="perm_dyndns",
  46. ),
  47. ]