post.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. is_atomic = False
  48. def real_dispatch(self, request, post):
  49. permissions.allow_unhide_post(request.user, post)
  50. moderation.unhide_post(request.user, post)
  51. messages.success(request, _("Post has been made visible."))
  52. class HidePostView(PostView):
  53. is_atomic = False
  54. def real_dispatch(self, request, post):
  55. permissions.allow_hide_post(request.user, post)
  56. moderation.hide_post(request.user, post)
  57. messages.success(request, _("Post has been hidden."))
  58. class DeletePostView(PostView):
  59. def real_dispatch(self, request, post):
  60. post_id = post.id
  61. permissions.allow_delete_post(request.user, post)
  62. moderation.delete_post(request.user, post)
  63. post.thread.synchronize()
  64. post.thread.save()
  65. post.forum.synchronize()
  66. post.forum.save()
  67. posts_queryset = exclude_invisible_posts(post.thread.post_set,
  68. request.user,
  69. post.forum)
  70. posts_queryset = posts_queryset.select_related('thread', 'forum')
  71. if post_id < post.thread.last_post_id:
  72. target_post = posts_queryset.order_by('id').filter(id__gt=post_id)
  73. else:
  74. target_post = posts_queryset.order_by('-id').filter(id__lt=post_id)
  75. target_post = target_post[:1][0]
  76. target_post.thread.forum = target_post.forum
  77. add_acl(request.user, target_post.forum)
  78. add_acl(request.user, target_post.thread)
  79. add_acl(request.user, target_post)
  80. messages.success(request, _("Post has been deleted."))
  81. return self.redirect_to_post(request.user, target_post)