I have been using the below Python script for quite sometime now. It basically grabs a feature class, attachments etc in our ArcGIS online account and pulls it down to our SDE db.
For some reason it just stopped working...I am wondering if something changed in AGO that would have caused this?
I dont know if parameters changed or something else....
I know its super long but hoping someone can shed some light on this.
<SPAN class="comment token">#-------------------------------------------------------------------------------</SPAN>
<SPAN class="comment token"># Name: SyncSurvey</SPAN>
<SPAN class="comment token"># Purpose: Initiate</SPAN>
<SPAN class="comment token">#</SPAN>
<SPAN class="comment token"># Author: jame6423</SPAN>
<SPAN class="comment token">#</SPAN>
<SPAN class="comment token"># Created: 15/08/2016</SPAN>
<SPAN class="comment token"># Copyright: (c) jame6423 2016</SPAN>
<SPAN class="comment token"># Licence: <your licence></SPAN>
<SPAN class="comment token">#-------------------------------------------------------------------------------</SPAN>
<SPAN class="keyword token">import</SPAN> os<SPAN class="punctuation token">,</SPAN> tempfile<SPAN class="punctuation token">,</SPAN> shutil
<SPAN class="keyword token">import</SPAN> json<SPAN class="punctuation token">,</SPAN> re
<SPAN class="keyword token">import</SPAN> uuid
<SPAN class="keyword token">import</SPAN> datetime<SPAN class="punctuation token">,</SPAN> time<SPAN class="punctuation token">,</SPAN> pytz
<SPAN class="keyword token">import</SPAN> urllib<SPAN class="punctuation token">,</SPAN> urllib2
<SPAN class="keyword token">import</SPAN> sys
<SPAN class="keyword token">import</SPAN> arcpy
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"Start"</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Start"</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"Starting"</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">getToken</SPAN><SPAN class="punctuation token">(</SPAN>username<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">,</SPAN> password<SPAN class="operator token">=</SPAN>None<SPAN class="punctuation token">,</SPAN> portal_URL <SPAN class="operator token">=</SPAN> <SPAN class="string token"><SPAN>'</SPAN><A class="jive-link-external-small" href="https://community.esri.com/external-link.jspa?url=https%3A%2F%2Fwww.arcgis.com" target="_blank">https://www.arcgis.com</A><SPAN>'</SPAN></SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Gets a token from ArcGIS Online/Portal with the given username/password'''</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t-Getting Token'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t-Getting Token"</SPAN>
<SPAN class="keyword token">if</SPAN> password <SPAN class="operator token">==</SPAN> None<SPAN class="punctuation token">:</SPAN>
password <SPAN class="operator token">=</SPAN> getpass<SPAN class="punctuation token">.</SPAN>getpass<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
parameters <SPAN class="operator token">=</SPAN> urllib<SPAN class="punctuation token">.</SPAN>urlencode<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">{</SPAN>
<SPAN class="string token">'username'</SPAN><SPAN class="punctuation token">:</SPAN> username<SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'password'</SPAN><SPAN class="punctuation token">:</SPAN> password<SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'client'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'referer'</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'referer'</SPAN><SPAN class="punctuation token">:</SPAN> portal_URL<SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'expiration'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="number token">60</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'f'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'json'</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN>
tokenURL <SPAN class="operator token">=</SPAN> <SPAN class="string token">'{0}/sharing/rest/generateToken?'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>portal_URL<SPAN class="punctuation token">)</SPAN>
response <SPAN class="operator token">=</SPAN> urllib<SPAN class="punctuation token">.</SPAN>urlopen<SPAN class="punctuation token">(</SPAN>tokenURL<SPAN class="punctuation token">,</SPAN> parameters<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>read<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
token <SPAN class="operator token">=</SPAN> json<SPAN class="punctuation token">.</SPAN>loads<SPAN class="punctuation token">(</SPAN>response<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">'token'</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">return</SPAN> token
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">getServiceDefinition</SPAN><SPAN class="punctuation token">(</SPAN>token<SPAN class="punctuation token">,</SPAN> survey_URL<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Gets the JSON representation of the service definition.'''</SPAN>
response <SPAN class="operator token">=</SPAN> urllib<SPAN class="punctuation token">.</SPAN>urlopen<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"{0}?f=json&token={1}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>survey_URL<SPAN class="punctuation token">,</SPAN> token<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>read<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
serviceInfo <SPAN class="operator token">=</SPAN> json<SPAN class="punctuation token">.</SPAN>loads<SPAN class="punctuation token">(</SPAN>response<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN> serviceInfo
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">getUTCTimestamp</SPAN><SPAN class="punctuation token">(</SPAN>timezone<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Returns a UTC timestamp'''</SPAN>
now <SPAN class="operator token">=</SPAN> datetime<SPAN class="punctuation token">.</SPAN>datetime<SPAN class="punctuation token">.</SPAN>now<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
timeZone <SPAN class="operator token">=</SPAN> pytz<SPAN class="punctuation token">.</SPAN>timezone<SPAN class="punctuation token">(</SPAN>timezone<SPAN class="punctuation token">)</SPAN>
localNow <SPAN class="operator token">=</SPAN> timeZone<SPAN class="punctuation token">.</SPAN>localize<SPAN class="punctuation token">(</SPAN>now<SPAN class="punctuation token">)</SPAN>
utcNow <SPAN class="operator token">=</SPAN> localNow<SPAN class="punctuation token">.</SPAN>astimezone<SPAN class="punctuation token">(</SPAN>pytz<SPAN class="punctuation token">.</SPAN>utc<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN> utcNow
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">createTimestampText</SPAN><SPAN class="punctuation token">(</SPAN>datetimeObj<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Format a datetime for insertion using Calculate Fields'''</SPAN>
outText <SPAN class="operator token">=</SPAN> <SPAN class="string token">""</SPAN>
timeStringFormat <SPAN class="operator token">=</SPAN> <SPAN class="string token">"%Y-%m-%d %H:%M:%S"</SPAN>
outText <SPAN class="operator token">=</SPAN> datetimeObj<SPAN class="punctuation token">.</SPAN>strftime<SPAN class="punctuation token">(</SPAN>timeStringFormat<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN> outText
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">getSurveyTables</SPAN><SPAN class="punctuation token">(</SPAN>workspace<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="operator token">=</SPAN><SPAN class="string token">''</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Return a list of the tables participating in the survey'''</SPAN>
originalWorkspace <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> workspace
<SPAN class="comment token">#This is used in 2 contexts:</SPAN>
<SPAN class="comment token">#Downloaded GDB - tables have no prefix</SPAN>
<SPAN class="comment token">#Enterprise GDB - prefix is added to table name</SPAN>
<SPAN class="comment token">#The full table name (i.e. GDB.SCHEMA.NAME) is returned, so prefix is in the middle</SPAN>
wildcard <SPAN class="operator token">=</SPAN> <SPAN class="string token">'*{0}*'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>prefix<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">if</SPAN> prefix <SPAN class="operator token">!=</SPAN> <SPAN class="string token">''</SPAN> <SPAN class="keyword token">else</SPAN> <SPAN class="string token">'*'</SPAN>
<SPAN class="comment token">#List the Feature Classes & Tables</SPAN>
<SPAN class="comment token">#Tables also returns Attachment tables</SPAN>
featureClasses <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListFeatureClasses<SPAN class="punctuation token">(</SPAN>wildcard<SPAN class="punctuation token">)</SPAN>
tables <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListTables<SPAN class="punctuation token">(</SPAN>wildcard<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#Loop through the tables, checking for:</SPAN>
<SPAN class="comment token">#1) Is this an attachment table?</SPAN>
<SPAN class="comment token">#2) Does the prefix actually match the prefix term exactly?</SPAN>
allTables <SPAN class="operator token">=</SPAN> featureClasses
allTables<SPAN class="punctuation token">.</SPAN>extend<SPAN class="punctuation token">(</SPAN>tables<SPAN class="punctuation token">)</SPAN>
outTables <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">for</SPAN> t <SPAN class="keyword token">in</SPAN> allTables<SPAN class="punctuation token">:</SPAN>
tableName <SPAN class="operator token">=</SPAN> t<SPAN class="punctuation token">.</SPAN>split<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'.'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN>
nameParts <SPAN class="operator token">=</SPAN> tableName<SPAN class="punctuation token">.</SPAN>split<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'_'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="string token">'__ATTACH'</SPAN> <SPAN class="operator token">not</SPAN> <SPAN class="keyword token">in</SPAN> t<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">if</SPAN> nameParts<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">==</SPAN> prefix <SPAN class="operator token">or</SPAN> prefix <SPAN class="operator token">==</SPAN> <SPAN class="string token">''</SPAN><SPAN class="punctuation token">:</SPAN>
outTables<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>t<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> originalWorkspace
<SPAN class="keyword token">return</SPAN> outTables
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">getLastSynchronizationTime</SPAN><SPAN class="punctuation token">(</SPAN>workspace<SPAN class="punctuation token">,</SPAN> tableList<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Looks at the existing records in the SDE and returns the latest synchronization time'''</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t-Checking Last Sychronization'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t-Checking Last Sychronization"</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> workspace
statTables <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="comment token">#Dummy value to compare time</SPAN>
lastSync <SPAN class="operator token">=</SPAN> datetime<SPAN class="punctuation token">.</SPAN>datetime<SPAN class="punctuation token">.</SPAN>fromtimestamp<SPAN class="punctuation token">(</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> table <SPAN class="keyword token">in</SPAN> tableList<SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token">#Skip if empty table (i.e., no rows)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t\t-Checking sync on {0}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t-Checking sync on {0}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#Just use the last part of the table name</SPAN>
tableName <SPAN class="operator token">=</SPAN> table<SPAN class="punctuation token">.</SPAN>split<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"."</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN>
rowCheck <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>GetCount_management<SPAN class="punctuation token">(</SPAN>tableName<SPAN class="punctuation token">)</SPAN>
rowCount <SPAN class="operator token">=</SPAN> int<SPAN class="punctuation token">(</SPAN>rowCheck<SPAN class="punctuation token">.</SPAN>getOutput<SPAN class="punctuation token">(</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> rowCount <SPAN class="operator token">></SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">:</SPAN>
statTable <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Statistics_analysis<SPAN class="punctuation token">(</SPAN>tableName<SPAN class="punctuation token">,</SPAN> r<SPAN class="string token">'in_memory\stat_{0}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>tableName<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"SYS_TRANSFER_DATE MAX"</SPAN><SPAN class="punctuation token">)</SPAN>
statTables<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>statTable<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> s <SPAN class="keyword token">in</SPAN> statTables<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>s<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'MAX_sys_transfer_date'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> rows<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> row <SPAN class="keyword token">in</SPAN> rows<SPAN class="punctuation token">:</SPAN>
thisDate <SPAN class="operator token">=</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">if</SPAN> thisDate <SPAN class="operator token">></SPAN> lastSync<SPAN class="punctuation token">:</SPAN>
lastSync <SPAN class="operator token">=</SPAN> thisDate
<SPAN class="comment token">#If we get no results (i.e., no tables) return None</SPAN>
<SPAN class="keyword token">if</SPAN> lastSync <SPAN class="operator token">==</SPAN> datetime<SPAN class="punctuation token">.</SPAN>datetime<SPAN class="punctuation token">.</SPAN>fromtimestamp<SPAN class="punctuation token">(</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">return</SPAN> None
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t\t-Last Synchornized on {0}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>createTimestampText<SPAN class="punctuation token">(</SPAN>lastSync<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t-Last Synchornized on {0}'.format(createTimestampText(lastSync))"</SPAN>
<SPAN class="keyword token">return</SPAN> lastSync
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">getReplica</SPAN><SPAN class="punctuation token">(</SPAN>token<SPAN class="punctuation token">,</SPAN> serviceURL<SPAN class="punctuation token">,</SPAN> serviceInfo<SPAN class="punctuation token">,</SPAN> now<SPAN class="punctuation token">,</SPAN> outDir<SPAN class="operator token">=</SPAN>None<SPAN class="punctuation token">,</SPAN> outDB<SPAN class="operator token">=</SPAN><SPAN class="string token">"outSurvey.geodatabase"</SPAN><SPAN class="punctuation token">,</SPAN> lastSync<SPAN class="operator token">=</SPAN>None<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Downloads the full replica and then process client-side'''</SPAN>
<SPAN class="comment token"><SPAN># See </SPAN><A class="jive-link-external-small" href="https://community.esri.com/external-link.jspa?url=http%3A%2F%2Fresources.arcgis.com%2Fen%2Fhelp%2Farcgis-rest-api%2F%23%2FCreate_Replica%2F02r3000000rp000000%2F" target="_blank">http://resources.arcgis.com/en/help/arcgis-rest-api/#/Create_Replica/02r3000000rp000000/</A></SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t-Getting Replica'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t-Getting Replica"</SPAN>
createReplicaURL <SPAN class="operator token">=</SPAN> <SPAN class="string token">'{0}/createReplica/?f=json&token={1}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>serviceURL<SPAN class="punctuation token">,</SPAN> token<SPAN class="punctuation token">)</SPAN>
replicaParameters <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN>
<SPAN class="string token">"geometry"</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">"-180,-90,180,90"</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"geometryType"</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">"esriGeometryEnvelope"</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"inSR"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="number token">4326</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"transportType"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="string token">"esriTransportTypeUrl"</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"returnAttachments"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"returnAttachmentsDatabyURL"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="token boolean">False</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"async"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"syncModel"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="string token">"none"</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"dataFormat"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="string token">"sqlite"</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">if</SPAN> serviceInfo<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"syncCapabilities"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">"supportsAttachmentsSyncDirection"</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">==</SPAN> <SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">:</SPAN>
replicaParameters<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"attachmentsSyncDirection"</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="string token">"bidirectional"</SPAN>
layerList <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>str<SPAN class="punctuation token">(</SPAN>l<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"id"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">for</SPAN> l <SPAN class="keyword token">in</SPAN> serviceInfo<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"layers"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN>
tableList <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>str<SPAN class="punctuation token">(</SPAN>t<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"id"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">for</SPAN> t <SPAN class="keyword token">in</SPAN> serviceInfo<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"tables"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN>
layerList<SPAN class="punctuation token">.</SPAN>extend<SPAN class="punctuation token">(</SPAN>tableList<SPAN class="punctuation token">)</SPAN>
replicaParameters<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"layers"</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="string token">", "</SPAN><SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>layerList<SPAN class="punctuation token">)</SPAN>
layerQueries <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="punctuation token">}</SPAN>
createReplReq <SPAN class="operator token">=</SPAN> urllib2<SPAN class="punctuation token">.</SPAN>urlopen<SPAN class="punctuation token">(</SPAN>createReplicaURL<SPAN class="punctuation token">,</SPAN> urllib<SPAN class="punctuation token">.</SPAN>urlencode<SPAN class="punctuation token">(</SPAN>replicaParameters<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#This is asynchronous, so we get a jobId to check periodically for completion</SPAN>
thisJob <SPAN class="operator token">=</SPAN> json<SPAN class="punctuation token">.</SPAN>loads<SPAN class="punctuation token">(</SPAN>createReplReq<SPAN class="punctuation token">.</SPAN>read<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="operator token">not</SPAN> <SPAN class="string token">"statusUrl"</SPAN> <SPAN class="keyword token">in</SPAN> thisJob<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">raise</SPAN> Exception<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"invalid job: {0}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>thisJob<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
jobUrl <SPAN class="operator token">=</SPAN> thisJob<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"statusUrl"</SPAN><SPAN class="punctuation token">]</SPAN>
resultUrl <SPAN class="operator token">=</SPAN> <SPAN class="string token">""</SPAN>
<SPAN class="comment token">#Check for a max 1000 times (10000 sec = 2hr 46 min)</SPAN>
sanityCounter <SPAN class="operator token">=</SPAN> <SPAN class="number token">1000</SPAN>
<SPAN class="keyword token">while</SPAN> resultUrl <SPAN class="operator token">==</SPAN> <SPAN class="string token">""</SPAN><SPAN class="punctuation token">:</SPAN>
checkReq <SPAN class="operator token">=</SPAN> urllib2<SPAN class="punctuation token">.</SPAN>urlopen<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"{0}?f=json&token={1}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>jobUrl<SPAN class="punctuation token">,</SPAN> token<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
statusText <SPAN class="operator token">=</SPAN> checkReq<SPAN class="punctuation token">.</SPAN>read<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN>statusText<SPAN class="punctuation token">)</SPAN>
status <SPAN class="operator token">=</SPAN> json<SPAN class="punctuation token">.</SPAN>loads<SPAN class="punctuation token">(</SPAN>statusText<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="string token">"resultUrl"</SPAN> <SPAN class="keyword token">in</SPAN> status<SPAN class="punctuation token">.</SPAN>keys<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
resultUrl <SPAN class="operator token">=</SPAN> status<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"resultUrl"</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">if</SPAN> sanityCounter <SPAN class="operator token"><</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">raise</SPAN> Exception<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'took too long to make replica'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> status<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"status"</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">==</SPAN> <SPAN class="string token">"Failed"</SPAN> <SPAN class="operator token">or</SPAN> status<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"status"</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">==</SPAN> <SPAN class="string token">"CompletedWithErrors"</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">raise</SPAN> Exception<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Create Replica Issues: {0}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>status<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"status"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t\t-Check {0}: {1}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>str<SPAN class="punctuation token">(</SPAN><SPAN class="number token">1001</SPAN><SPAN class="operator token">-</SPAN>sanityCounter<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> status<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"status"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
sanityCounter <SPAN class="operator token">=</SPAN> sanityCounter <SPAN class="operator token">-</SPAN> <SPAN class="number token">1</SPAN>
time<SPAN class="punctuation token">.</SPAN>sleep<SPAN class="punctuation token">(</SPAN><SPAN class="number token">10</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#Download the sqlite .geodatabase file</SPAN>
resultReq <SPAN class="operator token">=</SPAN> urllib2<SPAN class="punctuation token">.</SPAN>urlopen<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"{0}?token={1}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>resultUrl<SPAN class="punctuation token">,</SPAN> token<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> outDir <SPAN class="operator token">==</SPAN> None<SPAN class="punctuation token">:</SPAN>
outDir <SPAN class="operator token">=</SPAN> tempfile<SPAN class="punctuation token">.</SPAN>mkdtemp<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
outFile <SPAN class="operator token">=</SPAN> os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>outDir<SPAN class="punctuation token">,</SPAN> outDB<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">with</SPAN> open<SPAN class="punctuation token">(</SPAN>outFile<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'wb'</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> output<SPAN class="punctuation token">:</SPAN>
output<SPAN class="punctuation token">.</SPAN>write<SPAN class="punctuation token">(</SPAN>resultReq<SPAN class="punctuation token">.</SPAN>read<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">del</SPAN><SPAN class="punctuation token">(</SPAN>output<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#transfer from sqlite to GDB</SPAN>
surveyGDB <SPAN class="operator token">=</SPAN> os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>outDir<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'outSurvey.gdb'</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>CopyRuntimeGdbToFileGdb_conversion<SPAN class="punctuation token">(</SPAN>outFile<SPAN class="punctuation token">,</SPAN> surveyGDB<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">del</SPAN><SPAN class="punctuation token">(</SPAN>outFile<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN> surveyGDB
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">filterRecords</SPAN><SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">,</SPAN> now<SPAN class="punctuation token">,</SPAN> lastSync<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Filter the records to those that need to be updated'''</SPAN>
<SPAN class="comment token">#Note - This excludes new entries that are *after* the timestamp</SPAN>
<SPAN class="comment token"># Depending on how active the survey is, there may have been new submissions</SPAN>
<SPAN class="comment token"># after the start of the script</SPAN>
<SPAN class="comment token"># We put in a max time to ensure consistency in operation from run to run and</SPAN>
<SPAN class="comment token"># table to table</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t-Filtering records to new set'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t-Filtering records to new set"</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> surveyGDB
nowText <SPAN class="operator token">=</SPAN> createTimestampText<SPAN class="punctuation token">(</SPAN>now<SPAN class="punctuation token">)</SPAN>
tableList <SPAN class="operator token">=</SPAN> getSurveyTables<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">)</SPAN>
dateField <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>AddFieldDelimiters<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"CreationDate"</SPAN><SPAN class="punctuation token">)</SPAN>
excludeStatement <SPAN class="operator token">=</SPAN> <SPAN class="string token">"CreationDate > date '{1}'"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>dateField<SPAN class="punctuation token">,</SPAN> nowText<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> lastSync <SPAN class="operator token">!=</SPAN> None<SPAN class="punctuation token">:</SPAN>
lastSyncText <SPAN class="operator token">=</SPAN> createTimestampText<SPAN class="punctuation token">(</SPAN>lastSync<SPAN class="punctuation token">)</SPAN>
excludeStatement <SPAN class="operator token">=</SPAN> excludeStatement <SPAN class="operator token">+</SPAN> <SPAN class="string token">" OR CreationDate <= date '{0}'"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>lastSyncText<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t\t-{0}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>excludeStatement<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t-{0}'.format(excludeStatement)"</SPAN>
i <SPAN class="operator token">=</SPAN> <SPAN class="number token">0</SPAN>
<SPAN class="keyword token">for</SPAN> table <SPAN class="keyword token">in</SPAN> tableList<SPAN class="punctuation token">:</SPAN>
i <SPAN class="operator token">=</SPAN> i <SPAN class="operator token">+</SPAN> <SPAN class="number token">1</SPAN>
thisName <SPAN class="operator token">=</SPAN> <SPAN class="string token">'filterView{0}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>str<SPAN class="punctuation token">(</SPAN>i<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
dsc <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> dsc<SPAN class="punctuation token">.</SPAN>datatype <SPAN class="operator token">==</SPAN> u<SPAN class="string token">'FeatureClass'</SPAN> <SPAN class="operator token">or</SPAN> dsc<SPAN class="punctuation token">.</SPAN>datatype <SPAN class="operator token">==</SPAN> u<SPAN class="string token">'FeatureLayer'</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t\t{0}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'featureclass'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t{0}'.format('featureclass')"</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>MakeFeatureLayer_management<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">,</SPAN> thisName<SPAN class="punctuation token">,</SPAN> excludeStatement<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>DeleteFeatures_management<SPAN class="punctuation token">(</SPAN>thisName<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>MakeTableView_management<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">,</SPAN> thisName<SPAN class="punctuation token">,</SPAN> excludeStatement<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>DeleteRows_management<SPAN class="punctuation token">(</SPAN>thisName<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>Delete_management<SPAN class="punctuation token">(</SPAN>thisName<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">addTimeStamp</SPAN><SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">,</SPAN> timestamp<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Disables editor tracking, adds and populates the timestamp field'''</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t-Adding Syncronization Time'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t-Adding Syncronization Time"</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> surveyGDB
tableList <SPAN class="operator token">=</SPAN> getSurveyTables<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> table <SPAN class="keyword token">in</SPAN> tableList<SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token">#Disable Editor Tracking</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>DisableEditorTracking_management<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#Add a synchronization field</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddField_management<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'SYS_TRANSFER_DATE'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'DATE'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#Set it to the timestamp</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>Editor<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> edit<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> table <SPAN class="keyword token">in</SPAN> tableList<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>UpdateCursor<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'SYS_TRANSFER_DATE'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> rows<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> row <SPAN class="keyword token">in</SPAN> rows<SPAN class="punctuation token">:</SPAN>
rows<SPAN class="punctuation token">.</SPAN>updateRow<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN>timestamp<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">del</SPAN><SPAN class="punctuation token">(</SPAN>edit<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">addKeyFields</SPAN><SPAN class="punctuation token">(</SPAN>workspace<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''To enable transfer of attachments with repeats, we need an additional GUID field to serve as a lookup'''</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> workspace
dscW <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>workspace<SPAN class="punctuation token">)</SPAN>
tableList <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN>
relClasses <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>c<SPAN class="punctuation token">.</SPAN>name <SPAN class="keyword token">for</SPAN> c <SPAN class="keyword token">in</SPAN> dscW<SPAN class="punctuation token">.</SPAN>children <SPAN class="keyword token">if</SPAN> c<SPAN class="punctuation token">.</SPAN>datatype <SPAN class="operator token">==</SPAN> u<SPAN class="string token">'RelationshipClass'</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">for</SPAN> child <SPAN class="keyword token">in</SPAN> relClasses<SPAN class="punctuation token">:</SPAN>
dscRC <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>child<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>isAttachmentRelationship<SPAN class="punctuation token">:</SPAN>
originTable <SPAN class="operator token">=</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>originClassNames<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
originFieldNames <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>f<SPAN class="punctuation token">.</SPAN>name <SPAN class="keyword token">for</SPAN> f <SPAN class="keyword token">in</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListFields<SPAN class="punctuation token">(</SPAN>originTable<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="string token">'rowid'</SPAN> <SPAN class="operator token">not</SPAN> <SPAN class="keyword token">in</SPAN> originFieldNames<SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddField_management<SPAN class="punctuation token">(</SPAN>originTable<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'rowid'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'GUID'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>Editor<SPAN class="punctuation token">(</SPAN>workspace<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> edit<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>UpdateCursor<SPAN class="punctuation token">(</SPAN>originTable<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'rowid'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> urows<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> urow <SPAN class="keyword token">in</SPAN> urows<SPAN class="punctuation token">:</SPAN>
urow<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="string token">'{'</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>uuid<SPAN class="punctuation token">.</SPAN>uuid4<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> <SPAN class="string token">'}'</SPAN>
urows<SPAN class="punctuation token">.</SPAN>updateRow<SPAN class="punctuation token">(</SPAN>urow<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">del</SPAN><SPAN class="punctuation token">(</SPAN>edit<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">createTables</SPAN><SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">,</SPAN> outWorkspace<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Creates the doamins, tables and relationships of the survey in the target workspace'''</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t-Creating Tables'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t-Creating Tables"</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> surveyGDB
allTables <SPAN class="operator token">=</SPAN> getSurveyTables<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">)</SPAN>
dscW <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#migrate the domains</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t\t-Creating Domains'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t-Creating Domains"</SPAN>
<SPAN class="keyword token">for</SPAN> domainName <SPAN class="keyword token">in</SPAN> dscW<SPAN class="punctuation token">.</SPAN>domains<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">if</SPAN> domainName<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">==</SPAN> <SPAN class="string token">'cvd'</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t\t\t-'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>domainName<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t\t-'.format(domainName)"</SPAN>
tempTable <SPAN class="operator token">=</SPAN> <SPAN class="string token">'in_memory\{0}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>domainName<SPAN class="punctuation token">)</SPAN>
domainTable <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>DomainToTable_management<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">,</SPAN> domainName<SPAN class="punctuation token">,</SPAN> tempTable<SPAN class="punctuation token">,</SPAN><SPAN class="string token">'CODE'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'DESC'</SPAN><SPAN class="punctuation token">)</SPAN>
newDomain <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>TableToDomain_management<SPAN class="punctuation token">(</SPAN>tempTable<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'CODE'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'DESC'</SPAN><SPAN class="punctuation token">,</SPAN> outWorkspace<SPAN class="punctuation token">,</SPAN> domainName<SPAN class="punctuation token">,</SPAN> update_option<SPAN class="operator token">=</SPAN><SPAN class="string token">'REPLACE'</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>Delete_management<SPAN class="punctuation token">(</SPAN>tempTable<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"\t\t-Creating Feature Classes & Tables"</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t-Creating Feature Classes & Tables"</SPAN>
<SPAN class="keyword token">for</SPAN> table <SPAN class="keyword token">in</SPAN> allTables<SPAN class="punctuation token">:</SPAN>
dsc <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">)</SPAN>
newTableName <SPAN class="operator token">=</SPAN> <SPAN class="string token">"{0}_{1}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>prefix<SPAN class="punctuation token">,</SPAN> table<SPAN class="punctuation token">)</SPAN>
templateTable <SPAN class="operator token">=</SPAN> template<SPAN class="operator token">=</SPAN>os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">,</SPAN> table<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> dsc<SPAN class="punctuation token">.</SPAN>datatype <SPAN class="operator token">==</SPAN> u<SPAN class="string token">'FeatureClass'</SPAN><SPAN class="punctuation token">:</SPAN>
newTable <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>CreateFeatureclass_management<SPAN class="punctuation token">(</SPAN>outWorkspace<SPAN class="punctuation token">,</SPAN> newTableName<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"POINT"</SPAN><SPAN class="punctuation token">,</SPAN> template<SPAN class="operator token">=</SPAN>templateTable<SPAN class="punctuation token">,</SPAN> spatial_reference<SPAN class="operator token">=</SPAN>dsc<SPAN class="punctuation token">.</SPAN>spatialReference<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
newTable <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>CreateTable_management<SPAN class="punctuation token">(</SPAN>outWorkspace<SPAN class="punctuation token">,</SPAN> newTableName<SPAN class="punctuation token">,</SPAN> template<SPAN class="operator token">=</SPAN>templateTable<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"\t\t\t-Created {0}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>newTableName<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t\t-Created {0}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>newTableName<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#Attach domains to fields</SPAN>
tableFields <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListFields<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> field <SPAN class="keyword token">in</SPAN> tableFields<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">if</SPAN> field<SPAN class="punctuation token">.</SPAN>domain <SPAN class="operator token">!=</SPAN> <SPAN class="string token">''</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AssignDomainToField_management<SPAN class="punctuation token">(</SPAN>newTable<SPAN class="punctuation token">,</SPAN> field<SPAN class="punctuation token">.</SPAN>name<SPAN class="punctuation token">,</SPAN> field<SPAN class="punctuation token">.</SPAN>domain<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> dscW<SPAN class="punctuation token">.</SPAN>workspaceType <SPAN class="operator token">==</SPAN> <SPAN class="string token">"RemoteDatabase"</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>RegisterAsVersioned_management<SPAN class="punctuation token">(</SPAN>newTable<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t\t-Creating Relationships'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t-Creating Relationships"</SPAN>
<SPAN class="comment token">#Reconnect Relationship classes, checking for attachments</SPAN>
CARDINALITIES <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN>
<SPAN class="string token">'OneToOne'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">"ONE_TO_ONE"</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'OneToMany'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">"ONE_TO_MANY"</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'ManyToMany'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">"MANY_TO_MANY"</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">for</SPAN> child <SPAN class="keyword token">in</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN>c<SPAN class="punctuation token">.</SPAN>name<SPAN class="punctuation token">,</SPAN> c<SPAN class="punctuation token">.</SPAN>datatype<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">for</SPAN> c <SPAN class="keyword token">in</SPAN> dscW<SPAN class="punctuation token">.</SPAN>children <SPAN class="keyword token">if</SPAN> c<SPAN class="punctuation token">.</SPAN>datatype <SPAN class="operator token">==</SPAN> u<SPAN class="string token">'RelationshipClass'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">:</SPAN>
dscRC <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>child<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
RCOriginTable <SPAN class="operator token">=</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>originClassNames<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
RCDestTable <SPAN class="operator token">=</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>destinationClassNames<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
newOriginTable <SPAN class="operator token">=</SPAN> <SPAN class="string token">"{0}_{1}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>prefix<SPAN class="punctuation token">,</SPAN> RCOriginTable<SPAN class="punctuation token">)</SPAN>
newOriginPath <SPAN class="operator token">=</SPAN> os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>outWorkspace<SPAN class="punctuation token">,</SPAN> newOriginTable<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>isAttachmentRelationship<SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token">#Simple case - attachments have a dedicated tool</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>EnableAttachments_management<SPAN class="punctuation token">(</SPAN>newOriginPath<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
newDestTable <SPAN class="operator token">=</SPAN> <SPAN class="string token">"{0}_{1}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>prefix<SPAN class="punctuation token">,</SPAN> RCDestTable<SPAN class="punctuation token">)</SPAN>
newDestPath <SPAN class="operator token">=</SPAN> os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>outWorkspace<SPAN class="punctuation token">,</SPAN> newDestTable<SPAN class="punctuation token">)</SPAN>
newRC <SPAN class="operator token">=</SPAN> os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>outWorkspace<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"{0}_{1}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>prefix<SPAN class="punctuation token">,</SPAN> child<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
relationshipType <SPAN class="operator token">=</SPAN> <SPAN class="string token">"COMPOSITE"</SPAN> <SPAN class="keyword token">if</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>isComposite <SPAN class="keyword token">else</SPAN> <SPAN class="string token">"SIMPLE"</SPAN>
fwd_label <SPAN class="operator token">=</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>forwardPathLabel <SPAN class="keyword token">if</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>forwardPathLabel <SPAN class="operator token">!=</SPAN> <SPAN class="string token">''</SPAN> <SPAN class="keyword token">else</SPAN> <SPAN class="string token">'Repeat'</SPAN>
bck_label <SPAN class="operator token">=</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>backwardPathLabel <SPAN class="keyword token">if</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>backwardPathLabel <SPAN class="operator token">!=</SPAN> <SPAN class="string token">''</SPAN> <SPAN class="keyword token">else</SPAN> <SPAN class="string token">'Main Form'</SPAN>
msg_dir <SPAN class="operator token">=</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>notification<SPAN class="punctuation token">.</SPAN>upper<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
cardinality <SPAN class="operator token">=</SPAN> CARDINALITIES<SPAN class="punctuation token">[</SPAN>dscRC<SPAN class="punctuation token">.</SPAN>cardinality<SPAN class="punctuation token">]</SPAN>
attributed <SPAN class="operator token">=</SPAN> <SPAN class="string token">"ATTRIBUTED"</SPAN> <SPAN class="keyword token">if</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>isAttributed <SPAN class="keyword token">else</SPAN> <SPAN class="string token">"NONE"</SPAN>
originclassKeys <SPAN class="operator token">=</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>originClassKeys
originclassKeys_dict <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">for</SPAN> key <SPAN class="keyword token">in</SPAN> originclassKeys<SPAN class="punctuation token">:</SPAN>
originclassKeys_dict<SPAN class="punctuation token">[</SPAN>key<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> key<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
originPrimaryKey <SPAN class="operator token">=</SPAN> originclassKeys_dict<SPAN class="punctuation token">[</SPAN>u<SPAN class="string token">'OriginPrimary'</SPAN><SPAN class="punctuation token">]</SPAN>
originForiegnKey <SPAN class="operator token">=</SPAN> originclassKeys_dict<SPAN class="punctuation token">[</SPAN>u<SPAN class="string token">'OriginForeign'</SPAN><SPAN class="punctuation token">]</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>CreateRelationshipClass_management<SPAN class="punctuation token">(</SPAN>newOriginPath<SPAN class="punctuation token">,</SPAN> newDestPath<SPAN class="punctuation token">,</SPAN> newRC<SPAN class="punctuation token">,</SPAN> relationshipType<SPAN class="punctuation token">,</SPAN> fwd_label<SPAN class="punctuation token">,</SPAN> bck_label<SPAN class="punctuation token">,</SPAN> msg_dir<SPAN class="punctuation token">,</SPAN> cardinality<SPAN class="punctuation token">,</SPAN> attributed<SPAN class="punctuation token">,</SPAN> originPrimaryKey<SPAN class="punctuation token">,</SPAN> originForiegnKey<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#Regular Relation</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">getTablesWithAttachments</SPAN><SPAN class="punctuation token">(</SPAN>workspace<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Lists the tables that have attachments, so that we can seperately process the attachments during migration'''</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t-Finding Attachments'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t-Finding Attachments"</SPAN>
originalWorkspace <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> workspace
dscW <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>workspace<SPAN class="punctuation token">)</SPAN>
tableList <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN>
relClasses <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>c<SPAN class="punctuation token">.</SPAN>name <SPAN class="keyword token">for</SPAN> c <SPAN class="keyword token">in</SPAN> dscW<SPAN class="punctuation token">.</SPAN>children <SPAN class="keyword token">if</SPAN> c<SPAN class="punctuation token">.</SPAN>datatype <SPAN class="operator token">==</SPAN> u<SPAN class="string token">'RelationshipClass'</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">for</SPAN> child <SPAN class="keyword token">in</SPAN> relClasses<SPAN class="punctuation token">:</SPAN>
dbNameParts <SPAN class="operator token">=</SPAN> child<SPAN class="punctuation token">.</SPAN>split<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"."</SPAN><SPAN class="punctuation token">)</SPAN>
childParts <SPAN class="operator token">=</SPAN> dbNameParts<SPAN class="punctuation token">[</SPAN><SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>split<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"_"</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> childParts<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">==</SPAN> prefix<SPAN class="punctuation token">:</SPAN>
dscRC <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>child<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>isAttachmentRelationship<SPAN class="punctuation token">:</SPAN>
originTable <SPAN class="operator token">=</SPAN> dscRC<SPAN class="punctuation token">.</SPAN>originClassNames<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
originParts <SPAN class="operator token">=</SPAN> originTable<SPAN class="punctuation token">.</SPAN>split<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"."</SPAN><SPAN class="punctuation token">)</SPAN>
tableList<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>originParts<SPAN class="punctuation token">[</SPAN><SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> originalWorkspace
<SPAN class="keyword token">return</SPAN> tableList
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">createFieldMap</SPAN><SPAN class="punctuation token">(</SPAN>originTable<SPAN class="punctuation token">,</SPAN> originFieldNames<SPAN class="punctuation token">,</SPAN> destinationFieldNames<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Matches up fields between tables, even if some minor alteration (capitalization, underscores) occured during creation'''</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t\t-Field Map'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t-Field Map"</SPAN>
fieldMappings <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>FieldMappings<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> field <SPAN class="keyword token">in</SPAN> originFieldNames<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">if</SPAN> field <SPAN class="operator token">!=</SPAN> <SPAN class="string token">'SHAPE'</SPAN><SPAN class="punctuation token">:</SPAN>
thisFieldMap <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>FieldMap<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
thisFieldMap<SPAN class="punctuation token">.</SPAN>addInputField<SPAN class="punctuation token">(</SPAN>originTable<SPAN class="punctuation token">,</SPAN> field<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> field <SPAN class="keyword token">in</SPAN> destinationFieldNames<SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token">#Easy case- it came over w/o issue</SPAN>
outField <SPAN class="operator token">=</SPAN> thisFieldMap<SPAN class="punctuation token">.</SPAN>outputField
outField<SPAN class="punctuation token">.</SPAN>name <SPAN class="operator token">=</SPAN> field
thisFieldMap<SPAN class="punctuation token">.</SPAN>outputField <SPAN class="operator token">=</SPAN> outField
<SPAN class="comment token">#arcpy.AddMessage("\t".join([field, field]))</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token">#Use regular expression to search case insensitve and added _ to names</SPAN>
candidates <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>x <SPAN class="keyword token">for</SPAN> i<SPAN class="punctuation token">,</SPAN> x <SPAN class="keyword token">in</SPAN> enumerate<SPAN class="punctuation token">(</SPAN>destinationFieldNames<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">if</SPAN> re<SPAN class="punctuation token">.</SPAN>search<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'{0}\W*'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>field<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> x<SPAN class="punctuation token">,</SPAN> re<SPAN class="punctuation token">.</SPAN>IGNORECASE<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">if</SPAN> len<SPAN class="punctuation token">(</SPAN>candidates<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">==</SPAN> <SPAN class="number token">1</SPAN><SPAN class="punctuation token">:</SPAN>
outField <SPAN class="operator token">=</SPAN> thisFieldMap<SPAN class="punctuation token">.</SPAN>outputField
outField<SPAN class="punctuation token">.</SPAN>name <SPAN class="operator token">=</SPAN> candidates<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
thisFieldMap<SPAN class="punctuation token">.</SPAN>outputField <SPAN class="operator token">=</SPAN> outField
fieldMappings<SPAN class="punctuation token">.</SPAN>addFieldMap<SPAN class="punctuation token">(</SPAN>thisFieldMap<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN> fieldMappings
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">appendTables</SPAN><SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">,</SPAN> workspace<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Append the records from the survey into the destination database'''</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t-Adding records'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t-Adding records"</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> surveyGDB
tableList <SPAN class="operator token">=</SPAN> getSurveyTables<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">)</SPAN>
attachmentList <SPAN class="operator token">=</SPAN> getTablesWithAttachments<SPAN class="punctuation token">(</SPAN>workspace<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> table <SPAN class="keyword token">in</SPAN> tableList<SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token">#Normalize table fields to get schemas in alignmnet- enable all editing, make nonrequired</SPAN>
fields <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListFields<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> field <SPAN class="keyword token">in</SPAN> fields<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="operator token">not</SPAN> field<SPAN class="punctuation token">.</SPAN>editable<SPAN class="punctuation token">:</SPAN>
field<SPAN class="punctuation token">.</SPAN>editable <SPAN class="operator token">=</SPAN> <SPAN class="token boolean">True</SPAN>
<SPAN class="keyword token">if</SPAN> field<SPAN class="punctuation token">.</SPAN>required<SPAN class="punctuation token">:</SPAN>
field<SPAN class="punctuation token">.</SPAN>required <SPAN class="operator token">=</SPAN> <SPAN class="token boolean">False</SPAN>
destinationName <SPAN class="operator token">=</SPAN> <SPAN class="string token">"{0}_{1}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>prefix<SPAN class="punctuation token">,</SPAN> table<SPAN class="punctuation token">)</SPAN>
destinationFC <SPAN class="operator token">=</SPAN> os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>workspace<SPAN class="punctuation token">,</SPAN> destinationName<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t\t-{0} > {1}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">,</SPAN> destinationName<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t-{0} > {1}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">,</SPAN> destinationName<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#First, append the table</SPAN>
<SPAN class="comment token">#Match up the fields</SPAN>
originFieldNames <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>f<SPAN class="punctuation token">.</SPAN>name <SPAN class="keyword token">for</SPAN> f <SPAN class="keyword token">in</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListFields<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
destFieldNames <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>f<SPAN class="punctuation token">.</SPAN>name <SPAN class="keyword token">for</SPAN> f <SPAN class="keyword token">in</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListFields<SPAN class="punctuation token">(</SPAN>destinationFC<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
fieldMap <SPAN class="operator token">=</SPAN> createFieldMap<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">,</SPAN> originFieldNames<SPAN class="punctuation token">,</SPAN> destFieldNames<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t\t-{0}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t-{0}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>Append_management<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">,</SPAN> destinationFC<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'NO_TEST'</SPAN><SPAN class="punctuation token">,</SPAN> fieldMap<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> destinationName <SPAN class="keyword token">in</SPAN> attachmentList<SPAN class="punctuation token">:</SPAN>
appendAttachments<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">,</SPAN> destinationFC<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">appendAttachments</SPAN><SPAN class="punctuation token">(</SPAN>inFC<SPAN class="punctuation token">,</SPAN> outFC<SPAN class="punctuation token">,</SPAN> keyField<SPAN class="operator token">=</SPAN><SPAN class="string token">'rowid'</SPAN><SPAN class="punctuation token">,</SPAN> valueField <SPAN class="operator token">=</SPAN> <SPAN class="string token">'globalid'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'\t\t\t-Adding attachments'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"\t\t\t-Adding attachments"</SPAN>
<SPAN class="comment token"># 1) scan through both GlobalID and rowID of the old and new features and build a conversion dictionary</SPAN>
GUIDFields <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>keyField<SPAN class="punctuation token">,</SPAN> valueField<SPAN class="punctuation token">]</SPAN>
inDict <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="punctuation token">}</SPAN>
outDict <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="punctuation token">}</SPAN>
lookup <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="punctuation token">}</SPAN>
inAttachTable <SPAN class="operator token">=</SPAN> <SPAN class="string token">"{0}__ATTACH"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>inFC<SPAN class="punctuation token">)</SPAN>
outAttachTable <SPAN class="operator token">=</SPAN> <SPAN class="string token">"{0}__ATTACH"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>outFC<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>inFC<SPAN class="punctuation token">,</SPAN> GUIDFields<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> inputSearch<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> row <SPAN class="keyword token">in</SPAN> inputSearch<SPAN class="punctuation token">:</SPAN>
inDict<SPAN class="punctuation token">[</SPAN>row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>outFC<SPAN class="punctuation token">,</SPAN> GUIDFields<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> outputSearch<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> row <SPAN class="keyword token">in</SPAN> outputSearch<SPAN class="punctuation token">:</SPAN>
outDict<SPAN class="punctuation token">[</SPAN>row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">for</SPAN> key<SPAN class="punctuation token">,</SPAN> inValue <SPAN class="keyword token">in</SPAN> inDict<SPAN class="punctuation token">.</SPAN>iteritems<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">if</SPAN> key <SPAN class="operator token">not</SPAN> <SPAN class="keyword token">in</SPAN> outDict<SPAN class="punctuation token">.</SPAN>keys<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">raise</SPAN> Exception<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'missing key: {0}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>key<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
lookup<SPAN class="punctuation token">[</SPAN>inValue<SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> outDict<SPAN class="punctuation token">[</SPAN>key<SPAN class="punctuation token">]</SPAN>
<SPAN class="comment token"># 2) Copy the attachment table to an in-memory layer</SPAN>
tempTableName <SPAN class="operator token">=</SPAN> r<SPAN class="string token">'in_memory\AttachTemp'</SPAN>
tempTable <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>CopyRows_management<SPAN class="punctuation token">(</SPAN>inAttachTable<SPAN class="punctuation token">,</SPAN> tempTableName<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># 3) update the attachment table with new GlobalIDs</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>UpdateCursor<SPAN class="punctuation token">(</SPAN>tempTable<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'REL_GLOBALID'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> uRows<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> uRow <SPAN class="keyword token">in</SPAN> uRows<SPAN class="punctuation token">:</SPAN>
uRow<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> lookup<SPAN class="punctuation token">[</SPAN>uRow<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN>
uRows<SPAN class="punctuation token">.</SPAN>updateRow<SPAN class="punctuation token">(</SPAN>uRow<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># 4) Append to destination attachment table</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>Append_management<SPAN class="punctuation token">(</SPAN>tempTable<SPAN class="punctuation token">,</SPAN> outAttachTable<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'NO_TEST'</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>Delete_management<SPAN class="punctuation token">(</SPAN>tempTable<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">FAIL</SPAN><SPAN class="punctuation token">(</SPAN>sectionText<SPAN class="punctuation token">,</SPAN> err<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token">#arcpy.AddMessage ('======================')</SPAN>
<SPAN class="comment token">#arcpy.AddMessage ('FAIL: {0}'.format(sectionText))</SPAN>
<SPAN class="comment token">#arcpy.AddMessage ('exception:')</SPAN>
<SPAN class="comment token">#arcpy.AddMessage (err)</SPAN>
<SPAN class="comment token">#arcpy.AddMessage (err.args)</SPAN>
<SPAN class="comment token">#arcpy.AddMessage (sys.exc_info()[0])</SPAN>
<SPAN class="comment token">#arcpy.AddMessage (sys.exc_info()[2].tb_lineno)</SPAN>
<SPAN class="comment token">#arcpy.AddMessage ('----------------------')</SPAN>
<SPAN class="comment token">#arcpy.AddMessage ('arcpy messages:')</SPAN>
<SPAN class="comment token">#arcpy.AddMessage (arcpy.GetMessages(1))</SPAN>
<SPAN class="comment token">#arcpy.AddMessage (arcpy.GetMessages(2))</SPAN>
<SPAN class="comment token">#arcpy.AddMessage ('======================')</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"======================"</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"FAIL: {0}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>sectionText<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"exception:"</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"err"</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"err.args"</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"sys.exc_info()[0]"</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"sys.exc_info()[2].tb_lineno"</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"----------------------"</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"arcpy messages:"</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"arcpy.GetMessages(1)"</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"arcpy.GetMessages(2)"</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"======================"</SPAN>
<SPAN class="keyword token">return</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">cleanup</SPAN><SPAN class="punctuation token">(</SPAN>ops<SPAN class="punctuation token">,</SPAN> sdeConnection<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="punctuation token">,</SPAN> now<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="string token">'append'</SPAN> <SPAN class="keyword token">in</SPAN> ops<SPAN class="punctuation token">.</SPAN>keys<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> sdeConnection
nowTS <SPAN class="operator token">=</SPAN> createTimestampText<SPAN class="punctuation token">(</SPAN>now<SPAN class="punctuation token">)</SPAN>
i <SPAN class="operator token">=</SPAN> <SPAN class="number token">0</SPAN>
<SPAN class="keyword token">for</SPAN> table <SPAN class="keyword token">in</SPAN> ops<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'append'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">:</SPAN>
i <SPAN class="operator token">=</SPAN> i <SPAN class="operator token">+</SPAN> <SPAN class="number token">1</SPAN>
thisName <SPAN class="operator token">=</SPAN> <SPAN class="string token">'layerOrView{0}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>str<SPAN class="punctuation token">(</SPAN>i<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
whereStatment <SPAN class="operator token">=</SPAN> <SPAN class="string token">"sys_transfer_date = timestamp'{0}'"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>nowTS<SPAN class="punctuation token">)</SPAN>
dsc <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">)</SPAN>
selection <SPAN class="operator token">=</SPAN> None
<SPAN class="keyword token">if</SPAN> dsc<SPAN class="punctuation token">.</SPAN>datatype <SPAN class="operator token">==</SPAN> u<SPAN class="string token">'FeatureClass'</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>MakeFeatureLayer_management<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">,</SPAN> thisName<SPAN class="punctuation token">,</SPAN> whereStatment<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>DeleteFeatures_management<SPAN class="punctuation token">(</SPAN>thisName<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>MakeTableView_management<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">,</SPAN> thisName<SPAN class="punctuation token">,</SPAN> whereStatment<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>DeleteRows_management<SPAN class="punctuation token">(</SPAN>thisName<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>Delete_management<SPAN class="punctuation token">(</SPAN>view<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="string token">'createTables'</SPAN> <SPAN class="keyword token">in</SPAN> ops<SPAN class="punctuation token">.</SPAN>keys<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> sdeConnection
tableList <SPAN class="operator token">=</SPAN> getSurveyTables<SPAN class="punctuation token">(</SPAN>sdeConnection<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> table <SPAN class="keyword token">in</SPAN> tableList<SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>Delete_management<SPAN class="punctuation token">(</SPAN>table<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># if 'tempdir' in ops.keys():</SPAN>
<SPAN class="comment token"># shutil.rmtree(ops['tempdir'])</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">ConfigSectionMap</SPAN><SPAN class="punctuation token">(</SPAN>cfg<SPAN class="punctuation token">,</SPAN> section<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
dict1 <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="punctuation token">}</SPAN>
options <SPAN class="operator token">=</SPAN> cfg<SPAN class="punctuation token">.</SPAN>options<SPAN class="punctuation token">(</SPAN>section<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> option <SPAN class="keyword token">in</SPAN> options<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">try</SPAN><SPAN class="punctuation token">:</SPAN>
dict1<SPAN class="punctuation token">[</SPAN>option<SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> cfg<SPAN class="punctuation token">.</SPAN>get<SPAN class="punctuation token">(</SPAN>section<SPAN class="punctuation token">,</SPAN> option<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> dict1<SPAN class="punctuation token">[</SPAN>option<SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">==</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">:</SPAN>
DebugPrint<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"skip: %s"</SPAN> <SPAN class="operator token">%</SPAN> option<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">except</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"exception on %s!"</SPAN> <SPAN class="operator token">%</SPAN> option<SPAN class="punctuation token">)</SPAN>
dict1<SPAN class="punctuation token">[</SPAN>option<SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> None
<SPAN class="keyword token">return</SPAN> dict1
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">test</SPAN><SPAN class="punctuation token">(</SPAN>section<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">import</SPAN> ConfigParser
os<SPAN class="punctuation token">.</SPAN>chdir<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">'C:\Users\jame6423\Documents\Projects\SDEmigration'</SPAN><SPAN class="punctuation token">)</SPAN>
cfg <SPAN class="operator token">=</SPAN> ConfigParser<SPAN class="punctuation token">.</SPAN>ConfigParser<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
cfg<SPAN class="punctuation token">.</SPAN>read<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'test.ini'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">## Polio Test</SPAN>
testConfig <SPAN class="operator token">=</SPAN> ConfigSectionMap<SPAN class="punctuation token">(</SPAN>cfg<SPAN class="punctuation token">,</SPAN> section<SPAN class="punctuation token">)</SPAN>
testConfig<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'sde_conn'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>abspath<SPAN class="punctuation token">(</SPAN>os<SPAN class="punctuation token">.</SPAN>curdir<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> testConfig<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'sde_conn'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
process<SPAN class="punctuation token">(</SPAN>testConfig<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'sde_conn'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> testConfig<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'prefix'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> testConfig<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'service_url'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> testConfig<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'username'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> testConfig<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'password'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> testConfig<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'timezone'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">process</SPAN><SPAN class="punctuation token">(</SPAN>sdeConnection<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="punctuation token">,</SPAN> featureServiceUrl<SPAN class="punctuation token">,</SPAN> timezone<SPAN class="punctuation token">,</SPAN> portalUrl<SPAN class="operator token">=</SPAN>None<SPAN class="punctuation token">,</SPAN> username<SPAN class="operator token">=</SPAN>None<SPAN class="punctuation token">,</SPAN> password<SPAN class="operator token">=</SPAN>None<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Operations:
1) Query Feature Service endpoint for table names & IDs
2) Check for existing tables
3) If existing tables, get last synchronization time
4) CreateReplica a FGDB
5) Download the FGDB
6) If new, create the tables
7) Append
'''</SPAN>
now <SPAN class="operator token">=</SPAN> getUTCTimestamp<SPAN class="punctuation token">(</SPAN>timezone<SPAN class="punctuation token">)</SPAN>
cleanupOperations <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="punctuation token">}</SPAN>
section <SPAN class="operator token">=</SPAN> <SPAN class="string token">'Beginning'</SPAN>
<SPAN class="keyword token">try</SPAN><SPAN class="punctuation token">:</SPAN>
section <SPAN class="operator token">=</SPAN> <SPAN class="string token">'Logging in to Survey'</SPAN>
tokenTest <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>GetSigninToken<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
token <SPAN class="operator token">=</SPAN> None
<SPAN class="keyword token">if</SPAN> tokenTest <SPAN class="operator token">==</SPAN> None<SPAN class="punctuation token">:</SPAN>
token <SPAN class="operator token">=</SPAN> getToken<SPAN class="punctuation token">(</SPAN>username<SPAN class="punctuation token">,</SPAN> password<SPAN class="punctuation token">,</SPAN> portalUrl<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
token <SPAN class="operator token">=</SPAN> tokenTest<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'token'</SPAN><SPAN class="punctuation token">]</SPAN>
serviceInfo <SPAN class="operator token">=</SPAN> getServiceDefinition<SPAN class="punctuation token">(</SPAN>token<SPAN class="punctuation token">,</SPAN> featureServiceUrl<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="string token">'Sync'</SPAN> <SPAN class="operator token">not</SPAN> <SPAN class="keyword token">in</SPAN> serviceInfo<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'capabilities'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddError<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Sync Capabilities not enabled'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">raise</SPAN> Exception<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Sync Capabilities not enabled'</SPAN><SPAN class="punctuation token">)</SPAN>
section <SPAN class="operator token">=</SPAN> <SPAN class="string token">'Checking Existing Data'</SPAN>
existingTables <SPAN class="operator token">=</SPAN> getSurveyTables<SPAN class="punctuation token">(</SPAN>sdeConnection<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="punctuation token">)</SPAN>
lastSync <SPAN class="operator token">=</SPAN> None
<SPAN class="keyword token">if</SPAN> len<SPAN class="punctuation token">(</SPAN>existingTables<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">></SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">:</SPAN>
lastSync <SPAN class="operator token">=</SPAN> getLastSynchronizationTime<SPAN class="punctuation token">(</SPAN>sdeConnection<SPAN class="punctuation token">,</SPAN> existingTables<SPAN class="punctuation token">)</SPAN>
section <SPAN class="operator token">=</SPAN> <SPAN class="string token">'Downloading Survey'</SPAN>
tempdir <SPAN class="operator token">=</SPAN> tempfile<SPAN class="punctuation token">.</SPAN>mkdtemp<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#cleanupOperations['tempdir'] = tempdir</SPAN>
surveyGDB <SPAN class="operator token">=</SPAN> getReplica<SPAN class="punctuation token">(</SPAN>token<SPAN class="punctuation token">,</SPAN> featureServiceUrl<SPAN class="punctuation token">,</SPAN> serviceInfo<SPAN class="punctuation token">,</SPAN> now<SPAN class="punctuation token">,</SPAN> outDir<SPAN class="operator token">=</SPAN>tempdir<SPAN class="punctuation token">,</SPAN> lastSync<SPAN class="operator token">=</SPAN>lastSync<SPAN class="punctuation token">)</SPAN>
section <SPAN class="operator token">=</SPAN> <SPAN class="string token">'Preprocess Surveys for transfer'</SPAN>
filterRecords<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">,</SPAN> now<SPAN class="punctuation token">,</SPAN> lastSync<SPAN class="punctuation token">)</SPAN>
addTimeStamp<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">,</SPAN> now<SPAN class="punctuation token">)</SPAN>
addKeyFields<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> len<SPAN class="punctuation token">(</SPAN>existingTables<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">==</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">:</SPAN>
section <SPAN class="operator token">=</SPAN> <SPAN class="string token">'Making Tables'</SPAN>
createTables<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">,</SPAN> sdeConnection<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="punctuation token">)</SPAN>
cleanupOperations<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'createTables'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="token boolean">True</SPAN>
section <SPAN class="operator token">=</SPAN> <SPAN class="string token">'Updating Tables'</SPAN>
cleanupOperations<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'append'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> existingTables
appendTables<SPAN class="punctuation token">(</SPAN>surveyGDB<SPAN class="punctuation token">,</SPAN> sdeConnection<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="punctuation token">)</SPAN>
cleanupOperations<SPAN class="punctuation token">.</SPAN>pop<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'append'</SPAN><SPAN class="punctuation token">,</SPAN> None<SPAN class="punctuation token">)</SPAN>
cleanupOperations<SPAN class="punctuation token">.</SPAN>pop<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'createTables'</SPAN><SPAN class="punctuation token">,</SPAN> None<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">except</SPAN> Exception <SPAN class="keyword token">as</SPAN> e<SPAN class="punctuation token">:</SPAN>
FAIL<SPAN class="punctuation token">(</SPAN>section<SPAN class="punctuation token">,</SPAN> e<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">finally</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token">#clean up</SPAN>
cleanup<SPAN class="punctuation token">(</SPAN>cleanupOperations<SPAN class="punctuation token">,</SPAN> sdeConnection<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="punctuation token">,</SPAN> now<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">main</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
sde_conn <SPAN class="operator token">=</SPAN> r<SPAN class="string token">"C:\\Users\\xyz\\AppData\\Roaming\\ESRI\\Desktop10.4\\ArcCatalog\\xyz@Admin.sde"</SPAN>
prefix <SPAN class="operator token">=</SPAN> r<SPAN class="string token">"BRs"</SPAN>
featureService <SPAN class="operator token">=</SPAN> r<SPAN class="string token"><SPAN>"</SPAN><A class="jive-link-external-small" href="https://community.esri.com/external-link.jspa?url=https%3A%2F%2Fservices2.arcgis.com%2F%2Fxxxxxx%2F%2Farcgis%2F%2Frest%2F%2Fservices%2F%2Fxxxxx%2F%2Fxxxxx%2F%2F" target="_blank">https://services2.arcgis.com//xyz//arcgis//rest//services//xyz//xyz//</A><SPAN>"</SPAN></SPAN>
timezone <SPAN class="operator token">=</SPAN> r<SPAN class="string token">"US/Eastern"</SPAN>
portal <SPAN class="operator token">=</SPAN> r<SPAN class="string token"><SPAN>"</SPAN><A class="jive-link-external-small" href="https://community.esri.com/external-link.jspa?url=https%3A%2F%2Fwww.arcgis.com" target="_blank">https://www.arcgis.com</A><SPAN>"</SPAN></SPAN>
username <SPAN class="operator token">=</SPAN> r<SPAN class="string token">"username"</SPAN>
password <SPAN class="operator token">=</SPAN> r<SPAN class="string token">"password"</SPAN>
process<SPAN class="punctuation token">(</SPAN>sde_conn<SPAN class="punctuation token">,</SPAN> prefix<SPAN class="punctuation token">,</SPAN> featureService<SPAN class="punctuation token">,</SPAN> timezone<SPAN class="punctuation token">,</SPAN> portal<SPAN class="punctuation token">,</SPAN> username<SPAN class="punctuation token">,</SPAN> password<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>SetParameterAsText<SPAN class="punctuation token">(</SPAN><SPAN class="number token">7</SPAN><SPAN class="punctuation token">,</SPAN> sde_conn<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#pass</SPAN>
<SPAN class="keyword token">if</SPAN> __name__ <SPAN class="operator token">==</SPAN> <SPAN class="string token">'__main__'</SPAN><SPAN class="punctuation token">:</SPAN>
main<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>