Package arcjobtool :: Package plugins :: Module ScriptPlugin
[hide private]
[frames] | no frames]

Source Code for Module arcjobtool.plugins.ScriptPlugin

  1  # -*- coding: iso-8859-15 -*- 
  2  # generated by wxGlade HG on Fri Aug 28 10:05:56 2009 
  3   
  4  import wx 
  5   
  6  # begin wxGlade: extracode 
  7  # end wxGlade 
  8   
  9  from wx.lib.dialogs import * 
 10   
 11  import os 
 12   
 13  from arcjobtool.ArcUtils import * 
 14  from arcjobtool.Tasks import * 
 15  from arcjobtool.plugins.Plugins import * 
 16  from arcjobtool.PlatformUtils import * 
 17   
 18  runScriptTemplate = """#!/bin/sh 
 19  chmod +x ./%s 
 20  ./%s 
 21  """ 
 22   
23 -class ScriptTask(BaseTask):
24 - def __init__(self):
25 BaseTask.__init__(self) 26 27 self.description = "Script" 28 29 # Task specific attributes 30 31 self.__mainFile = "" 32 self.packages = [] 33 self.extraFiles = []
34
35 - def onCreateRunScript(self, taskName, taskId):
36 """ 37 Abstract routine responsible for returning a 38 run-script for the job. 39 """ 40 return runScriptTemplate % (self.__mainFile, self.__mainFile)
41
42 - def onCreateJobDescription(self, taskName, taskId, taskDir):
43 """ 44 Abstract routines responsible for returning a jobdescription for 45 the job. 46 """ 47 48 # Create a managed job description 49 50 job = ManagedJobDescription(); 51 job.Application.Executable.Name = "run.sh" 52 job.Identification.JobName = str(taskName) 53 job.Resources.TotalWallTime = arc.ScalableTimeInt(self.cpuTime*60) 54 #job.addArgument("run.sh") 55 56 # Make sure we store the full paths of input files 57 58 for inputFile in self.inputFiles.keys(): 59 url = self.inputFiles[inputFile] 60 if url == "": 61 fullPath = os.path.join(taskDir, inputFile) 62 job.addInputFile(fullPath) 63 else: 64 job.addInputFile(inputFile, url) 65 66 #job.addRuntimeEnvironment("APPS/MATH/Script",">=","1.0.0") 67 job.Application.Output = "stdout.txt" 68 job.Application.Error = "stderr.txt" 69 job.addOutputFile("/", "") 70 71 #job.Print(True) 72 #print job.UnParse() 73 74 return job
75
76 - def onSaveConfig(self, config):
77 config.add_section("scriptplugin") 78 config.set("scriptplugin", "mainfile", self.mainFile)
79
80 - def onLoadConfig(self, config):
81 try: 82 self.mainFile = config.get("scriptplugin", "mainfile") 83 except: 84 pass
85
86 - def setMainFile(self, filename):
87 self.__mainFile = filename
88
89 - def getMainFile(self):
90 return self.__mainFile
91
92 - def addPackage(self, filename):
93 pass
94
95 - def addExtraFile(self, filename):
96 pass
97
98 - def removePackage(self, filename):
99 pass
100
101 - def removeExtraFile(self, filename):
102 pass
103 104 mainFile = property(getMainFile, setMainFile)
105
106 -class ScriptPlugin(PluginBase):
107 - def onInit(self):
108 self.__task = ScriptTask()
109
110 - def onDestroy(self):
111 pass
112
113 - def onEdit(self):
114 dlg = ScriptPluginDialog(None, -1, "") 115 dlg.task = self.__task 116 dlg.ShowModal() 117 dlg.Destroy() 118 self.__task = dlg.task
119
120 - def onSave(self, workDir):
121 (taskLocation, taskDirName) = os.path.split(workDir) 122 self.__task.name = taskDirName.split(".")[0] 123 self.__task.workDir = workDir 124 self.__task.save()
125
126 - def onLoad(self, workDir):
127 (taskLocation, taskDirName) = os.path.split(workDir) 128 self.__task.name = taskDirName.split(".")[0] 129 self.__task.workDir = workDir 130 self.__task.load()
131
132 - def onClean(self):
133 self.__task.clean()
134
135 - def onSetup(self):
136 self.__task.setup()
137
138 - def onGetId(self):
139 return "ScriptPlugin"
140
141 - def onGetVersion(self):
142 return (0,1,0)
143
144 - def onGetDescription(self):
145 return "Script job definition plugin."
146
147 - def onGetShortName(self):
148 return "Script job definition."
149
150 - def onNeedSave(self):
151 return self.__task.dirty
152
153 - def onGetTask(self):
154 return self.__task
155 156 id = property(onGetId) 157 version = property(onGetVersion) 158 shortname = property(onGetShortName) 159 description = property(onGetDescription) 160 task = property(onGetTask)
161 162
163 -class ScriptPluginDialog(wx.Dialog):
164 - def __init__(self, *args, **kwds):
165 # begin wxGlade: ScriptPluginDialog.__init__ 166 kwds["style"] = wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.THICK_FRAME 167 wx.Dialog.__init__(self, *args, **kwds) 168 self.notebook_1 = wx.Notebook(self, -1, style=0) 169 self.generalPane = wx.Panel(self.notebook_1, -1) 170 self.nameLabel = wx.StaticText(self.generalPane, -1, "Name", style=wx.ALIGN_RIGHT) 171 self.jobNameText = wx.TextCtrl(self.generalPane, -1, "", style=wx.TE_READONLY) 172 self.cputTimeLabel = wx.StaticText(self.generalPane, -1, "CPU Time (min)", style=wx.ALIGN_RIGHT) 173 self.cpuTimeText = wx.TextCtrl(self.generalPane, -1, "") 174 self.notifyLabel = wx.StaticText(self.generalPane, -1, "Notify (email)", style=wx.ALIGN_RIGHT) 175 self.notifyText = wx.TextCtrl(self.generalPane, -1, "") 176 self.notifyMemoryLabel = wx.StaticText(self.generalPane, -1, "Memory (MB)", style=wx.ALIGN_RIGHT) 177 self.memoryText = wx.TextCtrl(self.generalPane, -1, "") 178 self.inputFilePane = wx.Panel(self.notebook_1, -1) 179 self.inputFilesLabel = wx.StaticText(self.inputFilePane, -1, "Input files") 180 self.inputFileList = wx.ListBox(self.inputFilePane, -1, choices=[]) 181 self.addFileButton = wx.Button(self.inputFilePane, -1, "Add...") 182 self.createButton = wx.Button(self.inputFilePane, -1, "Create...") 183 self.removeFileButton = wx.Button(self.inputFilePane, -1, "Remove") 184 self.clearFilesButton = wx.Button(self.inputFilePane, -1, "Clear") 185 self.inputFileEditButton = wx.Button(self.inputFilePane, -1, "Edit...") 186 self.mainFileLabel = wx.StaticText(self.inputFilePane, -1, "Main script file") 187 self.mainFileChoice = wx.Choice(self.inputFilePane, -1, choices=[]) 188 self.parameterPane = wx.Panel(self.notebook_1, -1) 189 self.parameterFilesLabel = wx.StaticText(self.parameterPane, -1, "Parameter substitution files") 190 self.paramFilesList = wx.ListBox(self.parameterPane, -1, choices=[]) 191 self.AddParamFileButton = wx.Button(self.parameterPane, -1, "Add...") 192 self.removeParamFileButton = wx.Button(self.parameterPane, -1, "Remove") 193 self.clearParamFilesButton = wx.Button(self.parameterPane, -1, "Clear") 194 self.paramFileEditButton = wx.Button(self.parameterPane, -1, "Edit...") 195 self.static_line_1 = wx.StaticLine(self.parameterPane, -1) 196 self.sweepSizeLabel = wx.StaticText(self.parameterPane, -1, "Sweep size", style=wx.ALIGN_RIGHT) 197 self.sweepSizeSpinner = wx.SpinCtrl(self.parameterPane, -1, "0", min=1, max=1000) 198 self.saveButton = wx.Button(self, -1, "Save") 199 self.closeButton = wx.Button(self, -1, "Close") 200 201 self.__set_properties() 202 self.__do_layout() 203 204 self.Bind(wx.EVT_BUTTON, self.onAddFile, self.addFileButton) 205 self.Bind(wx.EVT_BUTTON, self.onCreateFile, self.createButton) 206 self.Bind(wx.EVT_BUTTON, self.onRemoveFile, self.removeFileButton) 207 self.Bind(wx.EVT_BUTTON, self.onClearFiles, self.clearFilesButton) 208 self.Bind(wx.EVT_BUTTON, self.onEditInputFile, self.inputFileEditButton) 209 self.Bind(wx.EVT_CHOICE, self.onSelectMainFile, self.mainFileChoice) 210 self.Bind(wx.EVT_BUTTON, self.onAddParamFile, self.AddParamFileButton) 211 self.Bind(wx.EVT_BUTTON, self.onRemoveParamFileButton, self.removeParamFileButton) 212 self.Bind(wx.EVT_BUTTON, self.onClearParamFilesButton, self.clearParamFilesButton) 213 self.Bind(wx.EVT_BUTTON, self.onEditParamFile, self.paramFileEditButton) 214 self.Bind(wx.EVT_BUTTON, self.onSave, self.saveButton) 215 self.Bind(wx.EVT_BUTTON, self.onClose, self.closeButton)
216 # end wxGlade 217
218 - def __set_properties(self):
219 # begin wxGlade: ScriptPluginDialog.__set_properties 220 self.SetTitle("Script job definition") 221 self.SetSize((410, 368)) 222 self.nameLabel.SetMinSize((120, -1)) 223 self.jobNameText.SetMinSize((-1, 27)) 224 self.cputTimeLabel.SetMinSize((120, -1)) 225 self.cpuTimeText.SetMinSize((-1, 27)) 226 self.notifyLabel.SetMinSize((120, -1)) 227 self.notifyText.SetMinSize((-1, 27)) 228 self.notifyMemoryLabel.SetMinSize((120, -1)) 229 self.memoryText.SetMinSize((-1, 27)) 230 self.sweepSizeLabel.SetMinSize((120, -1))
231 # end wxGlade 232
233 - def __do_layout(self):
234 # begin wxGlade: ScriptPluginDialog.__do_layout 235 sizer_1 = wx.BoxSizer(wx.VERTICAL) 236 sizer_2 = wx.BoxSizer(wx.HORIZONTAL) 237 sizer_11 = wx.BoxSizer(wx.VERTICAL) 238 sizer_12 = wx.BoxSizer(wx.HORIZONTAL) 239 sizer_13 = wx.BoxSizer(wx.HORIZONTAL) 240 sizer_14 = wx.BoxSizer(wx.VERTICAL) 241 sizer_9 = wx.BoxSizer(wx.VERTICAL) 242 sizer_10 = wx.BoxSizer(wx.VERTICAL) 243 sizer_8 = wx.BoxSizer(wx.HORIZONTAL) 244 sizer_9_copy = wx.BoxSizer(wx.VERTICAL) 245 sizer_3 = wx.BoxSizer(wx.VERTICAL) 246 sizer_7 = wx.BoxSizer(wx.HORIZONTAL) 247 sizer_6 = wx.BoxSizer(wx.HORIZONTAL) 248 sizer_5 = wx.BoxSizer(wx.HORIZONTAL) 249 sizer_4 = wx.BoxSizer(wx.HORIZONTAL) 250 sizer_4.Add(self.nameLabel, 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) 251 sizer_4.Add(self.jobNameText, 1, wx.RIGHT|wx.EXPAND, 4) 252 sizer_3.Add(sizer_4, 0, wx.TOP|wx.EXPAND, 10) 253 sizer_5.Add(self.cputTimeLabel, 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) 254 sizer_5.Add(self.cpuTimeText, 1, wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE, 4) 255 sizer_3.Add(sizer_5, 0, wx.EXPAND, 0) 256 sizer_6.Add(self.notifyLabel, 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) 257 sizer_6.Add(self.notifyText, 1, wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE, 4) 258 sizer_3.Add(sizer_6, 0, wx.EXPAND, 0) 259 sizer_7.Add(self.notifyMemoryLabel, 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5) 260 sizer_7.Add(self.memoryText, 1, wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE, 5) 261 sizer_3.Add(sizer_7, 0, wx.EXPAND, 0) 262 self.generalPane.SetSizer(sizer_3) 263 sizer_9.Add(self.inputFilesLabel, 0, wx.LEFT|wx.TOP|wx.ADJUST_MINSIZE, 4) 264 sizer_8.Add(self.inputFileList, 1, wx.ALL|wx.EXPAND|wx.ADJUST_MINSIZE, 4) 265 sizer_9_copy.Add(self.addFileButton, 0, wx.ADJUST_MINSIZE, 0) 266 sizer_9_copy.Add(self.createButton, 0, wx.ADJUST_MINSIZE, 0) 267 sizer_9_copy.Add(self.removeFileButton, 0, wx.ADJUST_MINSIZE, 0) 268 sizer_9_copy.Add(self.clearFilesButton, 0, wx.ADJUST_MINSIZE, 0) 269 sizer_9_copy.Add(self.inputFileEditButton, 0, wx.TOP|wx.ADJUST_MINSIZE, 7) 270 sizer_8.Add(sizer_9_copy, 0, wx.ALL|wx.EXPAND, 4) 271 sizer_9.Add(sizer_8, 1, wx.EXPAND, 0) 272 sizer_10.Add(self.mainFileLabel, 0, wx.ADJUST_MINSIZE, 0) 273 sizer_10.Add(self.mainFileChoice, 0, wx.EXPAND|wx.ADJUST_MINSIZE, 0) 274 sizer_9.Add(sizer_10, 0, wx.ALL|wx.EXPAND, 4) 275 self.inputFilePane.SetSizer(sizer_9) 276 sizer_11.Add(self.parameterFilesLabel, 0, wx.LEFT|wx.TOP|wx.ADJUST_MINSIZE, 4) 277 sizer_13.Add(self.paramFilesList, 1, wx.ALL|wx.EXPAND|wx.ADJUST_MINSIZE, 4) 278 sizer_14.Add(self.AddParamFileButton, 0, wx.ADJUST_MINSIZE, 0) 279 sizer_14.Add(self.removeParamFileButton, 0, wx.ADJUST_MINSIZE, 0) 280 sizer_14.Add(self.clearParamFilesButton, 0, wx.ADJUST_MINSIZE, 0) 281 sizer_14.Add(self.paramFileEditButton, 0, wx.TOP|wx.ADJUST_MINSIZE, 7) 282 sizer_13.Add(sizer_14, 0, wx.ALL|wx.EXPAND, 4) 283 sizer_11.Add(sizer_13, 1, wx.EXPAND, 0) 284 sizer_11.Add(self.static_line_1, 0, wx.TOP|wx.EXPAND, 5) 285 sizer_12.Add(self.sweepSizeLabel, 0, wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 0) 286 sizer_12.Add(self.sweepSizeSpinner, 0, wx.TOP|wx.ADJUST_MINSIZE, 2) 287 sizer_11.Add(sizer_12, 0, wx.TOP|wx.BOTTOM|wx.EXPAND, 4) 288 self.parameterPane.SetSizer(sizer_11) 289 self.notebook_1.AddPage(self.generalPane, "General") 290 self.notebook_1.AddPage(self.inputFilePane, "Input files") 291 self.notebook_1.AddPage(self.parameterPane, "Parameters") 292 sizer_1.Add(self.notebook_1, 1, wx.ALL|wx.EXPAND, 8) 293 sizer_2.Add(self.saveButton, 0, wx.ADJUST_MINSIZE, 0) 294 sizer_2.Add(self.closeButton, 0, wx.ADJUST_MINSIZE, 0) 295 sizer_1.Add(sizer_2, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 4) 296 self.SetSizer(sizer_1) 297 self.Layout()
298 # end wxGlade 299
300 - def __setupInputFiles(self):
301 """ 302 Setup listbox for input files and choice box 303 for selecting main file. 304 """ 305 self.inputFileList.Clear() 306 self.mainFileChoice.Clear() 307 308 filenameDict = {} 309 count = 0 310 311 # Fill listbox and choice box 312 313 if self.__task!=None: 314 for inputFile in self.__task.inputFiles.keys(): 315 self.inputFileList.Append(inputFile) 316 filenameDict[inputFile] = count 317 count = count + 1 318 self.mainFileChoice.Append(inputFile) 319 320 # Select main file (if any) in the choice box 321 322 if filenameDict.has_key(self.__task.mainFile): 323 print "filenameDict has key", self.__task.mainFile 324 print "Selection = ", filenameDict[self.__task.mainFile] 325 self.mainFileChoice.SetSelection(filenameDict[self.__task.mainFile])
326
327 - def __setupSweepFiles(self):
328 329 self.paramFilesList.Clear() 330 331 # Fill listbox 332 333 if self.__task!=None: 334 for sweepFile in self.__task.sweepFiles.keys(): 335 print sweepFile 336 self.paramFilesList.Append(sweepFile)
337 338
339 - def onSave(self, event): # wxGlade: ScriptPluginDialog.<event_handler>
340 self.__task.cpuTime = int(self.cpuTimeText.GetValue()) 341 self.__task.notify = self.notifyText.GetValue() 342 self.__task.memory = int(self.memoryText.GetValue()) 343 self.__task.sweepSize = int(self.sweepSizeSpinner.GetValue()) 344 self.__task.dirty = True 345 self.Close()
346
347 - def onClose(self, event): # wxGlade: ScriptPluginDialog.<event_handler>
348 self.__task.dirty = False 349 self.Close() 350
351 - def setTask(self, task):
352 self.__task = task 353 354 self.jobNameText.SetValue(self.__task.name) 355 self.cpuTimeText.SetValue(str(self.__task.cpuTime)) 356 self.notifyText.SetValue(self.__task.notify) 357 self.memoryText.SetValue(str(self.__task.memory)) 358 self.sweepSizeSpinner.SetValue(int(self.__task.sweepSize)) 359 360 self.__setupInputFiles() 361 self.__setupSweepFiles()
362
363 - def getTask(self):
364 return self.__task
365
366 - def onAddFile(self, event): # wxGlade: ScriptPluginDialog.<event_handler>
367 inputFilename = wx.FileSelector("Add input file", default_path=os.getcwd()) 368 if inputFilename != "": 369 self.__task.addAndCopyInputFile(inputFilename) 370 self.__setupInputFiles() 371
372 - def onRemoveFile(self, event): # wxGlade: ScriptPluginDialog.<event_handler>
373 if self.inputFileList.GetStringSelection()!="": 374 self.__task.removeInputFile(self.inputFileList.GetStringSelection()) 375 self.__setupInputFiles() 376
377 - def onClearFiles(self, event): # wxGlade: ScriptPluginDialog.<event_handler>
378 self.__task.clearInputFiles() 379 self.__setupInputFiles() 380 381 task = property(getTask, setTask) 382
383 - def onSelectMainFile(self, event): # wxGlade: ScriptPluginDialog.<event_handler>
384 mainFile = self.mainFileChoice.GetStringSelection() 385 if mainFile != "": 386 self.__task.mainFile = mainFile 387
388 - def onAddParamFile(self, event): # wxGlade: ScriptPluginDialog.<event_handler>
389 result = singleChoiceDialog(self, "Add file for substitution", "Input files", self.__task.inputFiles) 390 if result.accepted: 391 self.__task.addSweepFile(result.selection) 392 self.__setupSweepFiles() 393
394 - def onRemoveParamFileButton(self, event): # wxGlade: ScriptPluginDialog.<event_handler>
395 if self.paramFilesList.GetStringSelection()!="": 396 self.__task.removeSweepFile(self.paramFilesList.GetStringSelection()) 397 self.__setupSweepFiles() 398
399 - def onClearParamFilesButton(self, event): # wxGlade: ScriptPluginDialog.<event_handler>
400 self.__task.clearSweepFiles() 401 self.__setupSweepFiles() 402
403 - def onEditInputFile(self, event): # wxGlade: ScriptPluginDialog.<event_handler>
404 if self.inputFileList.GetStringSelection()!="": 405 fullPath = os.path.join(self.__task.workDir,self.inputFileList.GetStringSelection()) 406 editFile(fullPath) 407
408 - def onEditParamFile(self, event): # wxGlade: ScriptPluginDialog.<event_handler>
409 if self.paramFilesList.GetStringSelection()!="": 410 fullPath = os.path.join(self.__task.workDir,self.paramFilesList.GetStringSelection()) 411 editFile(fullPath) 412
413 - def onCreateFile(self, event): # wxGlade: ScriptPluginDialog.<event_handler>
414 result = textEntryDialog(self, "Create file", "Filename", "noname.txt") 415 416 if result.accepted: 417 fullPath = os.path.join(self.__task.workDir, str(result.text)) 418 419 newFile = open(fullPath, "w") 420 newFile.close() 421 422 editFile(fullPath) 423 424 self.__task.addAndCopyInputFile(fullPath, copyFile = False) 425 self.__setupInputFiles() 426 427 # end of class ScriptPluginDialog 428 429 if __name__ == "__main__": 430 app = wx.PySimpleApp(0) 431 wx.InitAllImageHandlers() 432 mainDialog = ScriptPluginDialog(None, -1, "") 433 app.SetTopWindow(mainDialog) 434 mainDialog.Show() 435 app.MainLoop() 436