0003_migrate_reads_to_posts.py 2.5 KB

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