# HG changeset patch # User neko259 # Date 2014-01-20 15:36:51 # Node ID 39f0b88d8d790a70eeddb3b919cc8adea7224187 # Parent 37f54a4aa11d833deb1bc93f71a889c7a29c5369 Moved delete view to class-based views 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):