diff --git a/api/institutions/serializers.py b/api/institutions/serializers.py index 5beffe60348..3f60cfc65ac 100644 --- a/api/institutions/serializers.py +++ b/api/institutions/serializers.py @@ -29,10 +29,12 @@ class InstitutionSerializer(JSONAPISerializer): 'id', 'name', 'auth_url', + 'sso_availability', ]) name = ser.CharField(read_only=True) id = ser.CharField(read_only=True, source='_id') + sso_availability = ser.CharField(read_only=True) description = ser.CharField(read_only=True) auth_url = ser.CharField(read_only=True) iri = ser.CharField(read_only=True, source='identifier_domain') diff --git a/api/institutions/views.py b/api/institutions/views.py index a3c0f93d0c8..b63b5efaa8d 100644 --- a/api/institutions/views.py +++ b/api/institutions/views.py @@ -73,6 +73,9 @@ class InstitutionList(JSONAPIBaseView, generics.ListAPIView, ListFilterMixin): base_permissions.TokenHasScope, ) + # Adding sso_availability to MULTIPLE_VALUES_FIELDS to allow filtering institutions by multiple sso_availability values, e.g. ?filter[sso_availability]=[Unavailable,Hidden] + MULTIPLE_VALUES_FIELDS = ListFilterMixin.MULTIPLE_VALUES_FIELDS + ['sso_availability'] + required_read_scopes = [CoreScopes.INSTITUTION_READ] required_write_scopes = [CoreScopes.NULL] model_class = Institution diff --git a/api_tests/institutions/views/test_institution_list.py b/api_tests/institutions/views/test_institution_list.py index 74cb0b6bc8f..d203b2b9313 100644 --- a/api_tests/institutions/views/test_institution_list.py +++ b/api_tests/institutions/views/test_institution_list.py @@ -15,6 +15,10 @@ def institution_one(self): def institution_two(self): return InstitutionFactory() + @pytest.fixture() + def institution_three(self): + return InstitutionFactory() + @pytest.fixture() def url_institution(self): return f'/{API_BASE}institutions/' @@ -47,3 +51,32 @@ def test_does_not_return_deleted_institution( assert len(res.json['data']) == 1 assert institution_one._id not in ids assert institution_two._id in ids + + def test_sso_availability_filter( + self, app, institution_one, institution_two, institution_three, url_institution + ): + institution_one.sso_availability = 'Unavailable' + institution_one.save() + + institution_two.sso_availability = 'Public' + institution_two.save() + + institution_three.sso_availability = 'Hidden' + institution_three.save() + + res = app.get(f'{url_institution}?filter[sso_availability]=[Unavailable]') + assert res.status_code == 200 + + ids = [each['id'] for each in res.json['data']] + assert len(res.json['data']) == 1 + assert institution_one._id in ids + assert institution_two._id not in ids + + res = app.get(f'{url_institution}?filter[sso_availability]=[Unavailable,Hidden]') + assert res.status_code == 200 + + ids = [each['id'] for each in res.json['data']] + assert len(res.json['data']) == 2 + assert institution_one._id in ids + assert institution_three._id in ids + assert institution_two._id not in ids