signals.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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
  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. """
  13. Signal handlers
  14. """
  15. @receiver(merge_thread)
  16. def merge_threads_posts(sender, **kwargs):
  17. other_thread = kwargs['other_thread']
  18. other_thread.post_set.update(forum=sender.forum, thread=sender)
  19. @receiver(move_thread)
  20. def move_thread_content(sender, **kwargs):
  21. sender.post_set.update(forum=sender.forum)
  22. sender.event_set.update(forum=sender.forum)
  23. from misago.forums.signals import delete_forum_content, move_forum_content
  24. @receiver(delete_forum_content)
  25. def delete_forum_threads(sender, **kwargs):
  26. sender.event_set.all().delete()
  27. sender.thread_set.all().delete()
  28. sender.post_set.all().delete()
  29. @receiver(move_forum_content)
  30. def move_forum_threads(sender, **kwargs):
  31. new_forum = kwargs['new_forum']
  32. Thread.objects.filter(forum=sender).update(forum=new_forum)
  33. Post.objects.filter(forum=sender).update(forum=new_forum)
  34. Event.objects.filter(forum=sender).update(forum=new_forum)
  35. from misago.users.signals import delete_user_content, username_changed
  36. @receiver(delete_user_content)
  37. def delete_user_threads(sender, **kwargs):
  38. recount_forums = set()
  39. recount_threads = set()
  40. for thread in batch_delete(sender.thread_set.all(), 50):
  41. recount_forums.add(thread.forum_id)
  42. with transaction.atomic():
  43. thread.delete()
  44. for post in batch_delete(sender.post_set.all(), 50):
  45. recount_forums.add(post.forum_id)
  46. recount_threads.add(post.thread_id)
  47. with transaction.atomic():
  48. post.delete()
  49. if recount_threads:
  50. changed_threads_qs = Thread.objects.filter(id__in=recount_threads)
  51. for thread in batch_update(changed_threads_qs, 50):
  52. thread.synchronize()
  53. thread.save()
  54. if recount_forums:
  55. for forum in Forum.objects.filter(id__in=recount_forums):
  56. forum.synchronize()
  57. forum.save()
  58. @receiver(username_changed)
  59. def update_usernames(sender, **kwargs):
  60. Thread.objects.filter(starter=sender).update(
  61. starter_name=sender.username,
  62. starter_slug=sender.slug)
  63. Thread.objects.filter(last_poster=sender).update(
  64. last_poster_name=sender.username,
  65. last_poster_slug=sender.slug)
  66. Post.objects.filter(poster=sender).update(poster_name=sender.username)
  67. Post.objects.filter(last_editor=sender).update(
  68. last_editor_name=sender.username,
  69. last_editor_slug=sender.slug)
  70. Event.objects.filter(author=sender).update(
  71. author_name=sender.username,
  72. author_slug=sender.slug)