I have a tool that I am running in python....how do I convert into a .py
I want to default the input parameters and run as .py
<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">def</SPAN> <SPAN class="token function">getToken</SPAN><SPAN class="punctuation token">(</SPAN>username<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">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>
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="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">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>
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>
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>
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>
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>
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>
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">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>
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">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="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="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>
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>
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>
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="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>
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="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>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'======================'</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage <SPAN class="punctuation token">(</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="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'exception:'</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage <SPAN class="punctuation token">(</SPAN>err<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage <SPAN class="punctuation token">(</SPAN>err<SPAN class="punctuation token">.</SPAN>args<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage <SPAN class="punctuation token">(</SPAN>sys<SPAN class="punctuation token">.</SPAN>exc_info<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage <SPAN class="punctuation token">(</SPAN>sys<SPAN class="punctuation token">.</SPAN>exc_info<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>tb_lineno<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'----------------------'</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'arcpy messages:'</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage <SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>GetMessages<SPAN class="punctuation token">(</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage <SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>GetMessages<SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</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">'======================'</SPAN><SPAN class="punctuation 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> arcpy<SPAN class="punctuation token">.</SPAN>GetParameterAsText<SPAN class="punctuation token">(</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN>
prefix <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>GetParameterAsText<SPAN class="punctuation token">(</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">)</SPAN>
featureService <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>GetParameterAsText<SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">)</SPAN>
timezone <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>GetParameterAsText<SPAN class="punctuation token">(</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">)</SPAN>
portal <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>GetParameterAsText<SPAN class="punctuation token">(</SPAN><SPAN class="number token">4</SPAN><SPAN class="punctuation token">)</SPAN>
username <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>GetParameterAsText<SPAN class="punctuation token">(</SPAN><SPAN class="number token">5</SPAN><SPAN class="punctuation token">)</SPAN>
password <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>GetParameterAsText<SPAN class="punctuation token">(</SPAN><SPAN class="number token">6</SPAN><SPAN class="punctuation token">)</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="keyword 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>