diff --git a/board/admin.py b/board/admin.py index e4f29a8..6ecc685 100644 --- a/board/admin.py +++ b/board/admin.py @@ -1,10 +1,15 @@ -from django import forms from django.contrib import admin -from django.http.response import HttpResponseRedirect -from django.shortcuts import render from django.urls import reverse from django.utils.safestring import mark_safe -from board.models import Ban, Board, Post, RangeBan, ReportReason, ReportRecord +from board.models import ( + Ban, + BanTemplate, + Board, + Post, + RangeBan, + ReportReason, + ReportRecord, +) # # Admin sites @@ -24,10 +29,6 @@ class ReportReasonAdmin(admin.ModelAdmin): pass -class BanFromReportForm(forms.ModelForm): - pass - - @admin.register(ReportRecord) class ReportRecordAdmin(admin.ModelAdmin): ordering = ( @@ -76,3 +77,8 @@ class RangeBanAdmin(admin.ModelAdmin): @admin.register(Ban) class BanAdmin(admin.ModelAdmin): pass + + +@admin.register(BanTemplate) +class BanTemplateAdmin(admin.ModelAdmin): + ordering = ("board__url", "name") diff --git a/board/models.py b/board/models.py index d32b33b..1b53df8 100644 --- a/board/models.py +++ b/board/models.py @@ -311,11 +311,21 @@ class Ban(BanCommon): class BanTemplate(models.Model): + # The name of this template + name = models.CharField(max_length=100) # The reason for this ban ban_reason = models.TextField(blank=False) - # The duration of the ban - duration = models.DurationField() + # The duration of the ban, in days + duration = models.IntegerField(blank=True, null=True) + # The board that this template is for, or none. + board = models.ForeignKey("Board", on_delete=models.CASCADE, null=True, blank=True) def create_ban(self, ip: str) -> Ban: expires = timezone.now() + self.duration return Ban.objects.create(ip=ip, ban_reason=self.ban_reason, expires=expires) + + def __str__(self) -> str: + if self.board: + return f"/{self.board.url}/ - {self.name}" + else: + return self.name diff --git a/board/templates/board/ban_form.html b/board/templates/board/ban_form.html index 918ff12..0d89013 100644 --- a/board/templates/board/ban_form.html +++ b/board/templates/board/ban_form.html @@ -2,7 +2,7 @@ {% load i18n %} {% block content %} -
+ {% csrf_token %} @@ -17,13 +17,28 @@ + + + + + + + + {{form.as_table}} - + - + @@ -35,7 +50,6 @@ {% endblock content %} \ No newline at end of file diff --git a/board/views.py b/board/views.py index de82e65..50eb9e0 100644 --- a/board/views.py +++ b/board/views.py @@ -1,6 +1,7 @@ from typing import Any, Dict from django.conf import settings from django.contrib.auth.mixins import PermissionRequiredMixin +from django.db.models import Q from django.http import Http404, HttpResponseRedirect from django.shortcuts import get_object_or_404 from django.views.generic.base import TemplateView @@ -8,7 +9,7 @@ from django.views.generic.edit import CreateView from django.urls import reverse, reverse_lazy from django.utils import timezone from board.forms import BanForm, PostForm, ReplyForm, ReportForm -from board.models import Ban, Board, Post, Report +from board.models import Ban, BanTemplate, Board, Post, Report from board.utils import get_client_ip, get_ip_bans __all__ = ( @@ -186,6 +187,9 @@ class BanCreateView(PermissionRequiredMixin, CreateView): context["current_bans"] = [ ban for ban in bans if ban.expires is None or ban.expires > now ] + context["templates"] = BanTemplate.objects.filter( + Q(board=self.board) | Q(board=None) + ) return context
IP: {{post.ip}}
{% translate 'Template search' %}:
{% translate 'Template' %} + +
{% translate "Previous bans" %}{% translate "Previous bans" %}: {{previous_bans|length}}
{% translate "Current bans" %}{% translate "Current bans" %}: {{current_bans|length}}