Add configurable report and ban window timeouts.

On the success page for bans and reports, the window can now be
configured to close after N seconds if desired.

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2022-06-24 16:21:41 -07:00
parent 412045e015
commit 36f73a2d31
5 changed files with 40 additions and 23 deletions

View File

@@ -5,7 +5,8 @@
{# Body #} {# Body #}
{% block content %} {% block content %}
<div class="row" id="message"> <div class="row" id="message">
{% translate "A ban has been created. This window will close in 1 second." %} {# We do not use pluralize filter for "seconds" because it's a pain to get it to translate. #}
{% blocktranslate %}A ban has been created. This window will close in {{window_timeout}} second(s).{% endblocktranslate %}
</div> </div>
<script> <script>
@@ -23,7 +24,7 @@ setTimeout(function() {
} else { } else {
window.close(); window.close();
} }
}, 1000); }, 1000 * {{window_timeout}});
</script> </script>
{% endblock %} {% endblock %}

View File

@@ -5,7 +5,8 @@
{# Body #} {# Body #}
{% block content %} {% block content %}
<div class="row" id="message"> <div class="row" id="message">
{% translate "Post reported. This window will close in 1 second." %} {# We do not use pluralize filter for "seconds" because it's a pain to get it to translate. #}
{% blocktranslate %}Post reported. This window will close in {{window_timeout}} second(s).{% endblocktranslate %}
</div> </div>
<script> <script>
@@ -23,7 +24,7 @@ setTimeout(function() {
} else { } else {
window.close(); window.close();
} }
}, 1000); }, 1000 * {{window_timeout}});
</script> </script>
{% endblock %} {% endblock %}

View File

@@ -1,32 +1,22 @@
from django.urls import path from django.urls import path
from django.conf import settings from django.conf import settings
from django.conf.urls.static import static from django.conf.urls.static import static
from django.views.generic.base import TemplateView
from board.views import * from board.views import *
app_name = "board" app_name = "board"
urlpatterns = [ urlpatterns = [
# Board views
path("<slug:url>/", BoardView.as_view(), name="board_detail"), path("<slug:url>/", BoardView.as_view(), name="board_detail"),
path("<slug:url>/page/<int:page>/", BoardView.as_view(), name="board_detail"), path("<slug:url>/page/<int:page>/", BoardView.as_view(), name="board_detail"),
path("<slug:url>/post/<int:id>/", PostView.as_view(), name="post_detail"), path("<slug:url>/post/<int:id>/", PostView.as_view(), name="post_detail"),
# Reports
path("report/<slug:url>/<int:id>/", ReportView.as_view(), name="report_form"), path("report/<slug:url>/<int:id>/", ReportView.as_view(), name="report_form"),
path( path("report/success/", ReportSuccessView.as_view(), name="report_success"),
"report/success/", # Bans
TemplateView.as_view(template_name="board/report_success.html"),
name="report_success",
),
path("ban/<slug:url>/<int:id>/", BanCreateView.as_view(), name="ban_create"), path("ban/<slug:url>/<int:id>/", BanCreateView.as_view(), name="ban_create"),
path( path("ban/success/", BanSuccessView.as_view(), name="ban_success"),
"ban/success/", path("banned", BannedView.as_view(), name="banned"),
BanSuccessView.as_view(),
name="ban_success",
),
path(
"banned",
BannedView.as_view(),
name="banned",
),
] ]
# TODO - make this conditional so we can serve images up with whatever server we want # TODO - make this conditional so we can serve images up with whatever server we want
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@@ -19,6 +19,7 @@ __all__ = (
"BoardView", "BoardView",
"PostView", "PostView",
"ReportView", "ReportView",
"ReportSuccessView",
) )
@@ -145,9 +146,6 @@ class ReportView(CreatePostView):
form_class = ReportForm form_class = ReportForm
success_url = reverse_lazy("board:report_success") success_url = reverse_lazy("board:report_success")
def get_context_data(self, **kwargs):
return super(ReportView, self).get_context_data(**kwargs)
@property @property
def board_url(self) -> str: def board_url(self) -> str:
return self.kwargs["url"] return self.kwargs["url"]
@@ -164,6 +162,15 @@ class ReportView(CreatePostView):
return kwargs 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, CreateView): class BanCreateView(PermissionRequiredMixin, CreateView):
model = Ban model = Ban
form_class = BanForm form_class = BanForm
@@ -209,3 +216,8 @@ class BanCreateView(PermissionRequiredMixin, CreateView):
class BanSuccessView(PermissionRequiredMixin, TemplateView): class BanSuccessView(PermissionRequiredMixin, TemplateView):
permission_required = "ban.create" permission_required = "ban.create"
template_name = "board/ban_success.html" template_name = "board/ban_success.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["window_timeout"] = settings.BAN_WINDOW_CLOSE_TIMEOUT
return context

View File

@@ -137,13 +137,26 @@ MEDIA_ROOT = "media/"
# Media URL - the URL where media is served from # Media URL - the URL where media is served from
MEDIA_URL = "media/" MEDIA_URL = "media/"
# Thumbnail size in pixels.
THUMB_SIZE = (200, 200) THUMB_SIZE = (200, 200)
# Max upload size in bytes.
MAX_UPLOAD_SIZE = 25 * 1024**2 MAX_UPLOAD_SIZE = 25 * 1024**2
# Whether to use HCAPTCHA or not.
USE_HCAPTCHA = False USE_HCAPTCHA = False
if USE_HCAPTCHA: if USE_HCAPTCHA:
INSTALLED_APPS += ["hcaptcha"] INSTALLED_APPS += ["hcaptcha"]
HCAPTCHA_SITEKEY = env("HCAPTCHA_SITEKEY") HCAPTCHA_SITEKEY = env("HCAPTCHA_SITEKEY")
HCAPTCHA_SECRET = env("HCAPTCHA_SECRET") HCAPTCHA_SECRET = env("HCAPTCHA_SECRET")
# How many seconds to wait before closing the report window after a report is
# created.
# By default, wait 5 seconds. This should give users plenty of time to read it.
REPORT_WINDOW_CLOSE_TIMEOUT = 5
# How many seconds to wait before closing the ban window after a ban is created.
# By default, wait 0 seconds and close immediately. It is assumed that the ban
# is created successfully, and if an error occurs, the window won't close anyway.
BAN_WINDOW_CLOSE_TIMEOUT = 0