post.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. from django.contrib import messages
  2. from django.db.transaction import atomic
  3. from django.http import JsonResponse
  4. from django.shortcuts import redirect, render
  5. from django.utils.translation import ugettext as _
  6. from misago.acl import add_acl
  7. from misago.threads import permissions, moderation, goto
  8. from misago.threads.permissions import exclude_invisible_posts
  9. from misago.threads.views.generic.base import ViewBase
  10. __all__ = ['QuotePostView']
  11. class PostView(ViewBase):
  12. is_atomic = True
  13. require_post = True
  14. def dispatch(self, request, *args, **kwargs):
  15. if request.method != "POST" and self.require_post:
  16. response = render(request, 'misago/errorpages/wrong_way.html')
  17. response.status_code = 405
  18. return response
  19. post = None
  20. response = None
  21. if self.is_atomic:
  22. with atomic():
  23. post = self.get_post(request, True, **kwargs)
  24. response = self.real_dispatch(request, post)
  25. else:
  26. post = self.get_post(request, **kwargs)
  27. response = self.real_dispatch(request, post)
  28. if response:
  29. return response
  30. else:
  31. return self.redirect_to_post(request.user, post)
  32. def real_dispatch(self, request, post):
  33. raise NotImplementedError(
  34. "post views have to override real_dispatch method")
  35. def redirect_to_post(self, user, post):
  36. return redirect(goto.post(user, post.thread, post))
  37. class QuotePostView(PostView):
  38. is_atomic = False
  39. require_post = False
  40. def real_dispatch(self, request, post):
  41. quote_tpl = u'[quote="%s, post:%s, topic:%s"]\n%s\n[/quote]'
  42. formats = (post.poster_name, post.pk, post.thread_id, post.original)
  43. return JsonResponse({
  44. 'quote': quote_tpl % formats
  45. })
  46. class UnhidePostView(PostView):
  47. def real_dispatch(self, request, post):
  48. permissions.allow_unhide_post(request.user, post)
  49. moderation.unhide_post(request.user, post)
  50. messages.success(request, _("Post has been made visible."))
  51. class HidePostView(PostView):
  52. def real_dispatch(self, request, post):
  53. permissions.allow_hide_post(request.user, post)
  54. moderation.hide_post(request.user, post)
  55. messages.success(request, _("Post has been hidden."))
  56. class DeletePostView(PostView):
  57. def real_dispatch(self, request, post):
  58. post_id = post.id
  59. permissions.allow_delete_post(request.user, post)
  60. moderation.delete_post(request.user, post)
  61. post.thread.synchronize()
  62. post.thread.save()
  63. post.forum.synchronize()
  64. post.forum.save()
  65. posts_queryset = exclude_invisible_posts(post.thread.post_set,
  66. request.user,
  67. post.forum)
  68. posts_queryset = posts_queryset.select_related('thread', 'forum')
  69. if post_id < post.thread.last_post_id:
  70. target_post = posts_queryset.order_by('id').filter(id__gt=post_id)
  71. else:
  72. target_post = posts_queryset.order_by('-id').filter(id__lt=post_id)
  73. target_post = target_post[:1][0]
  74. target_post.thread.forum = target_post.forum
  75. add_acl(request.user, target_post.forum)
  76. add_acl(request.user, target_post.thread)
  77. add_acl(request.user, target_post)
  78. messages.success(request, _("Post has been deleted."))
  79. return self.redirect_to_post(request.user, target_post)