diff --git a/brandfolder/organization.py b/brandfolder/organization.py index b717610..c1baa8c 100644 --- a/brandfolder/organization.py +++ b/brandfolder/organization.py @@ -1,8 +1,8 @@ from brandfolder.resource import Resource -from brandfolder.resource_container import ResourceContainer -from brandfolder.brandfolder import Brandfolder +from brandfolder.resource_container import ResourceContainer, ModifiedResourceContainer from brandfolder.asset import Asset from brandfolder.attachment import Attachment +from brandfolder.brandfolder import Brandfolder class Organization(Resource): @@ -11,9 +11,10 @@ class Organization(Resource): def __init__(self, client, **kwargs): super().__init__(client, **kwargs) + self.brandfolders = ResourceContainer(client, Brandfolder, parent=self) + self.assets = ModifiedResourceContainer(client, Asset, parent=self) + self.attachments = ModifiedResourceContainer(client, Attachment, parent=self) - self.assets = ResourceContainer(client, Asset, parent=self) - self.attachments = ResourceContainer(client, Attachment, parent=self) def __repr__(self): return f'<{self.resource_name} {self.attributes["slug"]}: {self.id}>' diff --git a/brandfolder/resource_container.py b/brandfolder/resource_container.py index ab2b784..f0f6ca9 100644 --- a/brandfolder/resource_container.py +++ b/brandfolder/resource_container.py @@ -29,6 +29,21 @@ def fetch(self, params=None, per=None, page=None, **kwargs): return [self.resource_class(self.client, data=data, included=included) for data in res['data']] + def paginated_fetch(self, params=None, per=None, page=None, **kwargs): + if params is None: + params = {} + + if per: + params['per'] = per + if page: + params['page'] = page + + res = self.client.get(endpoint=self.endpoint, params=params, **kwargs) + included = res.get('included', []) + + return [self.resource_class(self.client, data=data, included=included) + for data in res['data']], res['meta'] + def first(self, params=None, **kwargs): if params is None: params = {} @@ -45,3 +60,52 @@ def fetch_by_id(self, id, **kwargs): def search(self, query_params, **kwargs): params = {'search': query_params, **kwargs} return self.fetch(params=params) + + +class ModifiedResourceContainer(ResourceContainer): + """ + ModifiedResourceContainer is a modified resource container for organizations to fetch assets and attachments + without using the deprecated endpoints /organizations/{id}/assets and /organizations/{id}/attachments + """ + restricted = ['assets', 'attachments'] + + def fetch(self, params=None, per=100, page=1, **kwargs): + total_resources_to_fetch = per * page + + if self.parent \ + and self.parent.resource_type == 'organizations' \ + and self.resource_type in self.restricted: + + resources = [] + stop_op = False + + brandfolders = self.parent.brandfolders.fetch() + + while len(resources) < total_resources_to_fetch and not stop_op: + for i, brandfolder in enumerate(brandfolders): + method = getattr(brandfolder, 'assets') if self.resource_type == 'assets' else getattr(brandfolder, + 'attachments') + + stop_page_for_this_bf = False + p = 1 + while stop_page_for_this_bf is False: + fetched_resources, meta = method.paginated_fetch(per=100, page=p, **kwargs) + resources.extend(fetched_resources) + if len(resources) >= total_resources_to_fetch or len(fetched_resources) == 0 or meta[ + 'total_pages'] == p: + stop_page_for_this_bf = True + else: + p += 1 + + if i == len(brandfolders) - 1: + stop_op = True + break + + if len(resources) >= total_resources_to_fetch: + resources = resources[:total_resources_to_fetch] + break + + return resources[-per:] + else: + r = ResourceContainer(self.client, self.resource_class, self.parent) + return r.fetch(params=params, per=per, page=page, **kwargs) \ No newline at end of file