diff --git a/board/views.py b/board/views.py index 7b9a13a..1bb379b 100644 --- a/board/views.py +++ b/board/views.py @@ -1,6 +1,7 @@ +import functools from typing import Any, Dict from django.conf import settings -from django.contrib.auth import get_user_model, get_user +from django.contrib.auth import get_user from django.contrib.auth.mixins import PermissionRequiredMixin from django.db.models import Q from django.http import Http404, HttpResponseRedirect @@ -33,14 +34,15 @@ __all__ = ( ) -User = get_user_model() - - def can_modify(user): if not user: return False # TODO add more permissions as required - return user.has_perm("board.set_sticky") + return ( + user.has_perm("board.set_sticky") + or user.has_perm("board.set_bump") + or user.has_perm("board.set_lock") + ) class BannedView(TemplateView): @@ -60,7 +62,13 @@ class BannedView(TemplateView): return context -class CreateView(edit.CreateView): +class BoardMixin: + @functools.cached_property + def board(self) -> Board: + return get_object_or_404(Board, url=self.kwargs["url"]) # type: ignore + + +class CreateView(BoardMixin, edit.CreateView): """ Helper class that sets a few variables for posts and check against bans. This should not be used by itself. @@ -76,9 +84,6 @@ class CreateView(edit.CreateView): return kwargs def dispatch(self, request, *args, **kwargs): - # Set the board on this object - self.board = get_object_or_404(Board, url=kwargs["url"]) - # Check for bans ip = get_client_ip(request) if request.method == "POST" and is_banned(ip, self.board): @@ -87,7 +92,7 @@ class CreateView(edit.CreateView): return super(CreateView, self).dispatch(request, *args, **kwargs) -class BoardView(TemplateView): +class BoardView(BoardMixin, TemplateView): model = Board slug_field = "url" slug_url_kwarg = "url" @@ -101,10 +106,6 @@ class BoardView(TemplateView): ) return super(BoardView, self).get(request, *args, **kwargs) - def dispatch(self, request, *args, **kwargs): - self.board = get_object_or_404(Board, url=kwargs["url"]) - return super(BoardView, self).dispatch(request, *args, **kwargs) - def get_context_data(self, **kwargs): page = self.kwargs["page"]