diff --git a/connect_ext_ppr/filters.py b/connect_ext_ppr/filters.py index 9758c92..746627a 100644 --- a/connect_ext_ppr/filters.py +++ b/connect_ext_ppr/filters.py @@ -3,7 +3,9 @@ from fastapi_filter import FilterDepends, with_prefix from fastapi_filter.contrib.sqlalchemy import Filter -from connect_ext_ppr.models.deployment import Deployment, DeploymentRequest +from connect_ext_ppr.models.deployment import ( + Deployment, DeploymentRequest, MarketplaceConfiguration, +) from connect_ext_ppr.models.ppr import PPRVersion @@ -16,6 +18,7 @@ class Constants(Filter.Constants): class PPRVersionFilter(Filter): + id: Optional[str] version: Optional[int] class Constants(Filter.Constants): @@ -36,3 +39,13 @@ class DeploymentRequestFilter(Filter): class Constants(Filter.Constants): model = DeploymentRequest + + +class MarketplaceConfigurationFilter(Filter): + marketplace: Optional[str] + ppr: Optional[PPRVersionFilter] = FilterDepends(with_prefix('ppr', PPRVersionFilter)) + + order_by: Optional[List[str]] + + class Constants(Filter.Constants): + model = MarketplaceConfiguration diff --git a/connect_ext_ppr/webapp.py b/connect_ext_ppr/webapp.py index 4b5239f..9c669e2 100644 --- a/connect_ext_ppr/webapp.py +++ b/connect_ext_ppr/webapp.py @@ -36,7 +36,9 @@ VerboseBaseSession, ) from connect_ext_ppr.errors import ExtensionHttpError, ExtensionValidationError -from connect_ext_ppr.filters import DeploymentFilter, DeploymentRequestFilter +from connect_ext_ppr.filters import ( + DeploymentFilter, DeploymentRequestFilter, MarketplaceConfigurationFilter, +) from connect_ext_ppr.models.configuration import Configuration from connect_ext_ppr.models.deployment import ( Deployment, @@ -278,6 +280,7 @@ def list_deployment_request_tasks( def list_deployment_request_marketplaces( self, depl_req_id: str, + m_filter: MarketplaceConfigurationFilter = FilterDepends(MarketplaceConfigurationFilter), pagination_params: PaginationParams = Depends(), response: Response = None, db: VerboseBaseSession = Depends(get_db), @@ -290,6 +293,8 @@ def list_deployment_request_marketplaces( marketplaces = db.query(MarketplaceConfiguration).options( selectinload(MarketplaceConfiguration.ppr), ).filter_by(deployment_request=dr.id) + marketplaces = m_filter.filter(marketplaces) + marketplaces = m_filter.sort(marketplaces) marketplaces = apply_pagination(marketplaces, db, pagination_params, response) marketplaces_pprs = {m.marketplace: m.ppr for m in marketplaces} @@ -660,6 +665,7 @@ def add_ppr( def get_marketplaces_by_deployment( self, deployment_id: str, + m_filter: MarketplaceConfigurationFilter = FilterDepends(MarketplaceConfigurationFilter), pagination_params: PaginationParams = Depends(), response: Response = None, client: ConnectClient = Depends(get_installation_client), @@ -671,6 +677,8 @@ def get_marketplaces_by_deployment( mkplc_configs = db.query(MarketplaceConfiguration).options( selectinload(MarketplaceConfiguration.ppr), ).filter_by(deployment_id=deployment_id, active=True) + mkplc_configs = m_filter.filter(mkplc_configs) + mkplc_configs = m_filter.sort(mkplc_configs) mkplc_configs = apply_pagination(mkplc_configs, db, pagination_params, response) mkplc_ids = [m.marketplace for m in mkplc_configs] diff --git a/tests/api/test_deployment_requests.py b/tests/api/test_deployment_requests.py index 6a12fff..e42ce5e 100644 --- a/tests/api/test_deployment_requests.py +++ b/tests/api/test_deployment_requests.py @@ -320,8 +320,6 @@ def test_get_deployment_request_not_found( (('pending', None), ('error', 'An Error message!')), ) def test_list_deployment_request_tasks( - dbsession, - mocker, deployment_factory, deployment_request_factory, installation, @@ -366,7 +364,6 @@ def test_list_deployment_request_tasks( def test_list_deployment_request_tasks_not_found( - dbsession, deployment_factory, deployment_request_factory, installation, @@ -966,6 +963,49 @@ def test_list_deployment_request_marketplaces( assert response.json() == expected_response +def test_list_deployment_request_marketplaces_filters( + mocker, + deployment_factory, + deployment_request_factory, + installation, + api_client, + marketplace, + marketplace_config_factory, + ppr_version_factory, +): + m1 = marketplace + marketplaces = [m1] + + mocker.patch( + 'connect_ext_ppr.webapp.get_marketplaces', + return_value=marketplaces, + ) + dep1 = deployment_factory(account_id=installation['owner']['id']) + ppr = ppr_version_factory(deployment=dep1) + + dr1 = deployment_request_factory(deployment=dep1) + + marketplace_config_factory(deployment_request=dr1, marketplace_id=m1['id']) + marketplace_config_factory(deployment_request=dr1, marketplace_id='MP-12344', ppr_id=ppr.id) + marketplace_config_factory(deployment_request=dr1, marketplace_id='MP-12345') + + marketplace_config_factory(deployment=dep1, marketplace_id=m1['id']) + marketplace_config_factory(deployment=dep1, marketplace_id='MP-12344') + marketplace_config_factory(deployment=dep1, marketplace_id='MP-124-114') + + response = api_client.get( + f"/api/deployments/requests/{dr1.id}/marketplaces?marketplace={m1['id']}", + installation=installation, + ) + + assert response.status_code == 200 + assert response.json() == [{ + 'id': m1['id'], + 'name': m1['name'], + 'icon': m1['icon'], + }], response.json() + + def test_list_deployment_request_marketplaces_not_found( deployment_factory, deployment_request_factory, diff --git a/tests/models/test_deployment.py b/tests/models/test_deployment.py index dd6da03..4472ab0 100644 --- a/tests/models/test_deployment.py +++ b/tests/models/test_deployment.py @@ -163,3 +163,46 @@ def test_generate_all_next_verbose_id( dbsession.refresh(task) assert f'TSK-{suffix}-00{index}' == task.id index += 1 + + +def test_list_deployment_request_marketplaces_filters( + mocker, + deployment_factory, + deployment_request_factory, + installation, + api_client, + marketplace, + marketplace_config_factory, + ppr_version_factory, +): + m1 = marketplace + marketplaces = [m1] + + mocker.patch( + 'connect_ext_ppr.webapp.get_marketplaces', + return_value=marketplaces, + ) + dep1 = deployment_factory(account_id=installation['owner']['id']) + ppr = ppr_version_factory(deployment=dep1) + + dr1 = deployment_request_factory(deployment=dep1) + + marketplace_config_factory(deployment_request=dr1, marketplace_id=m1['id']) + marketplace_config_factory(deployment_request=dr1, marketplace_id='MP-12344', ppr_id=ppr.id) + marketplace_config_factory(deployment_request=dr1, marketplace_id='MP-12345') + + marketplace_config_factory(deployment=dep1, marketplace_id=m1['id']) + marketplace_config_factory(deployment=dep1, marketplace_id='MP-12344') + marketplace_config_factory(deployment=dep1, marketplace_id='MP-124-114') + + response = api_client.get( + f"/api/deployments/requests/{dr1.id}/marketplaces?marketplace={m1['id']}", + installation=installation, + ) + + assert response.status_code == 200 + assert response.json() == [{ + 'id': m1['id'], + 'name': m1['name'], + 'icon': m1['icon'], + }], response.json()