I want to download a series of file geodatabases from ArcGIS Online after they've successfully exported from their respective feature classes. I want to start all of the exports at the same time, let them all run simultaneously, then download them.
In order to do that, I've put together the following script. The problem is, though, I can't get a status on some of the geodatabases.
Here's the script:
### BEGIN SCRIPT ###
from arcgis.gis import GIS,Item,User
from datetime import datetime as dt
import os,smtplib
#Define Function to Send Email
def sendError(message):
print("\tSending results in email.")
fromaddr = 'you@gmail.com'
toaddrs = 'me@gmail.com'
username = 'user@gmail.com'
password = '1234abcd'
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr,toaddrs,message)
print ("\tMail Sent!")
server.quit()
try:
#Set login information for AGO
username = "user_name"
password = "pass_word"
#Set GIS environment
gis=GIS(url="https://city.maps.arcgis.com",username=username,password=password)
#Assign User as 'user_name' to gain work with citizen reporter's content
user = User(gis,'user_name',None)
#Set datestamp variable
datestamp = dt.now().strftime("%Y%m%d")
#Assign path for backup folder; create it if it doesn't exist
backup_folder = 'AGO_backup_' + datestamp
backup_folder_path = os.path.join(r'AGO_backups',backup_folder)
if not os.path.exists(backup_folder_path):
os.makedirs(backup_folder_path)
#Assemble list of folders for citizen_reporter user
folder_list = user.folders
#Create list for database items
db_list = []
itemID_list = []
counter = 0
#Go to 'Report Layers' folder, then export and download all items
for folder in folder_list:
if folder['title'] == 'Feature Layers':
item_list = user.items(folder)
for item in item_list:
item_name = str(item['title']) + '_' + datestamp
if item['type'] == 'Feature Service':
db_list.append(item_name)
print('exporting %s' % item_name)
item.export(item_name,'File Geodatabase', None, True)
counter += 1
#Download the geodatabases that were just exported
print(db_list) while len(itemID_list) < counter:
for db in db_list:
gdb = gis.content.search(query = db)
print('%s: %s' % (db,gdb[0].status()['statusMessage']))
if gdb[0].status()['statusMessage'] == 'completed':
if gdb[0].status()['itemId'] not in itemID_list:
itemID_list.append(gdb[0].status()['itemId'])
print('%s %s added to list' % (db,gdb[0].status()['itemId']))
for itemID in itemID_list:
itemObject = gis.content.get(itemID)
itemObject.download(backup_folder_path)
itemObject.delete() except Exception:
e = sys.exc_info()[1]
body = "Backup of AGO data failed. \nError: " + str(e)
message = 'Subject: %s\n\n%s' % ("AGO Backup_FeatureLayers.py failed...", body)
sendError(message)### END SCRIPT ###
Here is an example of the messages I get:
Craig,
Did you find a solution for this?
Could you essentially run an ArcPy task to check if the item exists first?
Adrian,
I started working with someone at ESRI and he's been very helpful, but haven't quite come up with a solution yet.
I appreciate the suggestion, but I don't think the Exists function will serve this purpose. I'm specifically interested in retrieving the Status of an item because I need to know when it's finished exporting, not just that it has been created.