signals.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import django.dispatch
  2. from django.dispatch import receiver
  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
  6. move_thread = django.dispatch.Signal()
  7. delete_thread = django.dispatch.Signal()
  8. """
  9. Signal handlers
  10. """
  11. from misago.forums.signals import delete_forum_content, move_forum_content
  12. @receiver(delete_forum_content)
  13. def delete_forum_threads(sender, **kwargs):
  14. sender.thread_set.all().delete()
  15. sender.post_set.all().delete()
  16. @receiver(move_forum_content)
  17. def move_forum_threads(sender, **kwargs):
  18. new_forum = kwargs['new_forum']
  19. Thread.objects.filter(forum=sender).update(forum=new_forum)
  20. Post.objects.filter(forum=sender).update(forum=new_forum)
  21. from misago.users.signals import delete_user_content, username_changed
  22. @receiver(delete_user_content)
  23. def delete_user_threads(sender, **kwargs):
  24. recount_forums = set([])
  25. recount_threads = set([])
  26. for thread in batch_delete(sender.thread_set.all(), 50):
  27. recount_forums.add(thread.forum_id)
  28. thread.delete()
  29. for post in batch_delete(sender.post_set.all(), 50):
  30. recount_forums.add(post.forum_id)
  31. recount_threads.add(post.thread_id)
  32. post.delete()
  33. if recount_threads:
  34. changed_threads_qs = Thread.objects.filter(id__in=recount_threads)
  35. for thread in batch_update(changed_threads_qs, 50):
  36. thread.recount()
  37. thread.save()
  38. if recount_forums:
  39. for forum in Forum.objects.filter(id__in=recount_forums):
  40. forum.recount()
  41. forum.save()
  42. @receiver(username_changed)
  43. def update_usernames(sender, **kwargs):
  44. Thread.objects.filter(starter=sender).update(
  45. starter_name=sender.username,
  46. starter_slug=sender.slug)
  47. Thread.objects.filter(last_poster=sender).update(
  48. last_poster_name=sender.username,
  49. last_poster_slug=sender.slug)
  50. Post.objects.filter(poster=sender).update(poster_name=sender.username)
  51. Post.objects.filter(last_editor=sender).update(
  52. last_editor_name=sender.username,
  53. last_editor_slug=sender.slug)