Browse Source

close #387

pull/388/head
winkidney 1 month ago
parent
commit
b8a0088ed4
2 changed files with 42 additions and 4 deletions
  1. +11
    -4
      core/serializers.py
  2. +31
    -0
      core/tests/api.py

+ 11
- 4
core/serializers.py View File

@@ -8,6 +8,7 @@ from core.models import Image, Board
from core.models import Pin from core.models import Pin
from django_images.models import Thumbnail from django_images.models import Thumbnail
from users.serializers import UserSerializer from users.serializers import UserSerializer
from users.models import User




def filter_private_pin(request, query): def filter_private_pin(request, query):
@@ -219,8 +220,14 @@ class BoardSerializer(serializers.HyperlinkedModelSerializer):
return PinSerializer(pin, context=self.context).data return PinSerializer(pin, context=self.context).data


@staticmethod @staticmethod
def _get_list(pins_id):
return tuple(Pin.objects.filter(id__in=pins_id))
def _get_list(pins_id, submitter: User):
pins = Pin.objects.filter(id__in=pins_id)
valid_pins = []
for pin in pins:
if pin.private and pin.submitter != submitter:
continue
valid_pins.append(pin)
return valid_pins


def update(self, instance: Board, validated_data): def update(self, instance: Board, validated_data):
pins_to_add = validated_data.pop("pins_to_add", []) pins_to_add = validated_data.pop("pins_to_add", [])
@@ -237,11 +244,11 @@ class BoardSerializer(serializers.HyperlinkedModelSerializer):
changed = False changed = False
if pins_to_add: if pins_to_add:
changed = True changed = True
for pin in self._get_list(pins_to_add):
for pin in self._get_list(pins_to_add, instance.submitter):
instance.pins.add(pin) instance.pins.add(pin)
if pins_to_remove: if pins_to_remove:
changed = True changed = True
for pin in self._get_list(pins_to_remove):
for pin in self._get_list(pins_to_remove, instance.submitter):
instance.pins.remove(pin) instance.pins.remove(pin)
if changed: if changed:
instance.save() instance.save()


+ 31
- 0
core/tests/api.py View File

@@ -53,6 +53,13 @@ class BoardPrivacyTests(APITestCase):
def tearDown(self): def tearDown(self):
_teardown_models() _teardown_models()


def _create_pin_with_non_owner(self, private):
image = create_image()
pin = create_pin(self.non_owner, image=image, tags=[])
pin.private = private
pin.save()
return pin

def test_should_non_owner_and_anonymous_user_has_no_permission_to_list_private_board(self): def test_should_non_owner_and_anonymous_user_has_no_permission_to_list_private_board(self):
resp = self.client.get(self.boards_url) resp = self.client.get(self.boards_url)
self.assertEqual(len(resp.json()), 0, resp.json()) self.assertEqual(len(resp.json()), 0, resp.json())
@@ -79,6 +86,30 @@ class BoardPrivacyTests(APITestCase):
resp = self.client.get(self.board_url) resp = self.client.get(self.board_url)
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)


def test_should_owner_has_no_permission_to_add_private_pin_of_other_user_to_board(self):
self.client.login(username=self.owner.username, password='password')

private_pin_of_other_user = self._create_pin_with_non_owner(True)

resp = self.client.patch(self.board_url, data={"pins_to_add": [private_pin_of_other_user.id, ]})
self.assertEqual(resp.status_code, 200)

resp = self.client.get(self.board_url)
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.json()['total_pins'], 0, resp.json())

def test_should_owner_has_permission_to_add_non_private_pin_of_other_user_to_board(self):
self.client.login(username=self.owner.username, password='password')

private_pin_of_other_user = self._create_pin_with_non_owner(False)

resp = self.client.patch(self.board_url, data={"pins_to_add": [private_pin_of_other_user.id, ]})
self.assertEqual(resp.status_code, 200)

resp = self.client.get(self.board_url)
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.json()['total_pins'], 1, resp.json())



class PinPrivacyTests(APITestCase): class PinPrivacyTests(APITestCase):




Loading…
Cancel
Save