Skip to content

Commit 0da80f0

Browse files
committed
fix fill_garbage, tidy a bit
1 parent 6c743cc commit 0da80f0

File tree

5 files changed

+51
-79
lines changed

5 files changed

+51
-79
lines changed

addon_service/external_storage_service/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,16 @@ class ExternalStorageService(AddonsServiceBaseModel):
2424
)
2525
max_concurrent_downloads = models.IntegerField(null=False)
2626
max_upload_mb = models.IntegerField(null=False)
27-
auth_callback_url = models.URLField(null=False, default="")
27+
auth_callback_url = models.URLField(null=False, blank=True, default="")
2828
supported_scopes = ArrayField(models.CharField(), null=True, blank=True)
2929
api_base_url = models.URLField(null=False)
3030

3131
oauth2_client_config = models.ForeignKey(
3232
"addon_service.OAuth2ClientConfig",
3333
on_delete=models.CASCADE,
3434
related_name="external_storage_services",
35+
null=True,
36+
blank=True,
3537
)
3638

3739
class Meta:

addon_service/management/commands/fill_garbage.py

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from addon_service import models as db
55
from addon_service.addon_imp.known import get_imp_by_name
6-
from addon_service.common.invocation import InvocationStatus
6+
from addon_service.credentials.enums import CredentialsFormats
77
from addon_toolkit import AddonCapabilities
88

99

@@ -16,46 +16,38 @@ class Command(LabelCommand):
1616
def handle_label(self, label, **options):
1717
if not settings.DEBUG:
1818
raise Exception("must have DEBUG set to eat garbage")
19-
_ci = db.CredentialsIssuer.objects.create(name=f"entity-{label}")
19+
_blarg_imp = get_imp_by_name("BLARG")
2020
_ess = db.ExternalStorageService.objects.create(
21-
int_addon_imp=get_imp_by_name("BLARG").imp_number,
21+
service_name=label,
22+
int_addon_imp=_blarg_imp.imp_number,
23+
int_credentials_format=CredentialsFormats.PERSONAL_ACCESS_TOKEN.value,
2224
max_concurrent_downloads=2,
2325
max_upload_mb=2,
24-
auth_uri=f"http://foo.example/{label}",
25-
credentials_issuer=_ci,
26+
api_base_url=f"http://foo.example/{label}/",
2627
)
27-
for _i in range(3):
28-
_iu, _ = db.UserReference.objects.get_or_create(
29-
user_uri=f"http://osf.example/u{label}{_i}",
30-
)
31-
_ec = db.ExternalCredentials.objects.create()
32-
_ea = db.ExternalAccount.objects.create(
33-
credentials_issuer=_ci,
34-
owner=_iu,
35-
credentials=_ec,
36-
)
37-
_asa = db.AuthorizedStorageAccount.objects.create(
38-
external_storage_service=_ess,
39-
external_account=_ea,
40-
authorized_capabilities=[
41-
AddonCapabilities.ACCESS,
42-
AddonCapabilities.UPDATE,
43-
],
44-
)
45-
for _op in _asa.authorized_operations:
46-
_ir, _ = db.ResourceReference.objects.get_or_create(
47-
resource_uri=f"http://osf.example/r{label}{_op.name}",
48-
)
49-
_csa = db.ConfiguredStorageAddon.objects.create(
50-
base_account=_asa,
51-
authorized_resource=_ir,
52-
connected_capabilities=[AddonCapabilities.ACCESS],
53-
)
54-
_soi = db.AddonOperationInvocation.objects.create(
55-
invocation_status=InvocationStatus.STARTING,
56-
operation_identifier=_op.natural_key_str,
57-
operation_kwargs={"item": {"item_id": "foo"}, "page": {}},
58-
thru_addon=_csa,
59-
by_user=_iu,
60-
)
61-
return str(_soi)
28+
_userref, _ = db.UserReference.objects.get_or_create(
29+
user_uri=f"http://osf.example/u{label}",
30+
)
31+
_asa = db.AuthorizedStorageAccount.objects.create(
32+
external_storage_service=_ess,
33+
account_owner=_userref,
34+
authorized_capabilities=[
35+
AddonCapabilities.ACCESS,
36+
AddonCapabilities.UPDATE,
37+
],
38+
)
39+
_resourceref, _ = db.ResourceReference.objects.get_or_create(
40+
resource_uri=f"http://osf.example/r{label}",
41+
)
42+
_addon = db.ConfiguredStorageAddon.objects.create(
43+
base_account=_asa,
44+
authorized_resource=_resourceref,
45+
connected_capabilities=[AddonCapabilities.ACCESS],
46+
)
47+
_invocation = db.AddonOperationInvocation.objects.create(
48+
operation_identifier="BLARG:get_root_items",
49+
operation_kwargs={"item": {"item_id": "foo"}, "page": {}},
50+
thru_addon=_addon,
51+
by_user=_userref,
52+
)
53+
return str(_invocation)

addon_service/migrations/0001_initial.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 4.2.7 on 2024-04-09 18:13
1+
# Generated by Django 4.2.7 on 2024-04-10 20:47
22

33
import django.contrib.postgres.fields
44
import django.db.models.deletion
@@ -170,7 +170,7 @@ class Migration(migrations.Migration):
170170
),
171171
("max_concurrent_downloads", models.IntegerField()),
172172
("max_upload_mb", models.IntegerField()),
173-
("auth_callback_url", models.URLField(default="")),
173+
("auth_callback_url", models.URLField(blank=True, default="")),
174174
(
175175
"supported_scopes",
176176
django.contrib.postgres.fields.ArrayField(
@@ -295,6 +295,8 @@ class Migration(migrations.Migration):
295295
model_name="externalstorageservice",
296296
name="oauth2_client_config",
297297
field=models.ForeignKey(
298+
blank=True,
299+
null=True,
298300
on_delete=django.db.models.deletion.CASCADE,
299301
related_name="external_storage_services",
300302
to="addon_service.oauth2clientconfig",

addon_toolkit/constrained_aiohttp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
urlsplit,
1010
)
1111

12-
import aiohttp # type: ignore[import-not-found]
12+
import aiohttp
1313

1414
from addon_toolkit.constrained_http import (
1515
HttpRequestInfo,

addon_toolkit/tests/test_addon_protocol.py

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import dataclasses
2-
import enum
32
import typing
43
import unittest
54
from http import HTTPMethod
65
from unittest.mock import Mock
76

87
from addon_toolkit import (
8+
AddonCapabilities,
99
AddonImp,
1010
AddonOperationDeclaration,
1111
AddonOperationImp,
@@ -19,10 +19,6 @@
1919

2020
class TestAddonProtocol(unittest.TestCase):
2121
# the basics of an addon protocol
22-
class _MyCapability(enum.Enum):
23-
GET_IT = "get-it"
24-
PUT_IT = "put-it"
25-
UNUSED = "unused" # for testing when a capability has no operations
2622

2723
###
2824
# shared test env (on `self`)
@@ -49,12 +45,12 @@ class _MyCustomOperationResult:
4945
class _MyProtocol(typing.Protocol):
5046
"""this _MyProtocol docstring should find its way to browsable docs somewhere"""
5147

52-
@redirect_operation(capability=cls._MyCapability.GET_IT)
48+
@redirect_operation(capability=AddonCapabilities.ACCESS)
5349
def url_for_get(self, checksum_iri: str) -> RedirectResult:
5450
"""this url_for_get docstring should find its way to docs"""
5551
...
5652

57-
@immediate_operation(capability=cls._MyCapability.GET_IT)
53+
@immediate_operation(capability=AddonCapabilities.ACCESS)
5854
async def query_relations(
5955
self,
6056
checksum_iri: str,
@@ -63,7 +59,7 @@ async def query_relations(
6359
"""this query_relations docstring should find its way to docs"""
6460
...
6561

66-
@redirect_operation(capability=cls._MyCapability.PUT_IT)
62+
@redirect_operation(capability=AddonCapabilities.UPDATE)
6763
def url_for_put(self, checksum_iri: str) -> RedirectResult:
6864
"""this url_for_put docstring should find its way to docs"""
6965
...
@@ -93,17 +89,17 @@ def url_for_put(self, checksum_iri: str) -> RedirectResult:
9389
# shared operations
9490
cls._expected_get_op = AddonOperationDeclaration(
9591
operation_type=AddonOperationType.REDIRECT,
96-
capability=cls._MyCapability.GET_IT,
92+
capability=AddonCapabilities.ACCESS,
9793
operation_fn=_MyProtocol.url_for_get,
9894
)
9995
cls._expected_put_op = AddonOperationDeclaration(
10096
operation_type=AddonOperationType.REDIRECT,
101-
capability=cls._MyCapability.PUT_IT,
97+
capability=AddonCapabilities.UPDATE,
10298
operation_fn=_MyProtocol.url_for_put,
10399
)
104100
cls._expected_query_op = AddonOperationDeclaration(
105101
operation_type=AddonOperationType.IMMEDIATE,
106-
capability=cls._MyCapability.GET_IT,
102+
capability=AddonCapabilities.ACCESS,
107103
operation_fn=_MyProtocol.query_relations,
108104
)
109105
cls._my_imp = AddonImp(
@@ -131,27 +127,19 @@ def test_get_operations(self) -> None:
131127
self.assertEqual(
132128
set(
133129
_protocol_dec.get_operation_declarations(
134-
capabilities=[self._MyCapability.GET_IT]
130+
capabilities=[AddonCapabilities.ACCESS]
135131
)
136132
),
137133
{self._expected_get_op, self._expected_query_op},
138134
)
139135
self.assertEqual(
140136
set(
141137
_protocol_dec.get_operation_declarations(
142-
capabilities=[self._MyCapability.PUT_IT]
138+
capabilities=[AddonCapabilities.UPDATE]
143139
)
144140
),
145141
{self._expected_put_op},
146142
)
147-
self.assertEqual(
148-
set(
149-
_protocol_dec.get_operation_declarations(
150-
capabilities=[self._MyCapability.UNUSED]
151-
)
152-
),
153-
set(),
154-
)
155143

156144
def test_get_operation_imps(self) -> None:
157145
self.assertEqual(
@@ -160,28 +148,16 @@ def test_get_operation_imps(self) -> None:
160148
)
161149
self.assertEqual(
162150
set(
163-
self._my_imp.get_operation_imps(
164-
capabilities=[self._MyCapability.GET_IT]
165-
)
151+
self._my_imp.get_operation_imps(capabilities=[AddonCapabilities.ACCESS])
166152
),
167153
{self._expected_get_imp},
168154
)
169155
self.assertEqual(
170156
set(
171-
self._my_imp.get_operation_imps(
172-
capabilities=[self._MyCapability.PUT_IT]
173-
)
157+
self._my_imp.get_operation_imps(capabilities=[AddonCapabilities.UPDATE])
174158
),
175159
{self._expected_put_imp},
176160
)
177-
self.assertEqual(
178-
set(
179-
self._my_imp.get_operation_imps(
180-
capabilities=[self._MyCapability.UNUSED]
181-
)
182-
),
183-
set(),
184-
)
185161

186162
def test_operation_imp_by_name(self) -> None:
187163
self.assertEqual(

0 commit comments

Comments
 (0)