Allow Project Groups to be filtered by project
Currently there is no easy way to find the set of Project Groups that a specific Project belongs to. This commit adds a parameter to the Project Groups browse endpoint to enable filtering by Project ID to add this functionality. Change-Id: I7b09665bb554c19e8cc4074ce0d1813f3adc4218
This commit is contained in:
parent
37a5ff711b
commit
9ec8875c4c
@ -166,9 +166,10 @@ class ProjectGroupsController(rest.RestController):
|
|||||||
@decorators.db_exceptions
|
@decorators.db_exceptions
|
||||||
@secure(checks.guest)
|
@secure(checks.guest)
|
||||||
@wsme_pecan.wsexpose([wmodels.ProjectGroup], int, int, int, wtypes.text,
|
@wsme_pecan.wsexpose([wmodels.ProjectGroup], int, int, int, wtypes.text,
|
||||||
wtypes.text, int, wtypes.text, wtypes.text)
|
wtypes.text, int, int, wtypes.text, wtypes.text)
|
||||||
def get(self, marker=None, offset=None, limit=None, name=None, title=None,
|
def get(self, marker=None, offset=None, limit=None, name=None, title=None,
|
||||||
subscriber_id=None, sort_field='id', sort_dir='asc'):
|
subscriber_id=None, project_id=None, sort_field='id',
|
||||||
|
sort_dir='asc'):
|
||||||
"""Retrieve a list of projects groups.
|
"""Retrieve a list of projects groups.
|
||||||
|
|
||||||
Example::
|
Example::
|
||||||
@ -181,6 +182,7 @@ class ProjectGroupsController(rest.RestController):
|
|||||||
:param name: A string to filter the name by.
|
:param name: A string to filter the name by.
|
||||||
:param title: A string to filter the title by.
|
:param title: A string to filter the title by.
|
||||||
:param subscriber_id: The ID of a subscriber to filter by.
|
:param subscriber_id: The ID of a subscriber to filter by.
|
||||||
|
:param project_id: The ID of a project to filter by.
|
||||||
:param sort_field: The name of the field to sort on.
|
:param sort_field: The name of the field to sort on.
|
||||||
:param sort_dir: Sort direction for results (asc, desc).
|
:param sort_dir: Sort direction for results (asc, desc).
|
||||||
"""
|
"""
|
||||||
@ -200,11 +202,13 @@ class ProjectGroupsController(rest.RestController):
|
|||||||
name=name,
|
name=name,
|
||||||
title=title,
|
title=title,
|
||||||
subscriber_id=subscriber_id,
|
subscriber_id=subscriber_id,
|
||||||
|
project_id=project_id,
|
||||||
sort_field=sort_field,
|
sort_field=sort_field,
|
||||||
sort_dir=sort_dir)
|
sort_dir=sort_dir)
|
||||||
|
|
||||||
group_count = project_groups.project_group_get_count(
|
group_count = project_groups.project_group_get_count(
|
||||||
name=name, title=title, subscriber_id=subscriber_id)
|
name=name, title=title, subscriber_id=subscriber_id,
|
||||||
|
project_id=project_id)
|
||||||
|
|
||||||
# Apply the query response headers.
|
# Apply the query response headers.
|
||||||
if limit:
|
if limit:
|
||||||
|
@ -47,8 +47,8 @@ def project_group_get_by_name(name):
|
|||||||
|
|
||||||
|
|
||||||
def project_group_get_all(marker=None, limit=None, offset=None,
|
def project_group_get_all(marker=None, limit=None, offset=None,
|
||||||
subscriber_id=None, sort_field=None, sort_dir=None,
|
subscriber_id=None, project_id=None, sort_field=None,
|
||||||
**kwargs):
|
sort_dir=None, **kwargs):
|
||||||
# Sanity checks, in case someone accidentally explicitly passes in 'None'
|
# Sanity checks, in case someone accidentally explicitly passes in 'None'
|
||||||
if not sort_field:
|
if not sort_field:
|
||||||
sort_field = 'id'
|
sort_field = 'id'
|
||||||
@ -70,6 +70,16 @@ def project_group_get_all(marker=None, limit=None, offset=None,
|
|||||||
subs = subs.subquery()
|
subs = subs.subquery()
|
||||||
query = query.join(subs, subs.c.target_id == models.ProjectGroup.id)
|
query = query.join(subs, subs.c.target_id == models.ProjectGroup.id)
|
||||||
|
|
||||||
|
# Filtering by project
|
||||||
|
if project_id:
|
||||||
|
# We can filter using the project_id column in the
|
||||||
|
# project_group_mapping table, so we can skip joining the full
|
||||||
|
# projects table.
|
||||||
|
pgm = models.project_group_mapping
|
||||||
|
query = query.join(
|
||||||
|
(pgm, pgm.c.project_group_id == models.ProjectGroup.id))
|
||||||
|
query = query.filter(pgm.c.project_id == project_id)
|
||||||
|
|
||||||
query = api_base.paginate_query(query=query,
|
query = api_base.paginate_query(query=query,
|
||||||
model=models.ProjectGroup,
|
model=models.ProjectGroup,
|
||||||
limit=limit,
|
limit=limit,
|
||||||
@ -82,7 +92,7 @@ def project_group_get_all(marker=None, limit=None, offset=None,
|
|||||||
return query.all()
|
return query.all()
|
||||||
|
|
||||||
|
|
||||||
def project_group_get_count(subscriber_id=None, **kwargs):
|
def project_group_get_count(subscriber_id=None, project_id=None, **kwargs):
|
||||||
# Construct the query
|
# Construct the query
|
||||||
query = api_base.model_query(models.ProjectGroup)
|
query = api_base.model_query(models.ProjectGroup)
|
||||||
query = api_base.apply_query_filters(query=query,
|
query = api_base.apply_query_filters(query=query,
|
||||||
@ -99,6 +109,16 @@ def project_group_get_count(subscriber_id=None, **kwargs):
|
|||||||
subs = subs.subquery()
|
subs = subs.subquery()
|
||||||
query = query.join(subs, subs.c.target_id == models.ProjectGroup.id)
|
query = query.join(subs, subs.c.target_id == models.ProjectGroup.id)
|
||||||
|
|
||||||
|
# Filtering by project
|
||||||
|
if project_id:
|
||||||
|
# We can filter using the project_id column in the
|
||||||
|
# project_group_mapping table, so we can skip joining the full
|
||||||
|
# projects table.
|
||||||
|
pgm = models.project_group_mapping
|
||||||
|
query = query.join(
|
||||||
|
(pgm, pgm.c.project_group_id == models.ProjectGroup.id))
|
||||||
|
query = query.filter(pgm.c.project_id == project_id)
|
||||||
|
|
||||||
return query.count()
|
return query.count()
|
||||||
|
|
||||||
|
|
||||||
|
@ -171,6 +171,21 @@ class TestProjectGroupSearch(base.FunctionalTest):
|
|||||||
result = results.json[1]
|
result = results.json[1]
|
||||||
self.assertEqual(3, result['id'])
|
self.assertEqual(3, result['id'])
|
||||||
|
|
||||||
|
def test_search_by_project(self):
|
||||||
|
url = self.build_search_url({
|
||||||
|
'project_id': 3
|
||||||
|
})
|
||||||
|
|
||||||
|
results = self.get_json(url, expect_errors=True)
|
||||||
|
self.assertEqual(2, len(results.json))
|
||||||
|
self.assertEqual('2', results.headers['X-Total'])
|
||||||
|
self.assertFalse('X-Marker' in results.headers)
|
||||||
|
|
||||||
|
result = results.json[0]
|
||||||
|
self.assertEqual(1, result['id'])
|
||||||
|
result = results.json[1]
|
||||||
|
self.assertEqual(2, result['id'])
|
||||||
|
|
||||||
def test_search_limit(self):
|
def test_search_limit(self):
|
||||||
url = self.build_search_url({
|
url = self.build_search_url({
|
||||||
'title': 'foo',
|
'title': 'foo',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user