From 7403a2e0843d2146b44c87e6766885060e7fc6d3 Mon Sep 17 00:00:00 2001 From: Matt Prahl Date: May 23 2017 10:02:31 +0000 Subject: Add the ability to filter projects by owner --- diff --git a/pagure/api/project.py b/pagure/api/project.py index d39c4d9..9839ead 100644 --- a/pagure/api/project.py +++ b/pagure/api/project.py @@ -224,6 +224,9 @@ def api_projects(): | | | | having commit rights | | | | | to it | +---------------+----------+---------------+--------------------------+ + | ``owner`` | string | Optional | | Filters the projects | + | | | | by ownership | + +---------------+----------+---------------+--------------------------+ | ``namespace`` | string | Optional | | Filters the projects | | | | | by namespace | +---------------+----------+---------------+--------------------------+ @@ -323,6 +326,7 @@ def api_projects(): username = flask.request.values.get('username', None) fork = flask.request.values.get('fork', None) namespace = flask.request.values.get('namespace', None) + owner = flask.request.values.get('owner', None) pattern = flask.request.values.get('pattern', None) if str(fork).lower() in ['1', 'true']: @@ -336,7 +340,7 @@ def api_projects(): projects = pagure.lib.search_projects( SESSION, username=username, fork=fork, tags=tags, pattern=pattern, - private=private, namespace=namespace) + private=private, namespace=namespace, owner=owner) if not projects: raise pagure.exceptions.APIError( @@ -350,7 +354,8 @@ def api_projects(): 'username': username, 'fork': fork, 'pattern': pattern, - 'namespace': namespace + 'namespace': namespace, + 'owner': owner } }) return jsonout diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index b7275c5..d10f775 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1791,14 +1791,19 @@ def search_projects( session, username=None, fork=None, tags=None, namespace=None, pattern=None, start=None, limit=None, count=False, sort=None, - exclude_groups=None, private=None): + exclude_groups=None, private=None, owner=None): '''List existing projects ''' projects = session.query( sqlalchemy.distinct(model.Project.id) ) - if username is not None: + if owner is not None and username is not None: + raise RuntimeError('You cannot supply both a username and an owner ' + 'as parameters in the `search_projects` function') + elif owner is not None: + projects = projects.join(model.User).filter(model.User.user == owner) + elif username is not None: projects = projects.filter( # User created the project sqlalchemy.and_( diff --git a/tests/test_pagure_flask_api_project.py b/tests/test_pagure_flask_api_project.py index 990bea9..1174580 100644 --- a/tests/test_pagure_flask_api_project.py +++ b/tests/test_pagure_flask_api_project.py @@ -197,6 +197,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): "args": { "fork": None, "namespace": None, + "owner": None, "pattern": None, "tags": ["infra"], "username": None @@ -237,6 +238,129 @@ class PagureFlaskApiProjecttests(tests.Modeltests): } self.assertDictEqual(data, expected_data) + output = self.app.get('/api/0/projects?owner=pingou') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['projects'][0]['date_created'] = "1436527638" + data['projects'][1]['date_created'] = "1436527638" + data['projects'][2]['date_created'] = "1436527638" + expected_data = { + "args": { + "fork": None, + "namespace": None, + "owner": "pingou", + "pattern": None, + "tags": [], + "username": None + }, + "projects": [ + { + "access_groups": { + "admin": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [], + "commit": [], + "owner": ["pingou"], + "ticket": [] + }, + "close_status": [ + "Invalid", + "Insufficient data", + "Fixed", + "Duplicate" + ], + "custom_keys": [], + "date_created": "1436527638", + "description": "test project #1", + "fullname": "test", + "id": 1, + "milestones": {}, + "name": "test", + "namespace": None, + "parent": None, + "priorities": {}, + "tags": ["infra"], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "access_groups": { + "admin": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [], + "commit": [], + "owner": ["pingou"], + "ticket": [] + }, + "close_status": [ + "Invalid", + "Insufficient data", + "Fixed", + "Duplicate" + ], + "custom_keys": [], + "date_created": "1436527638", + "description": "test project #2", + "fullname": "test2", + "id": 2, + "milestones": {}, + "name": "test2", + "namespace": None, + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + }, + { + "access_groups": { + "admin": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [], + "commit": [], + "owner": ["pingou"], + "ticket": [] + }, + "close_status": [ + "Invalid", + "Insufficient data", + "Fixed", + "Duplicate" + ], + "custom_keys": [], + "date_created": "1436527638", + "description": "namespaced test project", + "fullname": "somenamespace/test3", + "id": 3, + "milestones": {}, + "name": "test3", + "namespace": "somenamespace", + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ], + "total_projects": 3 + } + self.assertDictEqual(data, expected_data) + output = self.app.get('/api/0/projects?username=pingou') self.assertEqual(output.status_code, 200) data = json.loads(output.data) @@ -247,6 +371,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): "args": { "fork": None, "namespace": None, + "owner": None, "pattern": None, "tags": [], "username": "pingou" @@ -364,6 +489,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): "args": { "fork": None, "namespace": None, + "owner": None, "pattern": None, "tags": ["infra"], "username": "pingou", @@ -411,6 +537,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): expected_data = { "args": { "fork": None, + "owner": None, "namespace": "somenamespace", "pattern": None, "tags": [], diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 29f90c0..842b410 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -1028,6 +1028,7 @@ class PagurePrivateRepotest(tests.Modeltests): "args": { "fork": None, "namespace": None, + "owner": None, "pattern": None, "tags": [], "username": "pingou" @@ -1080,6 +1081,7 @@ class PagurePrivateRepotest(tests.Modeltests): "args": { "fork": None, "namespace": None, + "owner": None, "pattern": None, "tags": ["infra"], "username": "pingou"