Feature: Add private property for board

This commit is contained in:
winkidney
2020-02-11 16:37:38 +08:00
parent d303e7aa26
commit 23aacbc7c0
4 changed files with 19 additions and 7 deletions

View File

@@ -76,6 +76,7 @@ class Board(models.Model):
submitter = models.ForeignKey(User)
name = models.CharField(max_length=128, blank=False, null=False)
private = models.BooleanField(default=False, blank=False)
pins = models.ManyToManyField("Pin", related_name="pins", blank=True)
published = models.DateTimeField(auto_now_add=True)

View File

@@ -18,6 +18,14 @@ def filter_private_pin(request, query):
return query.select_related('image', 'submitter')
def filter_private_board(request, query):
if request.user.is_authenticated:
query = query.exclude(~Q(submitter=request.user), private=True)
else:
query = query.exclude(private=True)
return query
class ThumbnailSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Thumbnail

View File

@@ -36,7 +36,6 @@ class ImageTests(APITestCase):
class PrivacyTests(APITestCase):
_JSON_TYPE = "application/json"
def setUp(self):
super(PrivacyTests, self).setUp()

View File

@@ -9,7 +9,7 @@ from taggit.models import Tag
from core import serializers as api
from core.models import Image, Pin, Board
from core.permissions import IsOwnerOrReadOnly, OwnerOnlyIfPrivate
from core.serializers import filter_private_pin
from core.serializers import filter_private_pin, filter_private_board
class ImageViewSet(mixins.CreateModelMixin, GenericViewSet):
@@ -35,20 +35,21 @@ class PinViewSet(viewsets.ModelViewSet):
class BoardViewSet(viewsets.ModelViewSet):
queryset = Board.objects.all()
serializer_class = api.BoardSerializer
filter_backends = (DjangoFilterBackend, OrderingFilter)
filter_fields = ("submitter__username", )
ordering_fields = ('-id', )
ordering = ('-id', )
permission_classes = [IsOwnerOrReadOnly("submitter"), ]
permission_classes = [IsOwnerOrReadOnly("submitter"), OwnerOnlyIfPrivate("submitter")]
def get_queryset(self):
return filter_private_board(self.request, Board.objects.all())
class BoardAutoCompleteViewSet(
mixins.ListModelMixin,
viewsets.GenericViewSet,
):
queryset = Board.objects.all()
serializer_class = api.BoardAutoCompleteSerializer
filter_backends = (DjangoFilterBackend, OrderingFilter)
filter_fields = ("submitter__username", )
@@ -56,6 +57,9 @@ class BoardAutoCompleteViewSet(
ordering = ('-id', )
pagination_class = None
def get_queryset(self):
return filter_private_board(self.request, Board.objects.all())
class TagAutoCompleteViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
queryset = Tag.objects.all()
@@ -74,6 +78,6 @@ class TagAutoCompleteViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
drf_router = routers.DefaultRouter()
drf_router.register(r'pins', PinViewSet, basename="pin")
drf_router.register(r'images', ImageViewSet)
drf_router.register(r'boards', BoardViewSet)
drf_router.register(r'boards', BoardViewSet, basename="board")
drf_router.register(r'tags-auto-complete', TagAutoCompleteViewSet)
drf_router.register(r'boards-auto-complete', BoardAutoCompleteViewSet)
drf_router.register(r'boards-auto-complete', BoardAutoCompleteViewSet, base_name="board")