signals.py 3.2 KB

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