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

Commit 69a5f33

Browse files
committed
Consolidate duplicated is_admin_on_provider fn
1 parent 1b1e320 commit 69a5f33

File tree

5 files changed

+37
-75
lines changed

5 files changed

+37
-75
lines changed

api/internal/tests/test_permissions.py

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

1317

1418
class MockedPermissionsAdapter:
@@ -178,7 +182,7 @@ def test_is_admin_on_provider_invokes_torngit_adapter_when_user_not_in_admin_arr
178182
user = OwnerFactory()
179183

180184
mocked_get_adapter.return_value = GetAdminProviderAdapter()
181-
self.permissions_class._is_admin_on_provider(user, org)
185+
is_admin_on_provider(user, org)
182186
assert mocked_get_adapter.return_value.last_call_args == {
183187
"username": user.username,
184188
"service_id": user.service_id,
@@ -192,4 +196,4 @@ def test_is_admin_on_provider_handles_torngit_exception(self, mock_get_provider)
192196
user = OwnerFactory()
193197

194198
with self.assertRaises(APIException):
195-
self.permissions_class._is_admin_on_provider(user, org)
199+
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

graphql_api/tests/test_owner.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -390,9 +390,7 @@ def test_is_current_user_not_an_admin(self):
390390
data = self.gql_request(query, owner=user, with_errors=True)
391391
assert data["data"]["owner"]["isAdmin"] is None
392392

393-
@patch(
394-
"codecov_auth.commands.owner.interactors.get_is_current_user_an_admin.get_provider"
395-
)
393+
@patch("api.shared.permissions.get_provider")
396394
def test_is_current_user_an_admin(self, mocked_get_adapter):
397395
query_current_user_is_admin = """{
398396
owner(username: "%s") {

0 commit comments

Comments
 (0)