signals.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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, Post, Thread, Poll, PollVote
  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. remove_thread_participant = Signal(providing_args=["user"])
  17. """
  18. Signal handlers
  19. """
  20. @receiver(merge_thread)
  21. def merge_threads_posts(sender, **kwargs):
  22. other_thread = kwargs['other_thread']
  23. other_thread.post_set.update(category=sender.category, thread=sender)
  24. @receiver(merge_post)
  25. def merge_posts(sender, **kwargs):
  26. other_post = kwargs['other_post']
  27. for user in sender.mentions.iterator():
  28. other_post.mentions.add(user)
  29. @receiver(move_thread)
  30. def move_thread_content(sender, **kwargs):
  31. sender.post_set.update(category=sender.category)
  32. @receiver(delete_category_content)
  33. def delete_category_threads(sender, **kwargs):
  34. sender.thread_set.all().delete()
  35. sender.post_set.all().delete()
  36. @receiver(move_category_content)
  37. def move_category_threads(sender, **kwargs):
  38. new_category = kwargs['new_category']
  39. Thread.objects.filter(category=sender).update(category=new_category)
  40. Post.objects.filter(category=sender).update(category=new_category)
  41. Poll.objects.filter(category=sender).update(category=new_category)
  42. PollVote.objects.filter(category=sender).update(category=new_category)
  43. @receiver(delete_user_content)
  44. def delete_user_threads(sender, **kwargs):
  45. recount_categories = set()
  46. recount_threads = set()
  47. for thread in batch_delete(sender.thread_set.all(), 50):
  48. recount_categories.add(thread.category_id)
  49. with transaction.atomic():
  50. thread.delete()
  51. for post in batch_delete(sender.post_set.all(), 50):
  52. recount_categories.add(post.category_id)
  53. recount_threads.add(post.thread_id)
  54. with transaction.atomic():
  55. post.delete()
  56. if recount_threads:
  57. changed_threads_qs = Thread.objects.filter(id__in=recount_threads)
  58. for thread in batch_update(changed_threads_qs, 50):
  59. thread.synchronize()
  60. thread.save()
  61. if recount_categories:
  62. for category in Category.objects.filter(id__in=recount_categories):
  63. category.synchronize()
  64. category.save()
  65. @receiver(username_changed)
  66. def update_usernames(sender, **kwargs):
  67. Thread.objects.filter(starter=sender).update(
  68. starter_name=sender.username,
  69. starter_slug=sender.slug
  70. )
  71. Thread.objects.filter(last_poster=sender).update(
  72. last_poster_name=sender.username,
  73. last_poster_slug=sender.slug
  74. )
  75. Post.objects.filter(poster=sender).update(poster_name=sender.username)
  76. Post.objects.filter(last_editor=sender).update(
  77. last_editor_name=sender.username,
  78. last_editor_slug=sender.slug
  79. )
  80. Attachment.objects.filter(uploader=sender).update(
  81. uploader_name=sender.username,
  82. uploader_slug=sender.slug
  83. )
  84. Poll.objects.filter(poster=sender).update(
  85. poster_name=sender.username,
  86. poster_slug=sender.slug
  87. )
  88. PollVote.objects.filter(voter=sender).update(
  89. voter_name=sender.username,
  90. voter_slug=sender.slug
  91. )
  92. @receiver(pre_delete, sender=get_user_model())
  93. def remove_unparticipated_private_threads(sender, **kwargs):
  94. threads_qs = kwargs['instance'].private_thread_set.all()
  95. for thread in batch_update(threads_qs, 50):
  96. if thread.participants.count() == 1:
  97. with transaction.atomic():
  98. thread.delete()