Skip to content

Commit 38ad074

Browse files
only moderator and admin can access moderation tabs (#11343)
1 parent 1824c23 commit 38ad074

File tree

6 files changed

+116
-5
lines changed

6 files changed

+116
-5
lines changed

api/providers/permissions.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from guardian.shortcuts import get_perms
21
from rest_framework import permissions as drf_permissions
32

43
from api.base.utils import get_user_auth
@@ -36,4 +35,7 @@ def has_permission(self, request, view):
3635
class MustBeModerator(drf_permissions.BasePermission):
3736
def has_permission(self, request, view):
3837
auth = get_user_auth(request)
39-
return bool(get_perms(auth.user, view.get_provider()))
38+
provider = view.get_provider()
39+
is_admin = provider.get_group('admin').user_set.filter(id=auth.user.id).exists()
40+
is_moderator = provider.get_group('moderator').user_set.filter(id=auth.user.id).exists()
41+
return is_moderator or is_admin

api/registrations/permissions.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ class ContributorOrModerator(permissions.BasePermission):
77

88
def has_object_permission(self, request, view, obj):
99
auth = get_user_auth(request)
10+
is_admin = obj.provider.get_group('admin').user_set.filter(id=auth.user.id).exists()
11+
is_moderator = obj.provider.get_group('moderator').user_set.filter(id=auth.user.id).exists()
1012

11-
# If a user has perms on the provider, they must be a moderator or admin
12-
is_moderator = bool(get_perms(auth.user, obj.provider))
13-
return obj.is_admin_contributor(auth.user) or is_moderator
13+
return obj.is_admin_contributor(auth.user) or is_moderator or is_admin
1414

1515

1616
class ContributorOrModeratorOrPublic(permissions.BasePermission):
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import pytest
2+
3+
from api.base.settings.defaults import API_BASE
4+
from api_tests.providers.mixins import OnlyModeratorOrAdminPermissionsMixin
5+
6+
from osf_tests.factories import CollectionProviderFactory
7+
8+
9+
@pytest.mark.django_db
10+
class TestOnlyModeratorOrAdmin(OnlyModeratorOrAdminPermissionsMixin):
11+
12+
@pytest.fixture()
13+
def urls(self, provider, moderator, admin):
14+
return [
15+
f'/{API_BASE}providers/collections/{provider._id}/moderators/',
16+
f'/{API_BASE}providers/collections/{provider._id}/moderators/{moderator._id}/',
17+
f'/{API_BASE}providers/collections/{provider._id}/moderators/{admin._id}/',
18+
]
19+
20+
@pytest.fixture()
21+
def provider(self):
22+
return CollectionProviderFactory()

api_tests/providers/mixins.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,3 +1038,42 @@ def test_provider_has_both_acceptable_and_default_licenses(self, app, provider,
10381038
assert license_one._id in license_ids
10391039
assert license_three._id in license_ids
10401040
assert license_two._id not in license_ids
1041+
1042+
1043+
@pytest.mark.django_db
1044+
class OnlyModeratorOrAdminPermissionsMixin:
1045+
1046+
@pytest.fixture()
1047+
def provider(self):
1048+
raise NotImplementedError
1049+
1050+
@pytest.fixture()
1051+
def user(self):
1052+
return AuthUserFactory()
1053+
1054+
@pytest.fixture()
1055+
def moderator(self, provider):
1056+
mod = AuthUserFactory()
1057+
provider.get_group('moderator').user_set.add(mod)
1058+
return mod
1059+
1060+
@pytest.fixture()
1061+
def admin(self, provider):
1062+
adm = AuthUserFactory()
1063+
provider.get_group('admin').user_set.add(adm)
1064+
return adm
1065+
1066+
@pytest.fixture()
1067+
def urls(self):
1068+
raise NotImplementedError
1069+
1070+
def test_moderator_or_admin_have_access_to_provider(self, app, provider, user, moderator, admin, urls):
1071+
for url in urls:
1072+
user_res = app.get(url, auth=user.auth, expect_errors=True)
1073+
assert user_res.status_code == 403
1074+
1075+
moderator_res = app.get(url, auth=moderator.auth)
1076+
assert moderator_res.status_code == 200
1077+
1078+
admin_res = app.get(url, auth=admin.auth)
1079+
assert admin_res.status_code == 200
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import pytest
2+
3+
from api.base.settings.defaults import API_BASE
4+
from api_tests.providers.mixins import OnlyModeratorOrAdminPermissionsMixin
5+
6+
from osf_tests.factories import PreprintProviderFactory
7+
8+
9+
@pytest.mark.django_db
10+
class TestOnlyModeratorOrAdmin(OnlyModeratorOrAdminPermissionsMixin):
11+
12+
@pytest.fixture()
13+
def urls(self, provider, moderator, admin):
14+
return [
15+
f'/{API_BASE}providers/preprints/{provider._id}/withdraw_requests/',
16+
f'/{API_BASE}providers/preprints/{provider._id}/moderators/',
17+
f'/{API_BASE}providers/preprints/{provider._id}/moderators/{moderator._id}/',
18+
f'/{API_BASE}providers/preprints/{provider._id}/moderators/{admin._id}/',
19+
]
20+
21+
@pytest.fixture()
22+
def provider(self):
23+
return PreprintProviderFactory()
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import pytest
2+
3+
from api.base.settings.defaults import API_BASE
4+
from api_tests.providers.mixins import OnlyModeratorOrAdminPermissionsMixin
5+
6+
from osf_tests.factories import RegistrationProviderFactory
7+
8+
9+
@pytest.mark.django_db
10+
class TestOnlyModeratorOrAdmin(OnlyModeratorOrAdminPermissionsMixin):
11+
12+
@pytest.fixture()
13+
def urls(self, provider, moderator, admin):
14+
return [
15+
f'/{API_BASE}providers/registrations/{provider._id}/requests/',
16+
f'/{API_BASE}providers/registrations/{provider._id}/registrations/',
17+
f'/{API_BASE}providers/registrations/{provider._id}/actions/',
18+
f'/{API_BASE}providers/registrations/{provider._id}/moderators/',
19+
f'/{API_BASE}providers/registrations/{provider._id}/moderators/{moderator._id}/',
20+
f'/{API_BASE}providers/registrations/{provider._id}/moderators/{admin._id}/',
21+
]
22+
23+
@pytest.fixture()
24+
def provider(self):
25+
return RegistrationProviderFactory()

0 commit comments

Comments
 (0)