signals.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. from django.contrib.auth import get_user_model
  2. from django.db import transaction
  3. from django.db.models.signals import pre_delete
  4. from django.dispatch import Signal, receiver
  5. from misago.categories.models import Category
  6. from misago.categories.signals import delete_category_content, move_category_content
  7. from misago.core.pgutils import batch_delete, batch_update
  8. from misago.users.signals import delete_user_content, username_changed
  9. from .models import Attachment, Poll, PollVote, Post, PostEdit, PostLike, Thread
  10. delete_post = Signal()
  11. delete_thread = Signal()
  12. merge_post = Signal(providing_args=["other_post"])
  13. merge_thread = Signal(providing_args=["other_thread"])
  14. move_post = Signal()
  15. move_thread = Signal()
  16. @receiver(merge_thread)
  17. def merge_threads(sender, **kwargs):
  18. other_thread = kwargs['other_thread']
  19. other_thread.post_set.update(
  20. category=sender.category,
  21. thread=sender,
  22. )
  23. other_thread.postedit_set.update(
  24. category=sender.category,
  25. thread=sender,
  26. )
  27. other_thread.postlike_set.update(
  28. category=sender.category,
  29. thread=sender,
  30. )
  31. other_thread.subscription_set.exclude(
  32. user__in=sender.subscription_set.values('user'),
  33. ).update(
  34. category=sender.category,
  35. thread=sender,
  36. )
  37. @receiver(merge_post)
  38. def merge_posts(sender, **kwargs):
  39. other_post = kwargs['other_post']
  40. for user in sender.mentions.iterator():
  41. other_post.mentions.add(user)
  42. @receiver(move_thread)
  43. def move_thread_content(sender, **kwargs):
  44. sender.post_set.update(category=sender.category)
  45. sender.postedit_set.update(category=sender.category)
  46. sender.postlike_set.update(category=sender.category)
  47. sender.pollvote_set.update(category=sender.category)
  48. sender.subscription_set.update(category=sender.category)
  49. Poll.objects.filter(thread=sender).update(category=sender.category)
  50. @receiver(delete_category_content)
  51. def delete_category_threads(sender, **kwargs):
  52. sender.subscription_set.all().delete()
  53. sender.pollvote_set.all().delete()
  54. sender.poll_set.all().delete()
  55. sender.postlike_set.all().delete()
  56. sender.thread_set.all().delete()
  57. sender.postedit_set.all().delete()
  58. sender.post_set.all().delete()
  59. @receiver(move_category_content)
  60. def move_category_threads(sender, **kwargs):
  61. new_category = kwargs['new_category']
  62. sender.thread_set.update(category=new_category)
  63. sender.post_set.filter(category=sender).update(category=new_category)
  64. sender.postedit_set.filter(category=sender).update(category=new_category)
  65. sender.postlike_set.filter(category=sender).update(category=new_category)
  66. sender.poll_set.filter(category=sender).update(category=new_category)
  67. sender.pollvote_set.update(category=new_category)
  68. sender.subscription_set.update(category=new_category)
  69. @receiver(delete_user_content)
  70. def delete_user_threads(sender, **kwargs):
  71. recount_categories = set()
  72. recount_threads = set()
  73. for thread in batch_delete(sender.thread_set.all(), 50):
  74. recount_categories.add(thread.category_id)
  75. with transaction.atomic():
  76. thread.delete()
  77. for post in batch_delete(sender.post_set.all(), 50):
  78. recount_categories.add(post.category_id)
  79. recount_threads.add(post.thread_id)
  80. with transaction.atomic():
  81. post.delete()
  82. if recount_threads:
  83. changed_threads_qs = Thread.objects.filter(id__in=recount_threads)
  84. for thread in batch_update(changed_threads_qs, 50):
  85. thread.synchronize()
  86. thread.save()
  87. if recount_categories:
  88. for category in Category.objects.filter(id__in=recount_categories):
  89. category.synchronize()
  90. category.save()
  91. @receiver(username_changed)
  92. def update_usernames(sender, **kwargs):
  93. Thread.objects.filter(starter=sender).update(
  94. starter_name=sender.username,
  95. starter_slug=sender.slug,
  96. )
  97. Thread.objects.filter(last_poster=sender).update(
  98. last_poster_name=sender.username,
  99. last_poster_slug=sender.slug,
  100. )
  101. Post.objects.filter(poster=sender).update(
  102. poster_name=sender.username,
  103. )
  104. Post.objects.filter(last_editor=sender).update(
  105. last_editor_name=sender.username,
  106. last_editor_slug=sender.slug,
  107. )
  108. PostEdit.objects.filter(editor=sender).update(
  109. editor_name=sender.username,
  110. editor_slug=sender.slug,
  111. )
  112. PostLike.objects.filter(liker=sender).update(
  113. liker_name=sender.username,
  114. liker_slug=sender.slug,
  115. )
  116. Attachment.objects.filter(uploader=sender).update(
  117. uploader_name=sender.username,
  118. uploader_slug=sender.slug,
  119. )
  120. Poll.objects.filter(poster=sender).update(
  121. poster_name=sender.username,
  122. poster_slug=sender.slug,
  123. )
  124. PollVote.objects.filter(voter=sender).update(
  125. voter_name=sender.username,
  126. voter_slug=sender.slug,
  127. )
  128. @receiver(pre_delete, sender=get_user_model())
  129. def remove_unparticipated_private_threads(sender, **kwargs):
  130. threads_qs = kwargs['instance'].privatethread_set.all()
  131. for thread in batch_update(threads_qs, 50):
  132. if thread.participants.count() == 1:
  133. with transaction.atomic():
  134. thread.delete()