1
2
3
4 import wx
5
6
7
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
25 BaseTask.__init__(self)
26
27 self.description = "Script"
28
29
30
31 self.__mainFile = ""
32 self.packages = []
33 self.extraFiles = []
34
36 """
37 Abstract routine responsible for returning a
38 run-script for the job.
39 """
40 return runScriptTemplate % (self.__mainFile, self.__mainFile)
41
43 """
44 Abstract routines responsible for returning a jobdescription for
45 the job.
46 """
47
48
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
55
56
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
67 job.Application.Output = "stdout.txt"
68 job.Application.Error = "stderr.txt"
69 job.addOutputFile("/", "")
70
71
72
73
74 return job
75
77 config.add_section("scriptplugin")
78 config.set("scriptplugin", "mainfile", self.mainFile)
79
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
94
97
100
103
104 mainFile = property(getMainFile, setMainFile)
105
161
162
165
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
217
219
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
232
234
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
299
326
328
329 self.paramFilesList.Clear()
330
331
332
333 if self.__task!=None:
334 for sweepFile in self.__task.sweepFiles.keys():
335 print sweepFile
336 self.paramFilesList.Append(sweepFile)
337
338
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
348 self.__task.dirty = False
349 self.Close()
350
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
365
367 inputFilename = wx.FileSelector("Add input file", default_path=os.getcwd())
368 if inputFilename != "":
369 self.__task.addAndCopyInputFile(inputFilename)
370 self.__setupInputFiles()
371
373 if self.inputFileList.GetStringSelection()!="":
374 self.__task.removeInputFile(self.inputFileList.GetStringSelection())
375 self.__setupInputFiles()
376
378 self.__task.clearInputFiles()
379 self.__setupInputFiles()
380
381 task = property(getTask, setTask)
382
383 - def onSelectMainFile(self, event):
384 mainFile = self.mainFileChoice.GetStringSelection()
385 if mainFile != "":
386 self.__task.mainFile = mainFile
387
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
395 if self.paramFilesList.GetStringSelection()!="":
396 self.__task.removeSweepFile(self.paramFilesList.GetStringSelection())
397 self.__setupSweepFiles()
398
400 self.__task.clearSweepFiles()
401 self.__setupSweepFiles()
402
404 if self.inputFileList.GetStringSelection()!="":
405 fullPath = os.path.join(self.__task.workDir,self.inputFileList.GetStringSelection())
406 editFile(fullPath)
407
409 if self.paramFilesList.GetStringSelection()!="":
410 fullPath = os.path.join(self.__task.workDir,self.paramFilesList.GetStringSelection())
411 editFile(fullPath)
412
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
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