Skip to content
This repository was archived by the owner on Jun 13, 2025. It is now read-only.

Commit 2e4c0fd

Browse files
committed
Consolidate duplicated is_admin_on_provider fn
1 parent 6bb21bf commit 2e4c0fd

File tree

4 files changed

+32
-72
lines changed

4 files changed

+32
-72
lines changed

api/internal/tests/test_permissions.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
GetAdminErrorProviderAdapter,
99
GetAdminProviderAdapter,
1010
)
11-
from api.shared.permissions import RepositoryPermissionsService, UserIsAdminPermissions
11+
from api.shared.permissions import RepositoryPermissionsService, UserIsAdminPermissions, is_admin_on_provider
1212

1313

1414
class MockedPermissionsAdapter:
@@ -178,7 +178,7 @@ def test_is_admin_on_provider_invokes_torngit_adapter_when_user_not_in_admin_arr
178178
user = OwnerFactory()
179179

180180
mocked_get_adapter.return_value = GetAdminProviderAdapter()
181-
self.permissions_class._is_admin_on_provider(user, org)
181+
is_admin_on_provider(user, org)
182182
assert mocked_get_adapter.return_value.last_call_args == {
183183
"username": user.username,
184184
"service_id": user.service_id,
@@ -192,4 +192,4 @@ def test_is_admin_on_provider_handles_torngit_exception(self, mock_get_provider)
192192
user = OwnerFactory()
193193

194194
with self.assertRaises(APIException):
195-
self.permissions_class._is_admin_on_provider(user, org)
195+
is_admin_on_provider(user, org)

api/shared/permissions.py

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,21 @@ def has_permission(self, request: HttpRequest, view: Any) -> bool:
140140
return True
141141

142142

143+
@torngit_safe
144+
def is_admin_on_provider(current_user: Owner, owner: Owner) -> bool:
145+
torngit_provider_adapter = get_provider(
146+
owner.service,
147+
{
148+
**get_generic_adapter_params(current_user, owner.service),
149+
"owner": {"username": owner.username, "service_id": owner.service_id},
150+
},
151+
)
152+
153+
return async_to_sync(torngit_provider_adapter.get_is_admin)(
154+
user={"username": current_user.username, "service_id": current_user.service_id}
155+
)
156+
157+
143158
class UserIsAdminPermissions(BasePermission):
144159
"""
145160
Permissions class for asserting the user is an admin of the 'owner'
@@ -158,29 +173,10 @@ def has_permission(self, request: HttpRequest, view: Any) -> bool:
158173
and request.current_owner
159174
and (
160175
view.owner.is_admin(request.current_owner)
161-
or self._is_admin_on_provider(request.current_owner, view.owner)
176+
or is_admin_on_provider(request.current_owner, view.owner)
162177
)
163178
)
164179

165-
@torngit_safe
166-
def _is_admin_on_provider(self, user: Owner, owner: Owner) -> bool:
167-
torngit_provider_adapter = get_provider(
168-
owner.service,
169-
{
170-
**get_generic_adapter_params(user, owner.service),
171-
**{
172-
"owner": {
173-
"username": owner.username,
174-
"service_id": owner.service_id,
175-
}
176-
},
177-
},
178-
)
179-
180-
return async_to_sync(torngit_provider_adapter.get_is_admin)(
181-
user={"username": user.username, "service_id": user.service_id}
182-
)
183-
184180

185181
class MemberOfOrgPermissions(BasePermission):
186182
"""

codecov_auth/commands/owner/interactors/get_is_current_user_an_admin.py

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,9 @@
1-
from asgiref.sync import async_to_sync, sync_to_async
1+
from asgiref.sync import sync_to_async
22
from django.conf import settings
33

44
import services.self_hosted as self_hosted
5+
from api.shared.permissions import is_admin_on_provider
56
from codecov.commands.base import BaseInteractor
6-
from services.decorators import torngit_safe
7-
from services.repo_providers import get_generic_adapter_params, get_provider
8-
9-
10-
@torngit_safe
11-
@sync_to_async
12-
def _is_admin_on_provider(owner, current_user):
13-
torngit_provider_adapter = get_provider(
14-
owner.service,
15-
{
16-
**get_generic_adapter_params(current_user, owner.service),
17-
**{
18-
"owner": {
19-
"username": owner.username,
20-
"service_id": owner.service_id,
21-
}
22-
},
23-
},
24-
)
25-
26-
isAdmin = async_to_sync(torngit_provider_adapter.get_is_admin)(
27-
user={"username": current_user.username, "service_id": current_user.service_id}
28-
)
29-
return isAdmin
307

318

329
class GetIsCurrentUserAnAdminInteractor(BaseInteractor):
@@ -44,7 +21,7 @@ def execute(self, owner, current_owner):
4421
return True
4522
else:
4623
try:
47-
isAdmin = async_to_sync(_is_admin_on_provider)(owner, current_owner)
24+
isAdmin = is_admin_on_provider(current_owner, owner)
4825
if isAdmin:
4926
# save admin provider in admins list
5027
owner.add_admin(current_owner)

codecov_auth/commands/owner/interactors/tests/test_get_is_current_user_an_admin.py

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@
77
OwnerFactory,
88
)
99

10-
from ..get_is_current_user_an_admin import (
11-
GetIsCurrentUserAnAdminInteractor,
12-
_is_admin_on_provider,
13-
)
10+
from api.shared.permissions import is_admin_on_provider
11+
12+
from ..get_is_current_user_an_admin import GetIsCurrentUserAnAdminInteractor
1413

1514

1615
class GetIsCurrentUserAnAdminInteractorTest(TestCase):
@@ -43,22 +42,18 @@ def test_user_not_a_provider_admin(self):
4342
)(owner, current_user)
4443
assert isAdmin == False
4544

46-
@patch(
47-
"codecov_auth.commands.owner.interactors.get_is_current_user_an_admin.get_provider"
48-
)
45+
@patch("api.shared.permissions.get_provider")
4946
def test_is_admin_on_provider_invokes_torngit_adapter(self, mocked_get_adapter):
5047
current_user = OwnerFactory(ownerid=3)
5148
owner = self.owner_has_no_admins
5249
mocked_get_adapter.return_value = GetAdminProviderAdapter()
53-
async_to_sync(_is_admin_on_provider)(owner, current_user)
50+
is_admin_on_provider(current_user, owner)
5451
assert mocked_get_adapter.return_value.last_call_args == {
5552
"username": current_user.username,
5653
"service_id": current_user.service_id,
5754
}
5855

59-
@patch(
60-
"codecov_auth.commands.owner.interactors.get_is_current_user_an_admin.get_provider"
61-
)
56+
@patch("api.shared.permissions.get_provider")
6257
def test_is_admin_in_org_not_on_provider(self, mocked_get_adapter):
6358
current_user = OwnerFactory(ownerid=2)
6459
owner = self.owner_has_admins
@@ -68,9 +63,7 @@ def test_is_admin_in_org_not_on_provider(self, mocked_get_adapter):
6863
)(owner, current_user)
6964
assert isAdmin == True
7065

71-
@patch(
72-
"codecov_auth.commands.owner.interactors.get_is_current_user_an_admin.get_provider"
73-
)
66+
@patch("api.shared.permissions.get_provider")
7467
def test_is_admin_on_provider(self, mocked_get_adapter):
7568
current_user = OwnerFactory(ownerid=3)
7669
owner = self.owner_has_no_admins
@@ -81,9 +74,7 @@ def test_is_admin_on_provider(self, mocked_get_adapter):
8174
assert current_user.ownerid in owner.admins
8275
assert isAdmin == True
8376

84-
@patch(
85-
"codecov_auth.commands.owner.interactors.get_is_current_user_an_admin.get_provider"
86-
)
77+
@patch("api.shared.permissions.get_provider")
8778
def test_is_admin_on_provider_only_once(self, mocked_get_adapter):
8879
# Ensure duplicate ownerids won't be saved in admins upon multiple calls
8980
current_user = OwnerFactory(ownerid=3)
@@ -98,9 +89,7 @@ def test_is_admin_on_provider_only_once(self, mocked_get_adapter):
9889
assert owner.admins == [3]
9990
assert current_user.ownerid in owner.admins
10091

101-
@patch(
102-
"codecov_auth.commands.owner.interactors.get_is_current_user_an_admin.get_provider"
103-
)
92+
@patch("api.shared.permissions.get_provider")
10493
def test_admin_on_provider_initially_is_null(self, mocked_get_adapter):
10594
# Owner model defaults admins to null, check can handle first update
10695
current_user = OwnerFactory(ownerid=3)
@@ -113,9 +102,7 @@ def test_admin_on_provider_initially_is_null(self, mocked_get_adapter):
113102
assert current_user.ownerid in owner.admins
114103
assert isAdmin == True
115104

116-
@patch(
117-
"codecov_auth.commands.owner.interactors.get_is_current_user_an_admin.get_provider"
118-
)
105+
@patch("api.shared.permissions.get_provider")
119106
def test_is_admin_not_in_org_or_on_provider(self, mocked_get_adapter):
120107
current_user = OwnerFactory(ownerid=3)
121108
owner = self.owner_has_no_admins

0 commit comments

Comments
 (0)