Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions brandfolder/organization.py
Original file line number Diff line number Diff line change
@@ -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):
Expand All @@ -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}>'
64 changes: 64 additions & 0 deletions brandfolder/resource_container.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {}
Expand All @@ -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)