Add ActionSuccessView

ActionSuccessView is a a generic view that indicates that something was
successful, e.g. deleting a post or banning a user. This hopefully
reduces the amount of boilerplate code used for creating success pages
since most of them can derive from this generic view.

The report and delete success views are updated to use this directly.

The ban and modify success views are updated to derive from this class,
with special permissions required.

The post success view is updated to derive from this class, using a
different template.

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2022-07-17 15:08:33 -07:00
parent bfd3dedb09
commit e686c3b235
9 changed files with 78 additions and 112 deletions

View File

@@ -19,6 +19,7 @@ from board.models import Ban, BanTemplate, Board, NewsPost, Post, Report
from board.utils import *
__all__ = (
"ActionSuccessView",
"BanCreateView",
"BanSuccessView",
"BannedView",
@@ -30,10 +31,8 @@ __all__ = (
"PostView",
"PostSuccessView",
"PostDeleteView",
"PostDeleteSuccessView",
"ReplyCreateView",
"ReportView",
"ReportSuccessView",
)
@@ -48,6 +47,18 @@ def can_modify(user):
)
class ActionSuccessView(TemplateView):
template_name = "board/action_success.html"
message = "Action completed."
window_timeout = 0
def get_context_data(self, **kwargs: Any) -> Dict[str, Any]:
context = super().get_context_data(**kwargs)
context["message"] = self.message
context["window_timeout"] = self.window_timeout
return context
class BannedView(TemplateView):
template_name = "board/banned.html"
@@ -156,7 +167,8 @@ class PostCreateView(CreateView):
def get_success_url(self) -> str:
query = QueryDict(mutable=True)
query["next"] = self.get_form().instance.get_absolute_url()
query["next"] = self.get_form().instance.get_absolute_url().split("#")[0]
print(query["next"])
return reverse("board:post_success") + "?" + query.urlencode()
@@ -181,8 +193,7 @@ class PostModifyView(PermissionRequiredMixin, edit.UpdateView):
return kwargs
class PostModifySuccessView(PermissionRequiredMixin, TemplateView):
template_name = "board/post_modify_success.html"
class PostModifySuccessView(PermissionRequiredMixin, ActionSuccessView):
raise_exception = True
def has_permission(self) -> bool:
@@ -190,7 +201,6 @@ class PostModifySuccessView(PermissionRequiredMixin, TemplateView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["window_timeout"] = settings.BAN_WINDOW_CLOSE_TIMEOUT
context["can_modify"] = self.has_permission()
return context
@@ -248,13 +258,9 @@ class PostView(TemplateView):
return super(PostView, self).dispatch(request, *args, **kwargs)
class PostSuccessView(TemplateView):
class PostSuccessView(ActionSuccessView):
template_name = "board/post_success.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["window_timeout"] = settings.POST_WINDOW_CLOSE_TIMEOUT
return context
window_timeout = settings.POST_WINDOW_CLOSE_TIMEOUT
class PostDeleteView(PermissionRequiredMixin, edit.DeleteView):
@@ -282,15 +288,6 @@ class PostDeleteView(PermissionRequiredMixin, edit.DeleteView):
return HttpResponseRedirect(success_url)
class PostDeleteSuccessView(TemplateView):
template_name = "board/post_delete_success.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["window_timeout"] = settings.BAN_WINDOW_CLOSE_TIMEOUT
return context
class ReportView(CreateView):
model = Report
form_class = ReportForm
@@ -312,15 +309,6 @@ class ReportView(CreateView):
return kwargs
class ReportSuccessView(TemplateView):
template_name = "board/report_success.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["window_timeout"] = settings.REPORT_WINDOW_CLOSE_TIMEOUT
return context
class BanCreateView(PermissionRequiredMixin, edit.CreateView):
model = Ban
form_class = BanForm
@@ -364,16 +352,10 @@ class BanCreateView(PermissionRequiredMixin, edit.CreateView):
return super().dispatch(request, *args, **kwargs)
class BanSuccessView(PermissionRequiredMixin, TemplateView):
class BanSuccessView(PermissionRequiredMixin, ActionSuccessView):
permission_required = "ban.create"
template_name = "board/ban_success.html"
raise_exception = True
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["window_timeout"] = settings.BAN_WINDOW_CLOSE_TIMEOUT
return context
class NewsListView(list.ListView):
model = NewsPost