0003_migrate_reads_to_posts.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. # Generated by Django 1.11.5 on 2017-10-07 14:49
  2. from datetime import timedelta
  3. from django.db import migrations
  4. from django.conf import settings
  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,
  23. posted_on__gte=reads_cutoff,
  24. )
  25. for post in posts_queryset.iterator():
  26. PostRead.objects.create(
  27. user=category_read.user,
  28. category=post.category,
  29. thread=post.thread,
  30. post=post,
  31. last_read_on=post.posted_on,
  32. )
  33. if category_read.user.pk in migrated_reads:
  34. migrated_reads[category_read.user.pk].append(post.pk)
  35. else:
  36. migrated_reads[category_read.user.pk] = [post.pk]
  37. # read posts by thread reads
  38. queryset = ThreadRead.objects.select_related().iterator()
  39. for thread_read in queryset:
  40. posts_queryset = Post.objects.filter(
  41. thread=thread_read.thread,
  42. posted_on__gte=reads_cutoff,
  43. )
  44. for post in posts_queryset.iterator():
  45. if post.pk in migrated_reads.get(thread_read.user.pk, []):
  46. continue
  47. PostRead.objects.create(
  48. user=thread_read.user,
  49. category=post.category,
  50. thread=post.thread,
  51. post=post,
  52. last_read_on=post.posted_on,
  53. )
  54. def noop_reverse(apps, schema_editor):
  55. PostRead = apps.get_model('misago_readtracker', 'PostRead')
  56. PostRead.objects.all().delete()
  57. class Migration(migrations.Migration):
  58. dependencies = [
  59. ('misago_readtracker', '0002_postread'),
  60. ]
  61. operations = [
  62. migrations.RunPython(populate_posts_reads, noop_reverse),
  63. ]