diff --git a/connect/resource/automation.py b/connect/resource/automation.py index a24f1df..5e539fa 100644 --- a/connect/resource/automation.py +++ b/connect/resource/automation.py @@ -17,16 +17,13 @@ class AutomationResource(BaseResource): limit = 1000 - def build_filter(self, status='pending'): - # type: (str) -> Dict[str, Any] - filters = super(AutomationResource, self).build_filter() - if status: - filters['status'] = status - return filters + def filters(self, status='pending', **kwargs): + # type: (str, Dict[str, Any]) -> Dict[str, Any] + return super(AutomationResource, self).filters(status=status, **kwargs) def process(self): # type: () -> None - for request in self.list: + for request in self.list(): self.dispatch(request) def dispatch(self, request): diff --git a/connect/resource/base.py b/connect/resource/base.py index 9c42851..f51fc70 100644 --- a/connect/resource/base.py +++ b/connect/resource/base.py @@ -120,33 +120,13 @@ def __init__(self, config=None): raise AttributeError('Resource name not specified in class {}. ' 'Add an attribute `resource` with the name of the resource' .format(self.__class__.__name__)) - self.__api = ApiClient(config, self.__class__.resource) - - @property - def _api(self): - # type: () -> ApiClient - return self.__api + self._api = ApiClient(config, self.__class__.resource) @property def config(self): # type: () -> Config return self._api.config - @property - def list(self): - # type: () -> List[Any] - filters = self.build_filter() - logger.info('Get list request by filter - {}'.format(filters)) - response, _ = self._api.get(params=filters) - return self._load_schema(response) - - def build_filter(self): - # type: () -> Dict[str, Any] - res_filter = {} - if self.limit: - res_filter['limit'] = self.limit - return res_filter - def get(self, pk): # type: (str) -> Any response, _ = self._api.get(path=pk) @@ -154,6 +134,22 @@ def get(self, pk): if isinstance(objects, list) and len(objects) > 0: return objects[0] + def filters(self, **kwargs): + # type: (Dict[str, Any]) -> Dict[str, Any] + filters = {} + if self.limit: + filters['limit'] = self.limit + for key, val in kwargs.items(): + filters[key] = val + return filters + + def list(self, filters=None): + # type: (Dict[str, Any]) -> List[Any] + filters = filters or self.filters() + logger.info('Get list request with filters - {}'.format(filters)) + response, _ = self._api.get(params=filters) + return self._load_schema(response) + def _load_schema(self, response, many=None, schema=None): # type: (str, bool, BaseSchema) -> Union[List[Any], Any] schema = schema or self.schema diff --git a/connect/resource/fulfillment_automation.py b/connect/resource/fulfillment_automation.py index 1795e4e..fb9119e 100644 --- a/connect/resource/fulfillment_automation.py +++ b/connect/resource/fulfillment_automation.py @@ -21,9 +21,9 @@ class FulfillmentAutomation(AutomationResource): resource = 'requests' schema = FulfillmentSchema(many=True) - def build_filter(self, status='pending'): - # type: (str) -> Dict[str, Any] - filters = super(FulfillmentAutomation, self).build_filter(status) + def filters(self, status='pending', **kwargs): + # type: (str, Dict[str, Any]) -> Dict[str, Any] + filters = super(FulfillmentAutomation, self).filters(status=status, **kwargs) if self.config.products: filters['asset.product.id__in'] = ','.join(self.config.products) return filters diff --git a/connect/resource/template.py b/connect/resource/template.py index 7114983..89d91aa 100644 --- a/connect/resource/template.py +++ b/connect/resource/template.py @@ -4,7 +4,7 @@ This file is part of the Ingram Micro Cloud Blue Connect SDK. Copyright (c) 2019 Ingram Micro. All Rights Reserved. """ -from typing import List, Any +from typing import List, Any, Dict from connect.models import ActivationTemplateResponse, ActivationTileResponse from .base import BaseResource @@ -17,9 +17,8 @@ class TemplateResource(BaseResource): """ resource = 'templates' - @property - def list(self): - # type: () -> List[Any] + def list(self, filters=None): + # type: (Dict[str, Any]) -> List[Any] raise AttributeError('This resource do not have method `list`') def render(self, pk, request_id): diff --git a/connect/resource/usage_automation.py b/connect/resource/usage_automation.py index 962fa0b..ffc4406 100644 --- a/connect/resource/usage_automation.py +++ b/connect/resource/usage_automation.py @@ -24,9 +24,9 @@ class UsageAutomation(AutomationResource): resource = 'usage/files' schema = FileSchema(many=True) - def build_filter(self, status='listed'): - # type: (str) -> Dict[str, Any] - filters = super(UsageAutomation, self).build_filter(status) + def filters(self, status='listed', **kwargs): + # type: (str, Dict[str, Any]) -> Dict[str, Any] + filters = super(UsageAutomation, self).filters(status, **kwargs) if self.config.products: filters['product__id'] = ','.join(self.config.products) return filters diff --git a/tests/test_models.py b/tests/test_models.py index 7709529..b391e45 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -59,7 +59,7 @@ def test_create_model_from_response(): # Get requests from response resource = FulfillmentAutomation() - requests = resource.list + requests = resource.list() request_obj = resource.get(pk='PR-000-000-000') # Assert that all properties exist @@ -100,7 +100,7 @@ def test_create_model_from_response(): @patch('requests.get', MagicMock(return_value=_get_response2_ok())) def test_fulfillment_items(): # Get request - requests = FulfillmentAutomation().list + requests = FulfillmentAutomation().list() assert isinstance(requests, list) assert len(requests) == 1 request = requests[0] @@ -131,7 +131,7 @@ def test_fulfillment_items(): @patch('requests.get', MagicMock(return_value=_get_response2_ok())) def test_asset_methods(): # Get asset - requests = FulfillmentAutomation().list + requests = FulfillmentAutomation().list() assert len(requests) == 1 assert isinstance(requests[0], Fulfillment) asset = requests[0].asset diff --git a/tests/test_tier_config.py b/tests/test_tier_config.py index a148bf1..45500c7 100644 --- a/tests/test_tier_config.py +++ b/tests/test_tier_config.py @@ -42,7 +42,7 @@ def _get_response_ok_invalid_product(): @patch('requests.get', MagicMock(return_value=_get_response_ok())) def test_create_resource(): - requests = TierConfigAutomation().list + requests = TierConfigAutomation().list() assert isinstance(requests, list) assert len(requests) == 1 diff --git a/tests/test_usage.py b/tests/test_usage.py index d55166a..1549c05 100644 --- a/tests/test_usage.py +++ b/tests/test_usage.py @@ -33,7 +33,7 @@ def _get_response_ok2(): @patch('requests.get', MagicMock(return_value=_get_response_ok())) def test_create_resource(): - requests = UsageAutomation().list + requests = UsageAutomation().list() assert isinstance(requests, list) assert len(requests) == 8 diff --git a/tests/test_usage_file.py b/tests/test_usage_file.py index ecf9987..fdb2a6d 100644 --- a/tests/test_usage_file.py +++ b/tests/test_usage_file.py @@ -35,7 +35,7 @@ def _get_response_ok(*args, **kwargs): @patch('requests.get', MagicMock(return_value=_get_response_ok())) def test_create_resource(): - requests = UsageFileAutomationTester().list + requests = UsageFileAutomationTester().list() assert isinstance(requests, list) assert len(requests) == 1