diff --git a/openslides_backend/presenter/search_users.py b/openslides_backend/presenter/search_users.py index 6cc1ad472..84a7d0e13 100644 --- a/openslides_backend/presenter/search_users.py +++ b/openslides_backend/presenter/search_users.py @@ -21,7 +21,7 @@ from .base import BasePresenter from .presenter import register_presenter -search_fields = [["username"], ["first_name", "last_name", "email"]] +search_fields = [["username"], ["saml_id"], ["first_name", "last_name", "email"]] all_fields = [field for fields in search_fields for field in fields] search_users_schema = fastjsonschema.compile( @@ -57,8 +57,9 @@ @register_presenter("search_users") class SearchUsers(BasePresenter): """ - Matches users to the search criteria either by username or by exact match of first name, last - name AND email. Returns a list of users for each search criteria in payload order. + Matches users to the search criteria either by username or saml id or + by exact match of first name, last name AND email. + Returns a list of users for each search criteria in payload order. """ schema = search_users_schema @@ -97,11 +98,12 @@ def get_result(self) -> List[List[Dict[str, Any]]]: current_result = [] for instance in instances.values(): for search_def in search_fields: - if all( - (instance.get(field) or "").lower() == search[field] - for field in search_def - ): - current_result.append(instance) + if any(search[field] for field in search_def): + if all( + (instance.get(field) or "").lower() == search[field] + for field in search_def + ): + current_result.append(instance) break result.append(current_result) return result diff --git a/tests/system/presenter/test_search_users.py b/tests/system/presenter/test_search_users.py index 901de93ec..c041be3d0 100644 --- a/tests/system/presenter/test_search_users.py +++ b/tests/system/presenter/test_search_users.py @@ -19,6 +19,7 @@ def setUp(self) -> None: "first_name": "first2", "last_name": "last2", "username": "user2", + "saml_id": None, } self.user3 = { "id": 3, @@ -26,6 +27,7 @@ def setUp(self) -> None: "first_name": "first3", "last_name": "last3", "username": "user3", + "saml_id": None, } self.user4 = { "id": 4, @@ -33,7 +35,17 @@ def setUp(self) -> None: "first_name": "first4", "last_name": "last4", "username": "user4", + "saml_id": None, } + self.user5 = { + "id": 5, + "email": "userX@test.de", + "first_name": "first5", + "last_name": "last5", + "username": "user5", + "saml_id": "saml5", + } + self.set_models( { "user/2": { @@ -45,6 +57,9 @@ def setUp(self) -> None: "user/4": { **self.user4, }, + "user/5": { + **self.user5, + }, } ) @@ -87,15 +102,32 @@ def test_search_fields_variations(self) -> None: "first_name": "first4", "last_name": "last4", }, + { + "username": "user2", + "saml_id": "saml5", + }, + { + "saml_id": "saml5", + "email": "userX@test.de", + "first_name": "first4", + "last_name": "last4", + }, + { + "username": "userX", + "saml_id": "saml5", + }, ], }, ) self.assertEqual(status_code, 200) - self.assertEqual(len(data), 4) + self.assertEqual(len(data), 7) self.assertEqual(data[0], [self.user2]) self.assertEqual(data[1], []) self.assertEqual(data[2], [self.user2]) self.assertEqual(data[3], [self.user4]) + self.assertEqual(data[4], [self.user2]) + self.assertEqual(data[5], [self.user5]) + self.assertEqual(data[6], []) def test_search_ignore_case_strip(self) -> None: status_code, data = self.request( @@ -129,7 +161,7 @@ def test_search_all_fields_username_match(self) -> None: "search": [ { "username": "user2", - "email": "user4@test.de", + "email": "userX@test.de", "first_name": "first4", "last_name": "last4", },