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 from board.forms import PostForm, ReplyForm __all__ = ("BoardView", "PostView") 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 CreatePostView(CreateView): """ Helper class that sets a few variables for posts. This should not be used by itself. This class sets the following variables on GET and POST: * self.board """ def get(self, request, *args, **kwargs): self._set_board(kwargs["url"]) return super(CreatePostView, self).get(request, *args, **kwargs) def post(self, request, *args, **kwargs): self._set_board(kwargs["url"]) return super(CreatePostView, self).post(request, *args, **kwargs) def _set_board(self, board_url: str): board = get_object_or_404(Board, url=board_url) self.board = board def get_form_kwargs(self): kwargs = super(CreatePostView, self).get_form_kwargs() kwargs["board"] = self.board kwargs["ip"] = get_client_ip(self.request) return kwargs class BoardView(CreatePostView): model = Post form_class = PostForm # fields = ["subject", "name", "text", "image"] slug_field = "url" slug_url_kwarg = "url" template_name = "board/board_detail.html" def get_context_data(self, **kwargs): page = self.kwargs.get("page", 1) if page not in range(1, self.board.max_pages + 1): raise Http404() threads_per_page = self.board.threads_per_page start = (page - 1) * threads_per_page end = start + threads_per_page thread_count = self.board.threads.count() last_page = (thread_count // threads_per_page) + 1 kwargs["board"] = self.board kwargs["threads"] = self.board.threads.order_by("-last_bump")[start:end] kwargs["current_page"] = page kwargs["pages"] = range(1, last_page + 1) kwargs["last_page"] = last_page kwargs["max_upload_size"] = settings.MAX_UPLOAD_SIZE return super(BoardView, self).get_context_data(**kwargs) class PostView(CreatePostView): model = Post # fields = ["name", "text", "image"] form_class = ReplyForm slug_field = "url" slug_url_kwarg = "url" template_name = "board/post_detail.html" def get_context_data(self, **kwargs): kwargs["board"] = self.board 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 get_form_kwargs(self): kwargs = super(PostView, self).get_form_kwargs() post_id = self.kwargs["id"] post = get_object_or_404(Post, id=post_id) kwargs["op"] = post kwargs["reply"] = post return kwargs