I am working with a team to develop a HUB site and we are finding it difficult to manage all of the AGOL items that created. One aspect in particular is understanding relationships between items and finding obsolete/unreferenced items. I wrote a python script that prints a report listing the relationships and wanted to share it - not sure if this is the right place since it isn't really a question but I couldn't figure out how to create a blog entry. You have to update lines 6 and 7 before running to customize it with your credentials and to query your items.
from arcgis.gis import GIS
import re
import json
# UPDATE THESE 2 STATEMENTS BEFORE RUNNING
AGOL = GIS(username=MY_USER_ID, password=MY_PASSWORD)
CONTENT_QUERY = MY_CONTENT_QUERY # eg "owner: %s" % 'MY_USER_ID'
REGEX = '"[0-9a-f]{32}"'
def run ():
# Build dicts of all agol items and all item descriptions (indexed by item id)
all_items = { i.id: i for i in AGOL.content.search(query = "%s" % CONTENT_QUERY, max_items=5000)}
all_item_descs = { i: "%s: %s" % (all_items[i].id, all_items[i].title) for i in all_items.keys()}
# Find the foward references for each item
item_types = set()
item_id_to_forward_refs = {lst: set() for lst in all_items.keys()}
for item_id in all_items.keys():
item_types.add(all_items[item_id].type)
try:
item_id_to_forward_refs[item_id].update([d[1:-1] for d in list(set(re.findall(REGEX, json.dumps(all_items[item_id].get_data(True)))))])
except:
pass
for rel_type in ['Map2Service', 'WMA2Code', 'Map2FeatureCollection', 'MobileApp2Code', 'Service2Data', 'Service2Service']:
item_id_to_forward_refs[item_id].update([i.id for i in all_items[item_id].related_items(rel_type, 'forward')])
# Find the backward references for each item
item_id_to_backward_refs = {lst: [] for lst in all_items.keys()}
for item_id in all_items.keys():
for i in all_items.keys():
if i in item_id_to_forward_refs[item_id]:
item_id_to_backward_refs[i].append(item_id)
# Print out the results
for item_type in item_types:
print ("\n\n========================%ss================================" % (item_type))
print ("Unreferenced")
unreferenced_item_ids = [i for i in item_id_to_backward_refs.keys() if all_items[i].type == item_type and len(item_id_to_backward_refs[i]) == 0]
print ('\n'.join( [all_item_descs[i] for i in unreferenced_item_ids] ))
print ("\n--------------------------------------------------------------------" )
print ("Referenced")
referenced_item_ids = [i for i in item_id_to_backward_refs.keys() if all_items[i].type == item_type and len(item_id_to_backward_refs[i]) > 0]
for referenced_item_id in referenced_item_ids:
print ("%s" % all_item_descs[referenced_item_id])
print ('\t' + '\n\t'.join( [all_item_descs[r] for r in item_id_to_backward_refs[referenced_item_id]] ))
if __name__ == '__main__':
run()
Solved! Go to Solution.
@DonMorrison1 really nice work Don. I can see that being useful to a lot of GIS Managers
@DonMorrison1 really nice work Don. I can see that being useful to a lot of GIS Managers
@DonMorgan Thank you for putting this together. I am trying to use it however I am new to python and am having issues with this running. I have it in Python Notebook (on Pro). I am having issues with Line 7. Currently, I have: CONTENT_QUERY = "owner: MeAs_Owner"
Is this what the Content Query is after? The Member user name?
Thanks for your time,
Jace
That string, when used in the query on line 15, should return information on all AGOL items owned by the specified user.