0003_migrate_reads_to_posts.py 2.5 KB

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