Files
interchan/board/views.py
Alek Ratzloff 27045c11c2 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>
2022-05-06 22:00:54 -07:00

93 lines
2.9 KiB
Python

from django.conf import settings
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import render, get_object_or_404
from django.views.generic import DetailView
from django.views.generic.edit import CreateView
from board.models import Post, Board
__all__ = ("BoardView", "PostView")
# TODO bump order calculation. this is kind of expensive and should *really*
# only be run every few seconds rather than every post.
# This is a scale problem and not a high priority.
def get_client_ip(request):
"Get the IP address of a client-side request. Shamelessly copy/pasted from StackOverflow."
x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR")
if x_forwarded_for:
ip = x_forwarded_for.split(",")[0]
else:
ip = request.META.get("REMOTE_ADDR")
return ip
class BoardView(CreateView):
model = Post
fields = ["subject", "name", "text", "image"]
slug_field = "url"
slug_url_kwarg = "url"
template_name = "board/board_detail.html"
def get_context_data(self, **kwargs):
board_url = self.kwargs["url"]
board = get_object_or_404(Board, url=board_url)
kwargs["board"] = board
page = self.kwargs.get("page", 1)
if page not in range(1, board.max_pages + 1):
raise Http404()
start = (page - 1) * board.threads_per_page
end = start + board.threads_per_page
kwargs["threads"] = board.threads.order_by("-last_bump")[start:end]
kwargs["page"] = page
kwargs["max_upload_size"] = settings.MAX_UPLOAD_SIZE
return super(BoardView, self).get_context_data(**kwargs)
def form_valid(self, form):
board_url = self.kwargs["url"]
board = get_object_or_404(Board, url=board_url)
form.instance.board = board
form.instance.ip = get_client_ip(self.request)
self.object = form.save()
return HttpResponseRedirect(self.get_success_url())
class PostView(CreateView):
model = Post
fields = ["name", "text", "image"]
slug_field = "url"
slug_url_kwarg = "url"
template_name = "board/post_detail.html"
def get_context_data(self, **kwargs):
board_url = self.kwargs["url"]
kwargs["board"] = get_object_or_404(Board, url=board_url)
post_id = self.kwargs["id"]
kwargs["post"] = get_object_or_404(Post, id=post_id)
kwargs["max_upload_size"] = settings.MAX_UPLOAD_SIZE
return super(PostView, self).get_context_data(**kwargs)
def form_valid(self, form):
board_url = self.kwargs["url"]
board = get_object_or_404(Board, url=board_url)
post_id = self.kwargs["id"]
post = get_object_or_404(Post, id=post_id)
form.instance.board = board
form.instance.ip = get_client_ip(self.request)
form.instance.op = post
form.instance.reply = post
self.object = form.save()
return HttpResponseRedirect(post.get_absolute_url())