0003_migrate_reads_to_posts.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. # Generated by Django 1.11.5 on 2017-10-07 14:49
  2. from datetime import timedelta
  3. from django.conf import settings
  4. from django.db import migrations
  5. from django.utils import timezone
  6. from misago.conf import defaults
  7. try:
  8. READS_CUTOFF = settings.MISAGO_READTRACKER_CUTOFF
  9. except AttributeError:
  10. READS_CUTOFF = defaults.MISAGO_READTRACKER_CUTOFF
  11. def populate_posts_reads(apps, schema_editor):
  12. reads_cutoff = timezone.now() - timedelta(days=READS_CUTOFF)
  13. Post = apps.get_model("misago_threads", "Post")
  14. CategoryRead = apps.get_model("misago_readtracker", "CategoryRead")
  15. ThreadRead = apps.get_model("misago_readtracker", "ThreadRead")
  16. PostRead = apps.get_model("misago_readtracker", "PostRead")
  17. migrated_reads = {}
  18. # read posts by category reads
  19. queryset = CategoryRead.objects.select_related().iterator()
  20. for category_read in queryset:
  21. posts_queryset = Post.objects.filter(
  22. category=category_read.category, posted_on__gte=reads_cutoff
  23. )
  24. for post in posts_queryset.iterator():
  25. PostRead.objects.create(
  26. user=category_read.user,
  27. category=post.category,
  28. thread=post.thread,
  29. post=post,
  30. last_read_on=post.posted_on,
  31. )
  32. if category_read.user.pk in migrated_reads:
  33. migrated_reads[category_read.user.pk].append(post.pk)
  34. else:
  35. migrated_reads[category_read.user.pk] = [post.pk]
  36. # read posts by thread reads
  37. queryset = ThreadRead.objects.select_related().iterator()
  38. for thread_read in queryset:
  39. posts_queryset = Post.objects.filter(
  40. thread=thread_read.thread, posted_on__gte=reads_cutoff
  41. )
  42. for post in posts_queryset.iterator():
  43. if post.pk in migrated_reads.get(thread_read.user.pk, []):
  44. continue
  45. PostRead.objects.create(
  46. user=thread_read.user,
  47. category=post.category,
  48. thread=post.thread,
  49. post=post,
  50. last_read_on=post.posted_on,
  51. )
  52. def noop_reverse(apps, schema_editor):
  53. PostRead = apps.get_model("misago_readtracker", "PostRead")
  54. PostRead.objects.all().delete()
  55. class Migration(migrations.Migration):
  56. dependencies = [("misago_readtracker", "0002_postread")]
  57. operations = [migrations.RunPython(populate_posts_reads, noop_reverse)]