diff --git a/boards/models/post.py b/boards/models/post.py
--- a/boards/models/post.py
+++ b/boards/models/post.py
@@ -94,13 +94,11 @@ class PostManager(models.Manager):
"""
Delete post and update or delete its thread
"""
-
+
thread = post.thread_new
- if thread.get_opening_post() == self:
- thread.replies.delete()
-
- thread.delete()
+ if post.is_opening():
+ thread.delete_with_posts()
else:
thread.last_edit_time = timezone.now()
thread.save()
@@ -384,7 +382,7 @@ class Thread(models.Model):
return self.get_replies()[0]
def __unicode__(self):
- return str(self.get_replies()[0].id)
+ return str(self.id)
def get_pub_time(self):
"""
diff --git a/boards/templates/boards/post.html b/boards/templates/boards/post.html
--- a/boards/templates/boards/post.html
+++ b/boards/templates/boards/post.html
@@ -38,7 +38,7 @@
{% if thread.archived %}
— [{{ thread.bump_time }}]
{% endif %}
- {% if not truncated %}
+ {% if not truncated and not thread.archived%}
[>>]
{% endif %}
diff --git a/boards/urls.py b/boards/urls.py
--- a/boards/urls.py
+++ b/boards/urls.py
@@ -4,6 +4,7 @@ from boards.rss import AllThreadsFeed, T
from boards.views import api, tag_threads, all_threads, archived_threads, \
login, settings, all_tags
from boards.views.authors import AuthorsView
+from boards.views.delete_post import DeletePostView
js_info_dict = {
'packages': ('boards',),
@@ -49,7 +50,8 @@ urlpatterns = patterns('',
url(r'^captcha/', include('captcha.urls')),
url(r'^jump/(?P\w+)/$', views.jump_to_post, name='jumper'),
url(r'^authors/$', AuthorsView.as_view(), name='authors'),
- url(r'^delete/(?P\w+)/$', views.delete, name='delete'),
+ url(r'^delete/(?P\w+)/$', DeletePostView.as_view(),
+ name='delete'),
url(r'^ban/(?P\w+)/$', views.ban, name='ban'),
url(r'^banned/$', views.banned.BannedView.as_view(), name='banned'),
diff --git a/boards/views/delete_post.py b/boards/views/delete_post.py
new file mode 100644
--- /dev/null
+++ b/boards/views/delete_post.py
@@ -0,0 +1,25 @@
+from django.shortcuts import redirect, get_object_or_404
+from django.db import transaction
+
+from boards.views.base import BaseBoardView
+from boards.views.redirect_next_mixin import RedirectNextMixin
+from boards.models import Post
+
+class DeletePostView(BaseBoardView, RedirectNextMixin):
+
+ @transaction.atomic
+ def get(self, request, post_id):
+ user = self._get_user(request)
+ post = get_object_or_404(Post, id=post_id)
+
+ opening_post = post.is_opening()
+
+ if user.is_moderator():
+ # TODO Show confirmation page before deletion
+ Post.objects.delete_post(post)
+
+ if not opening_post:
+ thread = post.thread_new
+ return redirect('thread', post_id=thread.get_opening_post().id)
+ else:
+ return self.redirect_to_next(request)
diff --git a/boards/views/redirect_next_mixin.py b/boards/views/redirect_next_mixin.py
new file mode 100644
--- /dev/null
+++ b/boards/views/redirect_next_mixin.py
@@ -0,0 +1,17 @@
+from django.shortcuts import redirect
+from django.http import HttpResponseRedirect
+
+class RedirectNextMixin:
+
+ def redirect_to_next(self, request):
+ """
+ If a 'next' parameter was specified, redirect to the next page. This
+ is used when the user is required to return to some page after the
+ current view has finished its work.
+ """
+
+ if 'next' in request.GET:
+ next_page = request.GET['next']
+ return HttpResponseRedirect(next_page)
+ else:
+ return redirect('index')
diff --git a/boards/views/settings.py b/boards/views/settings.py
--- a/boards/views/settings.py
+++ b/boards/views/settings.py
@@ -3,6 +3,7 @@ from django.shortcuts import render, red
from boards.views.base import BaseBoardView, PARAMETER_FORM
from boards.forms import SettingsForm, ModeratorSettingsForm, PlainErrorList
+from boards.views import SETTING_MODERATE
class SettingsView(BaseBoardView):