123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- from django.core.urlresolvers import reverse
- from django.shortcuts import redirect
- from django.template import RequestContext
- from django.utils import timezone
- from django.utils.translation import ugettext as _
- from misago.acl.exceptions import ACLError403, ACLError404
- from misago.apps.errors import error403, error404
- from misago.messages import Message
- from misago.models import Forum, Thread, Post
- from misago.utils.pagination import make_pagination
- from misago.apps.threads.views.base import BaseView
- class DeleteView(BaseView):
- def fetch_thread(self, kwargs):
- self.thread = Thread.objects.get(pk=kwargs['thread'])
- self.forum = self.thread.forum
- self.request.acl.forums.allow_forum_view(self.forum)
- self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
- if self.mode in ['tread_delete', 'hide_thread']:
- self.request.acl.threads.allow_delete_thread(
- self.request.user,
- self.forum,
- self.thread,
- self.thread.start_post,
- self.mode == 'delete_thread')
- # Assert we are not user trying to delete thread with replies
- acl = self.request.acl.threads.get_role(self.thread.forum_id)
- if not acl['can_delete_threads']:
- if self.thread.post_set.exclude(user_id=self.request.user.id).count() > 0:
- raise ACLError403(_("Somebody has already replied to this thread. You cannot delete it."))
- def fetch_post(self, kwargs):
- self.post = self.thread.post_set.get(pk=kwargs['post'])
- if self.post.pk == self.thread.start_post_id:
- raise Post.DoesNotExist()
- self.request.acl.threads.allow_post_view(self.request.user, self.thread, self.post)
- self.request.acl.threads.allow_delete_post(
- self.request.user,
- self.forum,
- self.thread,
- self.post,
- self.mode == 'delete_post')
- acl = self.request.acl.threads.get_role(self.thread.forum_id)
- if not acl['can_delete_posts'] and self.thread.post_set.filter(id__gt=self.post.pk).count() > 0:
- raise ACLError403(_("Somebody has already replied to this post, you cannot delete it."))
- def __call__(self, request, **kwargs):
- self.request = request
- self.mode = kwargs['mode']
- try:
- if not request.user.is_authenticated():
- raise ACLError403(_("Guest, you have to sign-in in order to be able to delete replies."))
- self.fetch_thread(kwargs)
- if self.mode in ['hide_post', 'delete_post']:
- self.fetch_post(kwargs)
- except (Thread.DoesNotExist, Post.DoesNotExist):
- return error404(self.request)
- except ACLError403 as e:
- return error403(request, e.message)
- except ACLError404 as e:
- return error404(request, e.message)
- if self.mode == 'delete_thread':
- self.thread.delete()
- self.forum.sync()
- self.forum.save(force_update=True)
- request.messages.set_flash(Message(_('Thread "%(thread)s" has been deleted.') % {'thread': self.thread.name}), 'success', 'threads')
- return redirect(reverse('forum', kwargs={'forum': self.thread.forum.pk, 'slug': self.thread.forum.slug}))
- if self.mode == 'hide_thread':
- self.thread.start_post.deleted = True
- self.thread.start_post.save(force_update=True)
- self.thread.last_post.set_checkpoint(request, 'deleted')
- self.thread.last_post.save(force_update=True)
- self.thread.sync()
- self.thread.save(force_update=True)
- self.forum.sync()
- self.forum.save(force_update=True)
- request.messages.set_flash(Message(_('Thread "%(thread)s" has been deleted.') % {'thread': self.thread.name}), 'success', 'threads')
- if request.acl.threads.can_see_deleted_threads(self.thread.forum):
- return redirect(reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}))
- return redirect(reverse('forum', kwargs={'forum': self.thread.forum.pk, 'slug': self.thread.forum.slug}))
- if self.mode == 'delete_post':
- self.post.delete()
- self.thread.sync()
- self.thread.save(force_update=True)
- self.forum.sync()
- self.forum.save(force_update=True)
- request.messages.set_flash(Message(_("Selected Reply has been deleted.")), 'success', 'threads')
- return redirect(reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}))
- if self.mode == 'hide_post':
- self.post.deleted = True
- self.post.edit_date = timezone.now()
- self.post.edit_user = request.user
- self.post.edit_user_name = request.user.username
- self.post.edit_user_slug = request.user.username_slug
- self.post.save(force_update=True)
- self.thread.sync()
- self.thread.save(force_update=True)
- self.forum.sync()
- self.forum.save(force_update=True)
- request.messages.set_flash(Message(_("Selected Reply has been deleted.")), 'success', 'threads_%s' % self.post.pk)
- return self.redirect_to_post(self.post)
|