Skip to content

Commit ced2282

Browse files
authored
Merge pull request #11653 from Ostap-Zherebetskyi/feature/institutions_api
[ENG-10635] Update API to support querying institutions for all active and (SSO Availability) public institutions
2 parents 070b376 + 50ad102 commit ced2282

3 files changed

Lines changed: 38 additions & 0 deletions

File tree

api/institutions/serializers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@ class InstitutionSerializer(JSONAPISerializer):
2929
'id',
3030
'name',
3131
'auth_url',
32+
'sso_availability',
3233
])
3334

3435
name = ser.CharField(read_only=True)
3536
id = ser.CharField(read_only=True, source='_id')
37+
sso_availability = ser.CharField(read_only=True)
3638
description = ser.CharField(read_only=True)
3739
auth_url = ser.CharField(read_only=True)
3840
iri = ser.CharField(read_only=True, source='identifier_domain')

api/institutions/views.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ class InstitutionList(JSONAPIBaseView, generics.ListAPIView, ListFilterMixin):
7373
base_permissions.TokenHasScope,
7474
)
7575

76+
# Adding sso_availability to MULTIPLE_VALUES_FIELDS to allow filtering institutions by multiple sso_availability values, e.g. ?filter[sso_availability]=[Unavailable,Hidden]
77+
MULTIPLE_VALUES_FIELDS = ListFilterMixin.MULTIPLE_VALUES_FIELDS + ['sso_availability']
78+
7679
required_read_scopes = [CoreScopes.INSTITUTION_READ]
7780
required_write_scopes = [CoreScopes.NULL]
7881
model_class = Institution

api_tests/institutions/views/test_institution_list.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ def institution_one(self):
1515
def institution_two(self):
1616
return InstitutionFactory()
1717

18+
@pytest.fixture()
19+
def institution_three(self):
20+
return InstitutionFactory()
21+
1822
@pytest.fixture()
1923
def url_institution(self):
2024
return f'/{API_BASE}institutions/'
@@ -47,3 +51,32 @@ def test_does_not_return_deleted_institution(
4751
assert len(res.json['data']) == 1
4852
assert institution_one._id not in ids
4953
assert institution_two._id in ids
54+
55+
def test_sso_availability_filter(
56+
self, app, institution_one, institution_two, institution_three, url_institution
57+
):
58+
institution_one.sso_availability = 'Unavailable'
59+
institution_one.save()
60+
61+
institution_two.sso_availability = 'Public'
62+
institution_two.save()
63+
64+
institution_three.sso_availability = 'Hidden'
65+
institution_three.save()
66+
67+
res = app.get(f'{url_institution}?filter[sso_availability]=[Unavailable]')
68+
assert res.status_code == 200
69+
70+
ids = [each['id'] for each in res.json['data']]
71+
assert len(res.json['data']) == 1
72+
assert institution_one._id in ids
73+
assert institution_two._id not in ids
74+
75+
res = app.get(f'{url_institution}?filter[sso_availability]=[Unavailable,Hidden]')
76+
assert res.status_code == 200
77+
78+
ids = [each['id'] for each in res.json['data']]
79+
assert len(res.json['data']) == 2
80+
assert institution_one._id in ids
81+
assert institution_three._id in ids
82+
assert institution_two._id not in ids

0 commit comments

Comments
 (0)