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.exceptions import ACLError403, ACLError404
  7. from misago.apps.errors import error403, error404
  8. from misago.messages import Message
  9. from misago.models import Forum, Thread, Post
  10. from misago.utils.pagination import make_pagination
  11. from misago.apps.threads.views.base import BaseView
  12. class DeleteView(BaseView):
  13. def fetch_thread(self, kwargs):
  14. self.thread = Thread.objects.get(pk=kwargs['thread'])
  15. self.forum = self.thread.forum
  16. self.request.acl.forums.allow_forum_view(self.forum)
  17. self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
  18. if self.mode in ['tread_delete', 'hide_thread']:
  19. self.request.acl.threads.allow_delete_thread(
  20. self.request.user,
  21. self.forum,
  22. self.thread,
  23. self.thread.start_post,
  24. self.mode == 'delete_thread')
  25. # Assert we are not user trying to delete thread with replies
  26. acl = self.request.acl.threads.get_role(self.thread.forum_id)
  27. if not acl['can_delete_threads']:
  28. if self.thread.post_set.exclude(user_id=self.request.user.id).count() > 0:
  29. raise ACLError403(_("Somebody has already replied to this thread. You cannot delete it."))
  30. def fetch_post(self, kwargs):
  31. self.post = self.thread.post_set.get(pk=kwargs['post'])
  32. if self.post.pk == self.thread.start_post_id:
  33. raise Post.DoesNotExist()
  34. self.request.acl.threads.allow_post_view(self.request.user, self.thread, self.post)
  35. self.request.acl.threads.allow_delete_post(
  36. self.request.user,
  37. self.forum,
  38. self.thread,
  39. self.post,
  40. self.mode == 'delete_post')
  41. acl = self.request.acl.threads.get_role(self.thread.forum_id)
  42. if not acl['can_delete_posts'] and self.thread.post_set.filter(id__gt=self.post.pk).count() > 0:
  43. raise ACLError403(_("Somebody has already replied to this post, you cannot delete it."))
  44. def __call__(self, request, **kwargs):
  45. self.request = request
  46. self.mode = kwargs['mode']
  47. try:
  48. if not request.user.is_authenticated():
  49. raise ACLError403(_("Guest, you have to sign-in in order to be able to delete replies."))
  50. self.fetch_thread(kwargs)
  51. if self.mode in ['hide_post', 'delete_post']:
  52. self.fetch_post(kwargs)
  53. except (Thread.DoesNotExist, Post.DoesNotExist):
  54. return error404(self.request)
  55. except ACLError403 as e:
  56. return error403(request, e.message)
  57. except ACLError404 as e:
  58. return error404(request, e.message)
  59. if self.mode == 'delete_thread':
  60. self.thread.delete()
  61. self.forum.sync()
  62. self.forum.save(force_update=True)
  63. request.messages.set_flash(Message(_('Thread "%(thread)s" has been deleted.') % {'thread': self.thread.name}), 'success', 'threads')
  64. return redirect(reverse('forum', kwargs={'forum': self.thread.forum.pk, 'slug': self.thread.forum.slug}))
  65. if self.mode == 'hide_thread':
  66. self.thread.start_post.deleted = True
  67. self.thread.start_post.save(force_update=True)
  68. self.thread.last_post.set_checkpoint(request, 'deleted')
  69. self.thread.last_post.save(force_update=True)
  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)