Enable the export of several relation field types

This commit is contained in:
Jeff Bradberry
2020-03-23 16:42:34 -04:00
parent 3860c7597f
commit e0f6af4700
2 changed files with 24 additions and 5 deletions

View File

@@ -21,6 +21,15 @@ EXPORTABLE_RESOURCES = [
] ]
EXPORTABLE_RELATIONS = [
'Roles',
'NotificationTemplates',
'Labels',
'SurveySpec',
'WorkflowJobTemplateNodes',
]
NATURAL_KEYS = { NATURAL_KEYS = {
'user': ('username',), 'user': ('username',),
'organization': ('name',), 'organization': ('name',),
@@ -35,6 +44,9 @@ NATURAL_KEYS = {
# related resources # related resources
'role': ('name', ':content_object'), 'role': ('name', ':content_object'),
'notification_template': ('organization', 'name'),
'label': ('organization', 'name'), # FIXME: label will need to be fully constructed from this
'workflow_job_template_node': ('workflow_job_template', 'identifier'),
} }
@@ -98,11 +110,18 @@ class ApiV2(base.Base):
related = {} related = {}
for k, related_endpoint in asset.related.items(): for k, related_endpoint in asset.related.items():
if k != 'roles': if not related_endpoint:
continue
if k == 'object_roles':
continue
rel = related_endpoint._create()
if rel.__class__.__name__ not in EXPORTABLE_RELATIONS:
continue continue
data = related_endpoint.get(all_pages=True) data = related_endpoint.get(all_pages=True)
if 'results' in data: if 'results' in data:
related[k] = [get_natural_key(x) for x in data.results] related[k] = [get_natural_key(x) for x in data.results]
else:
related[k] = data.json
related_fields = {'related': related} if related else {} related_fields = {'related': related} if related else {}
@@ -115,7 +134,7 @@ class ApiV2(base.Base):
if value: if value:
from awxkit.cli.options import pk_or_name from awxkit.cli.options import pk_or_name
pk = pk_or_name(self, resource, value) pk = pk_or_name(self, resource, value) # TODO: decide whether to support multiple
results = endpoint.get(id=pk).results results = endpoint.get(id=pk).results
else: else:
results = endpoint.get(all_pages=True).results results = endpoint.get(all_pages=True).results
@@ -205,7 +224,7 @@ class ApiV2(base.Base):
else: else:
pass # admin role pass # admin role
def assign_related_assets(self, resource, assets): def _assign_related_assets(self, resource, assets):
for asset in assets: for asset in assets:
page = self._get_by_natural_key(asset['natural_key']) page = self._get_by_natural_key(asset['natural_key'])
# FIXME: deal with `page is None` case # FIXME: deal with `page is None` case
@@ -234,7 +253,7 @@ class ApiV2(base.Base):
# FIXME: should we delete existing unpatched assets? # FIXME: should we delete existing unpatched assets?
# for resource, assets in data.items(): # for resource, assets in data.items():
# self.assign_related_assets(resource, assets) # self._assign_related_assets(resource, assets)
page.register_page(resources.v2, ApiV2) page.register_page(resources.v2, ApiV2)

View File

@@ -273,7 +273,7 @@ class Page(object):
def get(self, all_pages=False, **query_parameters): def get(self, all_pages=False, **query_parameters):
r = self.connection.get(self.endpoint, query_parameters) r = self.connection.get(self.endpoint, query_parameters)
page = self.page_identity(r) page = self.page_identity(r)
if all_pages and page.next: if all_pages and getattr(page, 'next', None):
paged_results = [r.json()['results']] paged_results = [r.json()['results']]
while page.next: while page.next:
r = self.connection.get(self.next, query_parameters) r = self.connection.get(self.next, query_parameters)