threads.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. from django.db.transaction import atomic
  2. from django.utils import timezone
  3. from django.utils.translation import ugettext as _
  4. from misago.threads.events import record_event
  5. @atomic
  6. def label_thread(user, thread, label):
  7. if not thread.label_id or thread.label_id != label.pk:
  8. if thread.label_id:
  9. message = _("%(user)s changed thread label to %(label)s.")
  10. else:
  11. message = _("%(user)s set thread label to %(label)s.")
  12. record_event(user, thread, "tag", message, {
  13. 'user': user,
  14. 'label': label.name
  15. })
  16. thread.label = label
  17. thread.save(update_fields=['has_events', 'label'])
  18. return True
  19. else:
  20. return False
  21. @atomic
  22. def unlabel_thread(user, thread):
  23. if thread.label_id:
  24. thread.label = None
  25. message = _("%(user)s removed thread label.")
  26. record_event(user, thread, "tag", message, {'user': user})
  27. thread.save(update_fields=['has_events', 'label'])
  28. return True
  29. else:
  30. return False
  31. @atomic
  32. def pin_thread(user, thread):
  33. if not thread.is_pinned:
  34. thread.is_pinned = True
  35. message = _("%(user)s pinned thread.")
  36. record_event(user, thread, "star", message, {'user': user})
  37. thread.save(update_fields=['has_events', 'is_pinned'])
  38. return True
  39. else:
  40. return False
  41. @atomic
  42. def unpin_thread(user, thread):
  43. if thread.is_pinned:
  44. message = _("%(user)s unpinned thread.")
  45. record_event(user, thread, "circle", message, {'user': user})
  46. thread.is_pinned = False
  47. thread.save(update_fields=['has_events', 'is_pinned'])
  48. return True
  49. else:
  50. return False
  51. @atomic
  52. def move_thread(user, thread, new_forum):
  53. if thread.forum_id != new_forum.pk:
  54. message = _("%(user)s moved thread from %(forum)s.")
  55. record_event(user, thread, "arrow-right", message, {
  56. 'user': user,
  57. 'forum': thread.forum
  58. })
  59. thread.move(new_forum)
  60. thread.save(update_fields=['has_events', 'forum'])
  61. return True
  62. else:
  63. return False
  64. @atomic
  65. def merge_thread(user, thread, other_thread):
  66. message = _("%(user)s merged in %(thread)s.")
  67. record_event(user, thread, "arrow-right", message, {
  68. 'user': user,
  69. 'thread': other_thread.title
  70. })
  71. thread.merge(other_thread)
  72. other_thread.delete()
  73. return True
  74. @atomic
  75. def approve_thread(user, thread):
  76. if thread.is_moderated:
  77. message = _("%(user)s approved thread.")
  78. record_event(user, thread, "check", message, {'user': user})
  79. thread.is_closed = False
  80. thread.first_post.is_moderated = False
  81. thread.first_post.save(update_fields=['is_moderated'])
  82. thread.synchronize()
  83. thread.save(update_fields=['has_events', 'is_moderated'])
  84. return True
  85. else:
  86. return False
  87. @atomic
  88. def open_thread(user, thread):
  89. if thread.is_closed:
  90. message = _("%(user)s opened thread.")
  91. record_event(user, thread, "unlock-alt", message, {'user': user})
  92. thread.is_closed = False
  93. thread.save(update_fields=['has_events', 'is_closed'])
  94. return True
  95. else:
  96. return False
  97. @atomic
  98. def close_thread(user, thread):
  99. if not thread.is_closed:
  100. message = _("%(user)s closed thread.")
  101. record_event(user, thread, "lock", message, {'user': user})
  102. thread.is_closed = True
  103. thread.save(update_fields=['has_events', 'is_closed'])
  104. return True
  105. else:
  106. return False
  107. @atomic
  108. def unhide_thread(user, thread):
  109. if thread.is_hidden:
  110. message = _("%(user)s made thread visible.")
  111. record_event(user, thread, "eye", message, {'user': user})
  112. thread.first_post.is_hidden = False
  113. thread.first_post.save(update_fields=['is_hidden'])
  114. thread.is_hidden = False
  115. thread.save(update_fields=['has_events', 'is_hidden'])
  116. thread.synchronize()
  117. thread.save()
  118. return True
  119. else:
  120. return False
  121. @atomic
  122. def hide_thread(user, thread):
  123. if not thread.is_hidden:
  124. message = _("%(user)s hid thread.")
  125. record_event(user, thread, "eye-slash", message, {'user': user})
  126. thread.first_post.is_hidden = True
  127. thread.first_post.hidden_by = user
  128. thread.first_post.hidden_by_name = user.username
  129. thread.first_post.hidden_by_slug = user.slug
  130. thread.first_post.hidden_on = timezone.now()
  131. thread.first_post.save(update_fields=[
  132. 'is_hidden',
  133. 'hidden_by',
  134. 'hidden_by_name',
  135. 'hidden_by_slug',
  136. 'hidden_on',
  137. ])
  138. thread.is_hidden = True
  139. thread.save(update_fields=['has_events', 'is_hidden'])
  140. return True
  141. else:
  142. return False
  143. @atomic
  144. def delete_thread(user, thread):
  145. thread.delete()
  146. return True