0022_domain_published.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. # -*- coding: utf-8 -*-
  2. # Generated by Django 1.11.15 on 2018-09-17 15:00
  3. from __future__ import unicode_literals
  4. from django.db import migrations, models
  5. from django.db.models import Max
  6. def forward_convert(apps, schema_editor):
  7. # This probably could be done in a single query using
  8. # https://stackoverflow.com/questions/48119049/django-using-an-annotated-aggregate-in-queryset-update/48212331#48212331
  9. Domain = apps.get_model('desecapi', 'Domain')
  10. RRset = apps.get_model('desecapi', 'RRset')
  11. for domain in Domain.objects.all().iterator():
  12. if domain.owner.locked:
  13. continue
  14. rrsets = RRset.objects.filter(domain=domain)
  15. created = rrsets.aggregate(Max('created'))['created__max']
  16. published = rrsets.aggregate(Max('updated'))['updated__max'] or created
  17. # .update() operates on a queryset (not on a Model instance)
  18. Domain.objects.filter(pk=domain.pk).update(published=max(created, published))
  19. class Migration(migrations.Migration):
  20. dependencies = [
  21. ('desecapi', '0021_tokens'),
  22. ]
  23. operations = [
  24. migrations.AddField(
  25. model_name='domain',
  26. name='published',
  27. field=models.DateTimeField(null=True),
  28. ),
  29. migrations.RunPython(forward_convert, reverse_code=migrations.RunPython.noop),
  30. ]