delete.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. from django.core.urlresolvers import reverse
  2. from django.shortcuts import redirect
  3. from django.template import RequestContext
  4. from django.utils import timezone
  5. from django.utils.translation import ugettext as _
  6. from misago.acl.utils import ACLError403, ACLError404
  7. from misago.forums.models import Forum
  8. from misago.messages import Message
  9. from misago.threads.models import Thread, Post
  10. from misago.threads.views.base import BaseView
  11. from misago.views import error403, error404
  12. from misago.utils import make_pagination
  13. class DeleteView(BaseView):
  14. def fetch_thread(self, kwargs):
  15. self.thread = Thread.objects.get(pk=kwargs['thread'])
  16. self.forum = self.thread.forum
  17. self.request.acl.forums.allow_forum_view(self.forum)
  18. self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
  19. if self.mode in ['tread_delete', 'hide_thread']:
  20. self.request.acl.threads.allow_delete_thread(
  21. self.request.user,
  22. self.forum,
  23. self.thread,
  24. self.thread.start_post,
  25. self.mode == 'delete_thread')
  26. # Assert we are not user trying to delete thread with replies
  27. acl = self.request.acl.threads.get_role(self.thread.forum_id)
  28. if not acl['can_delete_threads']:
  29. if self.thread.post_set.exclude(user_id=self.request.user.id).count() > 0:
  30. raise ACLError403(_("Somebody has already replied to this thread. You cannot delete it."))
  31. def fetch_post(self, kwargs):
  32. self.post = self.thread.post_set.get(pk=kwargs['post'])
  33. if self.post.pk == self.thread.start_post_id:
  34. raise Post.DoesNotExist()
  35. self.request.acl.threads.allow_post_view(self.request.user, self.thread, self.post)
  36. self.request.acl.threads.allow_delete_post(
  37. self.request.user,
  38. self.forum,
  39. self.thread,
  40. self.post,
  41. self.mode == 'delete_post')
  42. acl = self.request.acl.threads.get_role(self.thread.forum_id)
  43. if not acl['can_delete_posts'] and self.thread.post_set.filter(id__gt=self.post.pk).count() > 0:
  44. raise ACLError403(_("Somebody has already replied to this post, you cannot delete it."))
  45. def __call__(self, request, **kwargs):
  46. self.request = request
  47. self.mode = kwargs['mode']
  48. try:
  49. if not request.user.is_authenticated():
  50. raise ACLError403(_("Guest, you have to sign-in in order to be able to delete replies."))
  51. self.fetch_thread(kwargs)
  52. if self.mode in ['hide_post', 'delete_post']:
  53. self.fetch_post(kwargs)
  54. except (Thread.DoesNotExist, Post.DoesNotExist):
  55. return error404(self.request)
  56. except ACLError403 as e:
  57. return error403(request, e.message)
  58. except ACLError404 as e:
  59. return error404(request, e.message)
  60. if self.mode == 'delete_thread':
  61. self.thread.delete()
  62. self.forum.sync()
  63. self.forum.save(force_update=True)
  64. request.messages.set_flash(Message(_('Thread "%(thread)s" has been deleted.') % {'thread': self.thread.name}), 'success', 'threads')
  65. return redirect(reverse('forum', kwargs={'forum': self.thread.forum.pk, 'slug': self.thread.forum.slug}))
  66. if self.mode == 'hide_thread':
  67. self.thread.start_post.deleted = True
  68. self.thread.start_post.save(force_update=True)
  69. self.thread.last_post.set_checkpoint(request, 'deleted')
  70. self.thread.sync()
  71. self.thread.save(force_update=True)
  72. self.forum.sync()
  73. self.forum.save(force_update=True)
  74. request.messages.set_flash(Message(_('Thread "%(thread)s" has been deleted.') % {'thread': self.thread.name}), 'success', 'threads')
  75. if request.acl.threads.can_see_deleted_threads(self.thread.forum):
  76. return redirect(reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}))
  77. return redirect(reverse('forum', kwargs={'forum': self.thread.forum.pk, 'slug': self.thread.forum.slug}))
  78. if self.mode == 'delete_post':
  79. self.post.delete()
  80. self.thread.sync()
  81. self.thread.save(force_update=True)
  82. self.forum.sync()
  83. self.forum.save(force_update=True)
  84. request.messages.set_flash(Message(_("Selected Reply has been deleted.")), 'success', 'threads')
  85. return redirect(reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}))
  86. if self.mode == 'hide_post':
  87. self.post.deleted = True
  88. self.post.edit_date = timezone.now()
  89. self.post.edit_user = request.user
  90. self.post.edit_user_name = request.user.username
  91. self.post.edit_user_slug = request.user.username_slug
  92. self.post.save(force_update=True)
  93. self.thread.sync()
  94. self.thread.save(force_update=True)
  95. self.forum.sync()
  96. self.forum.save(force_update=True)
  97. request.messages.set_flash(Message(_("Selected Reply has been deleted.")), 'success', 'threads_%s' % self.post.pk)
  98. return self.redirect_to_post(self.post)