diff --git a/rdmo/projects/serializers/v1/__init__.py b/rdmo/projects/serializers/v1/__init__.py index 86b3039391..bd0f1673db 100644 --- a/rdmo/projects/serializers/v1/__init__.py +++ b/rdmo/projects/serializers/v1/__init__.py @@ -4,6 +4,7 @@ from rest_framework import serializers +from rdmo.domain.models import Attribute from rdmo.questions.models import Catalog from rdmo.services.validators import ProviderValidator @@ -353,6 +354,8 @@ class Meta: class ValueSerializer(serializers.ModelSerializer): + attribute = serializers.PrimaryKeyRelatedField(queryset=Attribute.objects.all(), required=True) + class Meta: model = Value fields = ( diff --git a/rdmo/projects/tests/test_viewset_project_value.py b/rdmo/projects/tests/test_viewset_project_value.py index b9e5b8d86d..81a28bd0dc 100644 --- a/rdmo/projects/tests/test_viewset_project_value.py +++ b/rdmo/projects/tests/test_viewset_project_value.py @@ -1,3 +1,4 @@ +import json from pathlib import Path import pytest @@ -30,7 +31,7 @@ 'site': [1, 2, 3, 4, 5, 12] } -add_value_permission_map = change_value_permission_map = delete_value_permission_map = { +add_value_permission_map = change_value_permission_map = delete_value_permission_map = copy_value_permission_map = { 'owner': [1, 2, 3, 4, 5, 12], 'manager': [1, 3, 5], 'author': [1, 3, 5], @@ -65,7 +66,6 @@ ] set_questionsets = [42, 43] - @pytest.mark.parametrize('username,password', users) @pytest.mark.parametrize('project_id', projects) def test_list(db, client, username, password, project_id): @@ -237,10 +237,50 @@ def test_delete(db, client, username, password, value_id): assert Value.objects.filter(pk=value_id).exists() +@pytest.mark.parametrize('username,password', users) +@pytest.mark.parametrize('value_id, set_values_count', set_values) +def test_copy_set(db, client, username, password, value_id, set_values_count): + client.login(username=username, password=password) + set_value = Value.objects.get(id=value_id) + values_count = Value.objects.count() + + url = reverse(urlnames['set'], args=[set_value.project_id, value_id]) + data = { + 'attribute': set_value.attribute.id, + 'set_prefix': set_value.set_prefix, + 'set_index': 2, + 'text': 'new' + } + response = client.post(url, data=json.dumps(data), content_type="application/json") + + if set_value.project_id in copy_value_permission_map.get(username, []): + assert response.status_code == 201 + assert len(response.json()) == set_values_count + 1 + assert Value.objects.get( + project=set_value.project_id, + snapshot=None, + **data + ) + assert Value.objects.count() == values_count + set_values_count + 1 # one is for set/id + for value_data in response.json(): + if value_data['set_prefix'] == data['set_prefix']: + assert value_data['set_index'] == data['set_index'] + else: + set_prefix_split = value_data['set_prefix'].split('|') + assert set_prefix_split[0] == str(data['set_index']) + + elif set_value.project_id in view_value_permission_map.get(username, []): + assert response.status_code == 403 + assert Value.objects.count() == values_count + else: + assert response.status_code == 404 + assert Value.objects.count() == values_count + + @pytest.mark.parametrize('username,password', users) @pytest.mark.parametrize('project_id', projects) @pytest.mark.parametrize('value_id, set_values_count', set_values) -def test_set(db, client, username, password, project_id, value_id, set_values_count): +def test_delete_set(db, client, username, password, project_id, value_id, set_values_count): client.login(username=username, password=password) value_exists = Value.objects.filter(project_id=project_id, snapshot=None, id=value_id).exists() values_count = Value.objects.count() diff --git a/rdmo/projects/viewsets.py b/rdmo/projects/viewsets.py index d9a8ed5a86..f8c9a898fa 100644 --- a/rdmo/projects/viewsets.py +++ b/rdmo/projects/viewsets.py @@ -395,7 +395,10 @@ def copy_set(self, request, parent_lookup_project, pk=None): # de-serialize the posted new set value and save it, use the ValueSerializer # instead of ProjectValueSerializer, since the latter does not include project - set_value_serializer = ValueSerializer(data=request.data) + set_value_serializer = ValueSerializer(data={ + 'project': parent_lookup_project, + **request.data + }) set_value_serializer.is_valid(raise_exception=True) set_value = set_value_serializer.save() set_value_data = set_value_serializer.data