signals.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from django.db import transaction
  2. from django.dispatch import receiver, Signal
  3. from misago.core.pgutils import batch_update, batch_delete
  4. from misago.forums.models import Forum
  5. from misago.threads.models import Thread, Post, Event, Label
  6. delete_post = Signal()
  7. delete_thread = Signal()
  8. merge_post = Signal()
  9. merge_thread = Signal(providing_args=["other_thread"])
  10. move_post = Signal()
  11. move_thread = Signal()
  12. remove_thread_participant = Signal(providing_args=["user"])
  13. """
  14. Signal handlers
  15. """
  16. @receiver(merge_thread)
  17. def merge_threads_posts(sender, **kwargs):
  18. other_thread = kwargs['other_thread']
  19. other_thread.post_set.update(forum=sender.forum, thread=sender)
  20. @receiver(move_thread)
  21. def move_thread_content(sender, **kwargs):
  22. sender.post_set.update(forum=sender.forum)
  23. sender.event_set.update(forum=sender.forum)
  24. # remove unavailable labels
  25. if sender.label_id:
  26. new_forum_labels = Label.objects.get_forum_labels(sender.forum)
  27. if sender.label_id not in [l.pk for l in new_forum_labels]:
  28. sender.label = None
  29. from misago.forums.signals import delete_forum_content, move_forum_content
  30. @receiver(delete_forum_content)
  31. def delete_forum_threads(sender, **kwargs):
  32. sender.event_set.all().delete()
  33. sender.thread_set.all().delete()
  34. sender.post_set.all().delete()
  35. @receiver(move_forum_content)
  36. def move_forum_threads(sender, **kwargs):
  37. new_forum = kwargs['new_forum']
  38. Thread.objects.filter(forum=sender).update(forum=new_forum)
  39. Post.objects.filter(forum=sender).update(forum=new_forum)
  40. Event.objects.filter(forum=sender).update(forum=new_forum)
  41. # move labels
  42. old_forum_labels = Label.objects.get_forum_labels(sender)
  43. new_forum_labels = Label.objects.get_forum_labels(new_forum)
  44. for label in old_forum_labels:
  45. if label not in new_forum_labels:
  46. label.forums.add(new_forum_labels)
  47. from misago.users.signals import delete_user_content, username_changed
  48. @receiver(delete_user_content)
  49. def delete_user_threads(sender, **kwargs):
  50. recount_forums = set()
  51. recount_threads = set()
  52. for thread in batch_delete(sender.thread_set.all(), 50):
  53. recount_forums.add(thread.forum_id)
  54. with transaction.atomic():
  55. thread.delete()
  56. for post in batch_delete(sender.post_set.all(), 50):
  57. recount_forums.add(post.forum_id)
  58. recount_threads.add(post.thread_id)
  59. with transaction.atomic():
  60. post.delete()
  61. if recount_threads:
  62. changed_threads_qs = Thread.objects.filter(id__in=recount_threads)
  63. for thread in batch_update(changed_threads_qs, 50):
  64. thread.synchronize()
  65. thread.save()
  66. if recount_forums:
  67. for forum in Forum.objects.filter(id__in=recount_forums):
  68. forum.synchronize()
  69. forum.save()
  70. @receiver(username_changed)
  71. def update_usernames(sender, **kwargs):
  72. Thread.objects.filter(starter=sender).update(
  73. starter_name=sender.username,
  74. starter_slug=sender.slug)
  75. Thread.objects.filter(last_poster=sender).update(
  76. last_poster_name=sender.username,
  77. last_poster_slug=sender.slug)
  78. Post.objects.filter(poster=sender).update(poster_name=sender.username)
  79. Post.objects.filter(last_editor=sender).update(
  80. last_editor_name=sender.username,
  81. last_editor_slug=sender.slug)
  82. Event.objects.filter(author=sender).update(
  83. author_name=sender.username,
  84. author_slug=sender.slug)
  85. from django.contrib.auth import get_user_model
  86. from django.db.models.signals import pre_delete
  87. @receiver(pre_delete, sender=get_user_model())
  88. def remove_unparticipated_private_threads(sender, **kwargs):
  89. threads_qs = kwargs['instance'].private_thread_set.all()
  90. for thread in batch_update(threads_qs, 50):
  91. if thread.participants.count() == 1:
  92. with transaction.atomic():
  93. thread.delete()