signals.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from django.db import transaction
  2. from django.dispatch import receiver, Signal
  3. from misago.categories.models import Category
  4. from misago.core.pgutils import batch_update, batch_delete
  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. 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(category=sender.category, thread=sender)
  20. @receiver(move_thread)
  21. def move_thread_content(sender, **kwargs):
  22. sender.post_set.update(category=sender.category)
  23. sender.event_set.update(category=sender.category)
  24. from misago.categories.signals import (delete_category_content,
  25. move_category_content)
  26. @receiver(delete_category_content)
  27. def delete_category_threads(sender, **kwargs):
  28. sender.event_set.all().delete()
  29. sender.thread_set.all().delete()
  30. sender.post_set.all().delete()
  31. @receiver(move_category_content)
  32. def move_category_threads(sender, **kwargs):
  33. new_category = kwargs['new_category']
  34. Thread.objects.filter(category=sender).update(category=new_category)
  35. Post.objects.filter(category=sender).update(category=new_category)
  36. Event.objects.filter(category=sender).update(category=new_category)
  37. from misago.users.signals import delete_user_content, username_changed
  38. @receiver(delete_user_content)
  39. def delete_user_threads(sender, **kwargs):
  40. recount_categories = set()
  41. recount_threads = set()
  42. for thread in batch_delete(sender.thread_set.all(), 50):
  43. recount_categories.add(thread.category_id)
  44. with transaction.atomic():
  45. thread.delete()
  46. for post in batch_delete(sender.post_set.all(), 50):
  47. recount_categories.add(post.category_id)
  48. recount_threads.add(post.thread_id)
  49. with transaction.atomic():
  50. post.delete()
  51. if recount_threads:
  52. changed_threads_qs = Thread.objects.filter(id__in=recount_threads)
  53. for thread in batch_update(changed_threads_qs, 50):
  54. thread.synchronize()
  55. thread.save()
  56. if recount_categories:
  57. for category in Category.objects.filter(id__in=recount_categories):
  58. category.synchronize()
  59. category.save()
  60. @receiver(username_changed)
  61. def update_usernames(sender, **kwargs):
  62. Thread.objects.filter(starter=sender).update(
  63. starter_name=sender.username,
  64. starter_slug=sender.slug
  65. )
  66. Thread.objects.filter(last_poster=sender).update(
  67. last_poster_name=sender.username,
  68. last_poster_slug=sender.slug
  69. )
  70. Post.objects.filter(poster=sender).update(poster_name=sender.username)
  71. Post.objects.filter(last_editor=sender).update(
  72. last_editor_name=sender.username,
  73. last_editor_slug=sender.slug
  74. )
  75. Event.objects.filter(author=sender).update(
  76. author_name=sender.username,
  77. author_slug=sender.slug
  78. )
  79. from django.contrib.auth import get_user_model
  80. from django.db.models.signals import pre_delete
  81. @receiver(pre_delete, sender=get_user_model())
  82. def remove_unparticipated_private_threads(sender, **kwargs):
  83. threads_qs = kwargs['instance'].private_thread_set.all()
  84. for thread in batch_update(threads_qs, 50):
  85. if thread.participants.count() == 1:
  86. with transaction.atomic():
  87. thread.delete()