signals.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from django.dispatch import receiver, Signal
  2. from misago.core.pgutils import batch_update, batch_delete
  3. from misago.forums.models import Forum
  4. from misago.threads.models import Thread, Post
  5. delete_post = Signal()
  6. delete_thread = Signal()
  7. merge_post = Signal()
  8. merge_thread = Signal(providing_args=["other_thread"])
  9. move_post = Signal()
  10. move_thread = Signal()
  11. """
  12. Signal handlers
  13. """
  14. @receiver(merge_thread)
  15. def merge_threads_posts(sender, **kwargs):
  16. other_thread = kwargs['other_thread']
  17. other_thread.post_set.update(forum=sender.forum, thread=sender)
  18. @receiver(move_thread)
  19. def move_thread_posts(sender, **kwargs):
  20. sender.post_set.update(forum=sender.forum)
  21. from misago.forums.signals import delete_forum_content, move_forum_content
  22. @receiver(delete_forum_content)
  23. def delete_forum_threads(sender, **kwargs):
  24. sender.thread_set.all().delete()
  25. sender.post_set.all().delete()
  26. @receiver(move_forum_content)
  27. def move_forum_threads(sender, **kwargs):
  28. new_forum = kwargs['new_forum']
  29. Thread.objects.filter(forum=sender).update(forum=new_forum)
  30. Post.objects.filter(forum=sender).update(forum=new_forum)
  31. from misago.users.signals import delete_user_content, username_changed
  32. @receiver(delete_user_content)
  33. def delete_user_threads(sender, **kwargs):
  34. recount_forums = set()
  35. recount_threads = set()
  36. for thread in batch_delete(sender.thread_set.all(), 50):
  37. recount_forums.add(thread.forum_id)
  38. thread.delete()
  39. for post in batch_delete(sender.post_set.all(), 50):
  40. recount_forums.add(post.forum_id)
  41. recount_threads.add(post.thread_id)
  42. post.delete()
  43. if recount_threads:
  44. changed_threads_qs = Thread.objects.filter(id__in=recount_threads)
  45. for thread in batch_update(changed_threads_qs, 50):
  46. thread.synchronize()
  47. thread.save()
  48. if recount_forums:
  49. for forum in Forum.objects.filter(id__in=recount_forums):
  50. forum.synchronize()
  51. forum.save()
  52. @receiver(username_changed)
  53. def update_usernames(sender, **kwargs):
  54. Thread.objects.filter(starter=sender).update(
  55. starter_name=sender.username,
  56. starter_slug=sender.slug)
  57. Thread.objects.filter(last_poster=sender).update(
  58. last_poster_name=sender.username,
  59. last_poster_slug=sender.slug)
  60. Post.objects.filter(poster=sender).update(poster_name=sender.username)
  61. Post.objects.filter(last_editor=sender).update(
  62. last_editor_name=sender.username,
  63. last_editor_slug=sender.slug)