posts.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. from django.db import transaction
  2. from django.utils import timezone
  3. from django.utils.translation import gettext as _
  4. from .exceptions import ModerationError
  5. __all__ = [
  6. "approve_post",
  7. "protect_post",
  8. "unprotect_post",
  9. "unhide_post",
  10. "hide_post",
  11. "delete_post",
  12. ]
  13. def approve_post(user, post):
  14. if not post.is_unapproved:
  15. return False
  16. post.is_unapproved = False
  17. post.save(update_fields=["is_unapproved"])
  18. return True
  19. def protect_post(user, post):
  20. if post.is_protected:
  21. return False
  22. post.is_protected = True
  23. post.save(update_fields=["is_protected"])
  24. if post.is_best_answer:
  25. post.thread.best_answer_is_protected = True
  26. post.thread.save(update_fields=["best_answer_is_protected"])
  27. return True
  28. def unprotect_post(user, post):
  29. if not post.is_protected:
  30. return False
  31. post.is_protected = False
  32. post.save(update_fields=["is_protected"])
  33. if post.is_best_answer:
  34. post.thread.best_answer_is_protected = False
  35. post.thread.save(update_fields=["best_answer_is_protected"])
  36. return True
  37. def unhide_post(user, post):
  38. if post.is_first_post:
  39. raise ModerationError(
  40. _("You can't make original post visible without revealing thread.")
  41. )
  42. if not post.is_hidden:
  43. return False
  44. post.is_hidden = False
  45. post.save(update_fields=["is_hidden"])
  46. return True
  47. def hide_post(user, post):
  48. if post.is_first_post:
  49. raise ModerationError(_("You can't hide original post without hiding thread."))
  50. if post.is_hidden:
  51. return False
  52. post.is_hidden = True
  53. post.hidden_by = user
  54. post.hidden_by_name = user.username
  55. post.hidden_by_slug = user.slug
  56. post.hidden_on = timezone.now()
  57. post.save(
  58. update_fields=[
  59. "is_hidden",
  60. "hidden_by",
  61. "hidden_by_name",
  62. "hidden_by_slug",
  63. "hidden_on",
  64. ]
  65. )
  66. return True
  67. @transaction.atomic
  68. def delete_post(user, post):
  69. if post.is_first_post:
  70. raise ModerationError(
  71. _("You can't delete original post without deleting thread.")
  72. )
  73. post.delete()
  74. return True