Skip to content

Commit b52d3b6

Browse files
committed
Merge branch 'hotfix/25.14.1'
2 parents df76b18 + 4ef014e commit b52d3b6

File tree

4 files changed

+35
-5
lines changed

4 files changed

+35
-5
lines changed

api/preprints/permissions.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from rest_framework import exceptions
33

44
from api.base.utils import get_user_auth, assert_resource_type
5+
from api.base.exceptions import Conflict
56
from api.nodes.permissions import (
67
AdminOrPublic as NodeAdminOrPublic,
78
)
@@ -164,3 +165,25 @@ def has_object_permission(self, request, view, obj):
164165
return False
165166
else:
166167
return obj.has_permission(auth.user, osf_permissions.READ)
168+
169+
170+
class CanSubmitPreprintToProvider(permissions.BasePermission):
171+
172+
def has_permission(self, request, view):
173+
if request.method != 'POST':
174+
return True
175+
176+
provider_id = request.data.get('provider', None)
177+
if not provider_id:
178+
return False
179+
180+
from osf.models import PreprintProvider
181+
try:
182+
provider = PreprintProvider.objects.get(_id=provider_id)
183+
except PreprintProvider.DoesNotExist:
184+
return False
185+
186+
if not provider.allow_submissions:
187+
raise Conflict(f"Provider {provider.name} doesn't allow new submissions.")
188+
189+
return True

api/preprints/serializers.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,6 @@ class PreprintCreateSerializer(PreprintSerializer):
507507
manual_doi = ser.CharField(write_only=True, required=False, allow_null=True, allow_blank=True)
508508

509509
def create(self, validated_data):
510-
511510
creator = self.context['request'].user
512511
provider = validated_data.pop('provider', None)
513512
if not provider:

api/preprints/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
ContributorDetailPermissions,
6363
PreprintFilesPermissions,
6464
PreprintInstitutionPermissionList,
65+
CanSubmitPreprintToProvider,
6566
)
6667
from api.providers.workflows import Workflows, PUBLIC_STATES
6768
from api.nodes.permissions import ContributorOrPublic
@@ -169,6 +170,7 @@ class PreprintList(PreprintMetricsViewMixin, JSONAPIBaseView, generics.ListCreat
169170
drf_permissions.IsAuthenticatedOrReadOnly,
170171
base_permissions.TokenHasScope,
171172
ContributorOrPublic,
173+
CanSubmitPreprintToProvider,
172174
)
173175

174176
parser_classes = (JSONAPIMultipleRelationshipsParser, JSONAPIMultipleRelationshipsParserForRegularJSON)

api_tests/preprints/views/test_preprint_list.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -510,16 +510,22 @@ def test_no_provider_given(self):
510510
no_providers_payload = build_preprint_create_payload()
511511
res = self.app.post_json_api(self.url, no_providers_payload, auth=self.user.auth, expect_errors=True)
512512

513-
assert res.status_code == 400
514-
assert res.json['errors'][0]['detail'] == 'You must specify a valid provider to create a preprint.'
513+
assert res.status_code == 403
515514

516515
def test_invalid_provider_given(self):
517516
wrong_provider_payload = build_preprint_create_payload(provider_id='jobbers')
518517

519518
res = self.app.post_json_api(self.url, wrong_provider_payload, auth=self.user.auth, expect_errors=True)
520519

521-
assert res.status_code == 400
522-
assert res.json['errors'][0]['detail'] == 'You must specify a valid provider to create a preprint.'
520+
assert res.status_code == 403
521+
522+
def test_submission_to_provider_not_allowed(self):
523+
provider = PreprintProviderFactory(allow_submissions=False)
524+
public_project_payload = build_preprint_create_payload(provider_id=provider._id)
525+
res = self.app.post_json_api(self.url, public_project_payload, auth=self.user.auth, expect_errors=True)
526+
527+
assert res.status_code == 409
528+
assert res.json['errors'][0]['detail'] == f'Provider {provider.name} doesn\'t allow new submissions.'
523529

524530
def test_file_not_osfstorage(self):
525531
public_project_payload = build_preprint_create_payload(provider_id=self.provider._id)

0 commit comments

Comments
 (0)