Add thread pruning for threads that pass the maximum page threshhold

Each board is allowed a number of threads per page, and a maximum number
of pages (default 10 for both). If a thread falls off the last page, it
is deleted.

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2022-05-06 22:00:54 -07:00
parent e9585544d5
commit 27045c11c2
2 changed files with 24 additions and 14 deletions

View File

@@ -39,21 +39,30 @@ class Board(models.Model):
url = models.CharField(max_length=255, null=False, blank=False, unique=True) url = models.CharField(max_length=255, null=False, blank=False, unique=True)
# Human-readable name for the board # Human-readable name for the board
name = models.CharField(max_length=255, null=False, blank=False) name = models.CharField(max_length=255, null=False, blank=False)
# Max pages
max_pages = models.IntegerField(default=10)
# Threads per page
threads_per_page = models.IntegerField(default=10)
@property @property
def threads(self): def threads(self):
return Post.objects.filter(board=self, op=None) return Post.objects.filter(board=self, op=None)
@property
def max_threads(self):
return self.max_pages * self.threads_per_page
def prune_threads(self):
to_remove = self.threads.order_by("-last_bump")[self.max_threads :]
for thread in to_remove:
thread.delete()
class Post(models.Model): class Post(models.Model):
# Board that this post was made on # Board that this post was made on
board = models.ForeignKey("Board", on_delete=models.CASCADE) board = models.ForeignKey("Board", on_delete=models.CASCADE)
# Thread that this is a part of # Thread that this is a part of
op = models.ForeignKey( op = models.ForeignKey(
"self", null=True, on_delete=models.CASCADE, related_name="all_replies"
)
# Post that this is replying to
reply = models.ForeignKey(
"self", null=True, on_delete=models.CASCADE, related_name="replies" "self", null=True, on_delete=models.CASCADE, related_name="replies"
) )
# User's supplied name for this post # User's supplied name for this post
@@ -139,9 +148,14 @@ class Post(models.Model):
@receiver(signals.post_save, sender=Post) @receiver(signals.post_save, sender=Post)
def post_created(sender, instance, created, **kwargs): def post_created(sender, instance, created, **kwargs):
if created and instance.op: if created:
instance.op.last_bump = timezone.now() if instance.op:
instance.op.save() # Update the bump
instance.op.last_bump = timezone.now()
instance.op.save()
else:
# Prune threads for the board
instance.board.prune_threads()
@receiver(signals.post_delete, sender=Post) @receiver(signals.post_delete, sender=Post)

View File

@@ -3,7 +3,6 @@ from django.http import Http404, HttpResponseRedirect
from django.shortcuts import render, get_object_or_404 from django.shortcuts import render, get_object_or_404
from django.views.generic import DetailView from django.views.generic import DetailView
from django.views.generic.edit import CreateView from django.views.generic.edit import CreateView
from board.models import Post, Board from board.models import Post, Board
__all__ = ("BoardView", "PostView") __all__ = ("BoardView", "PostView")
@@ -29,7 +28,6 @@ class BoardView(CreateView):
fields = ["subject", "name", "text", "image"] fields = ["subject", "name", "text", "image"]
slug_field = "url" slug_field = "url"
slug_url_kwarg = "url" slug_url_kwarg = "url"
template_name = "board/board_detail.html" template_name = "board/board_detail.html"
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@@ -38,13 +36,11 @@ class BoardView(CreateView):
kwargs["board"] = board kwargs["board"] = board
page = self.kwargs.get("page", 1) page = self.kwargs.get("page", 1)
# TODO - allow max number of pages to be specified per-board if page not in range(1, board.max_pages + 1):
if page not in range(1, 10 + 1):
raise Http404() raise Http404()
PER_PAGE = 10 start = (page - 1) * board.threads_per_page
start = (page - 1) * PER_PAGE end = start + board.threads_per_page
end = start + PER_PAGE
kwargs["threads"] = board.threads.order_by("-last_bump")[start:end] kwargs["threads"] = board.threads.order_by("-last_bump")[start:end]
kwargs["page"] = page kwargs["page"] = page
kwargs["max_upload_size"] = settings.MAX_UPLOAD_SIZE kwargs["max_upload_size"] = settings.MAX_UPLOAD_SIZE