Package iceprod :: Package client :: Package gtk :: Module gtkicetray
[hide private]
[frames] | no frames]

Source Code for Module iceprod.client.gtk.gtkicetray

   1  #!/bin/env python 
   2  # 
   3   
   4  """ 
   5   Main window for GtkIcetraConfig application 
   6   
   7   copyright (c) 2005 the icecube collaboration 
   8   
   9   @version: $Revision: $ 
  10   @date: 2006-02-07T13:17:44 
  11   @author: Juan Carlos Diaz Velez <juancarlos@icecube.wisc.edu> 
  12  """ 
  13   
  14  import sys,os 
  15  import pygtk 
  16  pygtk.require('2.0') 
  17  import gtk 
  18  import gtk.gdk 
  19  import getpass 
  20  import getopt 
  21  import logging 
  22  import cPickle 
  23  import threading 
  24  import logo 
  25  from os.path import expandvars 
  26  from GtkProjects import GtkProjects 
  27  from GtkServices import GtkServices  
  28  from GtkModules  import GtkModules 
  29  from GtkIceProdPre import GtkIceProdPre 
  30  from GtkIceProdPost import GtkIceProdPost 
  31  from GtkFileChooser import * 
  32  from GtkSteering import GtkSteering 
  33  from GtkOFilter import GtkOFilter 
  34  from GtkDAGRel import GtkDAGRel 
  35  from GtkExtern import GtkExtern 
  36  from GtkSteerBatchOpt import GtkSteerBatchOpt 
  37  from GtkSteerDepend import GtkSteerDepend 
  38  from GtkInput import GtkInput 
  39  from gtkrunlist import GtkRunList 
  40  from gtkmetaprojectlist import GtkMetaProjectList 
  41  from iceprod.core.xmlwriter import IceTrayXMLWriter 
  42  from iceprod.core.xmlparser import IceTrayXMLParser 
  43  from iceprod.core.dataclasses import * 
  44  from iceprod.core.paramdb import * 
  45  from iceprod.core.configuration import Config 
  46  from iceprod.client.soaptrayclient import i3SOAPClient 
  47   
  48  logger = logging.getLogger('gtkicetray') 
  49   
  50  #counter to keep track of howmany windows are open 
  51  instances = 0 
  52   
  53   
54 -class GtkConfig:
55 56 _paramuser = None 57 _parampasswd = None 58 _produser = None 59 _prodpasswd = None 60 resume_action = None 61
62 - def RunTest(self):
63 self.test = True
64
65 - def _getprodurl(self):
66 67 if not self.url: 68 if self.cfg.GetValue('URL'): 69 self.url = self.cfg.GetValue('URL').split(',') 70 else: 71 self.url = ['https://condor.icecube.wisc.edu:9080'] 72 return self.url
73
74 - def _setprodurl(self,url):
75 while len(self.url) > 10: self.url.pop() 76 if url in self.url: 77 self.url.pop(self.url.index(url)) 78 self.url.insert(0,url) 79 self.cfg.SetValue('URL',','.join(self.url)) 80 return url
81
82 - def _getproduser(self):
83 if not self._produser: 84 self._produser = self.cfg.GetValue('ConfigDatabaseUser') 85 if not self._produser: 86 self._produser = getpass.getuser() 87 return self._produser
88
89 - def _setproduser(self,user):
90 self._produser = user 91 self.cfg.SetValue('ConfigDatabaseUser',user) 92 return self._produser
93
94 - def _getprodpass(self,reset=False):
95 if reset or not self._prodpasswd: 96 self._prodpasswd = getpass.getpass("Password for '%s': " % self._getproduser() ) 97 return self._prodpasswd
98
99 - def _hasprodpass(self):
100 return self._prodpasswd
101
102 - def _setprodpass(self,passwd):
103 self._prodpasswd = passwd 104 return self._prodpasswd
105
106 - def _getparamserver(self):
107 if not self.pdb_server: 108 self.pdb_server = self.cfg.GetValue('ParameterDatabaseServer') 109 return self.pdb_server
110
111 - def _setparamserver(self,server):
112 self.pdb_server = server 113 self.cfg.SetValue('ParameterDatabaseServer',server) 114 return self.pdb_server
115
116 - def _getprodserver(self):
117 if not self.cdb_server: 118 self.cdb_server = self.parent.cfg.GetValue('ConfigDatabaseServer') 119 return self.cdb_server
120 121
122 - def _setprodserver(self,server):
123 self.cdb_server = server 124 self.cfg.SetValue('ConfigDatabaseServer',server) 125 return self.cdb_server
126 127
128 - def _getparamdb(self):
129 if not self.pdb_name: 130 self.pdb_name = self.cfg.GetValue('ParameterDatabase') 131 return self.pdb_name
132
133 - def _setparamdb(self,db):
134 self.pdb_name=db 135 self.cfg.SetValue('ParameterDatabase',db) 136 return self.pdb_name
137
138 - def _getproddb(self):
139 if not self.cdb_name: 140 self.cdb_name = self.cfg.GetValue('ConfigDatabase') 141 return self.cdb_name
142
143 - def _setproddb(self,db):
144 self.cdb_name=db 145 self.cfg.SetValue('ConfigDatabase',db) 146 return self.cdb_name
147 148
149 - def _getparamuser(self):
150 if not self._paramuser: 151 self._paramuser = self.cfg.GetValue('ParameterDatabaseUser') 152 if not self._paramuser: 153 self._paramuser = getpass.getuser() 154 return self._paramuser
155
156 - def _setparamuser(self,user):
157 self._paramuser = user 158 self.cfg.SetValue('ParameterDatabaseUser',user) 159 return self._paramuser
160
161 - def _getparampass(self,reset=False):
162 if reset or not self._parampasswd: 163 self._parampasswd = getpass.getpass("Password for '%s': " % self._getparamuser() ) 164 return self._parampasswd
165
166 - def _setparampass(self,passwd):
167 self._parampasswd = passwd 168 return self._parampasswd
169
170 - def set_resume_action(self,action):
171 self.resume_action = action
172
173 - def resume_action_callback(self):
174 if self.resume_action: 175 self.resume_action() 176 self.resume_action = None
177
178 - def rotate_book(self, button, notebook):
179 """ 180 This method rotates the position of the tabs 181 """ 182 183 notebook.set_tab_pos((notebook.get_tab_pos()+1) %4) 184 return
185
186 - def tabsborder_book(self, button, notebook):
187 """ 188 Add/Remove the page tabs and the borders 189 """ 190 191 tval = False 192 bval = False 193 if self.show_tabs == False: 194 tval = True 195 if self.show_border == False: 196 bval = True 197 198 notebook.set_show_tabs(tval) 199 self.show_tabs = tval 200 notebook.set_show_border(bval) 201 self.show_border = bval 202 return
203
204 - def remove_book(self, button, notebook):
205 """ 206 Remove a page from the notebook 207 """ 208 page = notebook.get_current_page() 209 notebook.remove_page(page) 210 # Need to refresh the widget -- 211 # This forces the widget to redraw itself. 212 notebook.queue_draw_area(0,0,-1,-1)
213
214 - def delete(self, widget, event=None):
215 self.SaveCookies() 216 self.cfg.Write() 217 self.config = None 218 global instances 219 instances -= 1 220 if instances < 1: gtk.main_quit() 221 return False
222
223 - def GetPathPrefix(self):
224 """ 225 Get prefix path from entry 226 """ 227 if self.steering.GetOF(): 228 self.steering.GetOF().SetPrefix(self.prefixentry.get_text()) 229 return self.steering.GetOF().GetPrefix()
230 231
232 - def saveas(self,widget):
233 """ 234 menu item - Save configuration to file and prompt for filename 235 """ 236 self.savefilechooser = GtkSaveFileChooser(self)
237 238
239 - def savefile(self,widget,configfile=None):
240 """ 241 menu item - Save configuration to file 242 @param widget: gtk widget 243 @param configfile: current name of file 244 """ 245 if not configfile: 246 configfile = self.configfile 247 for tray in self.trays: 248 tray.GetEvents() 249 tray.GetIterations() 250 self.GetPathPrefix() 251 writer = IceTrayXMLWriter(self.steering,add_descriptions=self.showdefaults) 252 writer.write_to_file(configfile)
253
254 - def addtray(self,widget):
255 """ 256 menu item - Add new IceTrayConfig object 257 """ 258 self.steering.AddTray(IceTrayConfig()) 259 self.ReloadWidgets()
260 261
262 - def deltray(self,widget):
263 """ 264 menu item - delete IceTrayConfig object 265 """ 266 # self.steering.AddTray(IceTrayConfig()) 267 page = self.notebook.get_current_page() 268 print page 269 if page > 0: 270 self.steering.RemoveTray(page-1) 271 del self.trays[page-1] 272 self.notebook.remove_page(page) 273 self.ReloadWidgets() 274 else: 275 self.PrintText("No IceTray selected.")
276
277 - def addof(self,widget):
278 """ 279 menu item - Add new OfflineFilter object 280 """ 281 if not self.steering.GetOF(): 282 self.steering.SetOF(OfflineFilter()) 283 self.ReloadWidgets()
284
285 - def addextern(self,widget):
286 """ 287 menu item - Add new External object 288 """ 289 if not self.steering.GetExterns(): 290 self.steering.AddExtern(Extern()) 291 self.ReloadWidgets()
292
293 - def delof(self,widget):
294 """ 295 menu item - delete OfflineFilter object 296 """ 297 if self.steering.GetOF(): 298 self.steering.SetOF(None) 299 self.ReloadWidgets() 300 page = self.steernote.get_current_page() 301 page = self.steernote.get_nth_page(4) 302 self.steernote.remove_page(4) 303 else: 304 self.PrintText("Nothing to remove.")
305
306 - def enable_dragndrop(self,widget):
307 self.dragndrop = not self.dragndrop 308 for tray in self.trays: 309 for widget in tray.mywidgets: 310 print widget, 'dragndrop' 311 widget.SetDragNDrop(self.dragndrop)
312
313 - def enable_defaults(self,widget):
314 self.showdefaults = not self.showdefaults
315 316
317 - def switchversion(self,widget):
318 """ 319 menu item - globally switch metaprojects 320 """ 321 try: 322 self.ReloadWidgets() 323 mlist = GtkMetaProjectList(self.pdb,self) 324 except Exception,e: 325 logger.error(e) 326 pass
327
328 - def open(self,widget):
329 """ 330 menu item - Display Filechooser dialog to load configuration file 331 """ 332 self.openfilechooser = GtkOpenFileChooser(self,self.configfile)
333
334 - def close(self,widget):
335 """ 336 menu item - remove config file 337 """ 338 self.CloseConfig()
339
340 - def new(self,widget):
341 """ 342 menu item - start new config 343 """ 344 if not self.steering: 345 steering = Steering() 346 steering.AddTray(IceTrayConfig()) 347 self.LoadConfig(steering) 348 else: 349 newconfig = GtkConfig(self._produser,self.prodflag,True) 350 newconfig.LoadConfig(Steering())
351 352
353 - def PrintText(self,text,append=True):
354 """ 355 Write text to console window and automatically scroll to end 356 @param text: Text to append to message area 357 """ 358 359 buffer = self.consoletv.get_buffer() 360 if append: 361 try: 362 buffer.insert(buffer.get_end_iter(),text+'\n') 363 self.consoletv.scroll_mark_onscreen(buffer.get_insert()) 364 except Exception,e : 365 logger.error(str(e)) 366 else: 367 try: 368 buffer.set_text(text+'\n') 369 self.consoletv.scroll_mark_onscreen(buffer.get_insert()) 370 except Exception,e : 371 logger.error(str(e)) 372 373 return True
374 375
376 - def submit_form(self,widget):
377 for tray in self.trays: 378 tray.GetEvents() 379 tray.GetIterations() 380 self.GetPathPrefix() 381 check,str = self.steering.CheckConfig() 382 if not check: 383 self.PrintText('Configuration error: %s' % str) 384 return 385 386 if self.prodflag: # Get DIF_Plus metadata info 387 gtkinputwindow = GtkInput(self,self.test) 388 else: 389 self.submit_auth(self.submit) 390 return
391
392 - def check_server(self,widget):
393 client = i3SOAPClient(geturl=self.geturl) 394 client.SetPrinter(self.PrintText) 395 try: 396 self.PrintText(client.check_server(),append=False) 397 except Exception,e: 398 self.PrintText("failed to connect to server: %s" % e)
399 400
401 - def submit(self):
402 client = i3SOAPClient(geturl=self.geturl) 403 client.SetPrinter(self.PrintText) 404 self.PrintText("submitting request...") 405 406 passwd = self._getprodpass() 407 408 i3q = client.submit( 409 self.steering, 410 self._getproduser(), 411 passwd, 412 self.prodflag) 413 414 if i3q: 415 self.add_job_to_menu(i3q) 416 del client
417 418
419 - def submit_auth(self,func):
420 421 auth_func = lambda x: ( 422 (i3SOAPClient(geturl=self.geturl).authenticate( 423 self._setproduser(username_entry.get_text()), 424 self._setprodpass(password_entry.get_text())) \ 425 and (func(), auth_dialog.destroy() ) 426 or error_label.set_text("Failed.."))) 427 428 auth_dialog = gtk.Dialog(title='authentication', parent=None, flags=0 ); 429 error_label = gtk.Label() 430 error_label.show() 431 432 username_label = gtk.Label("Username:") 433 username_label.show() 434 435 username_entry = gtk.Entry() 436 username_entry.set_text(self._getproduser()) 437 username_entry.show() 438 439 password_label = gtk.Label("Password:") 440 password_label.show() 441 442 password_entry = gtk.Entry() 443 password_entry.set_visibility(False) 444 if self._hasprodpass(): 445 password_entry.set_text(self._getprodpass()) 446 password_entry.show() 447 password_entry.connect("activate", auth_func) 448 449 cancel_button = gtk.Button('Cancel') 450 cancel_button.show() 451 cancel_button.connect("clicked", lambda widget: \ 452 self.PrintText("cancelled.") and auth_dialog.destroy()) 453 454 submit_button = gtk.Button('Submit') 455 submit_button.show() 456 submit_button.connect("clicked", auth_func) 457 458 auth_dialog.vbox.pack_start(error_label, True, True, 0) 459 auth_dialog.vbox.pack_start(username_label, True, True, 0) 460 auth_dialog.vbox.pack_start(username_entry, True, True, 0) 461 auth_dialog.vbox.pack_start(password_label, True, True, 0) 462 auth_dialog.vbox.pack_start(password_entry, True, True, 0) 463 auth_dialog.action_area.pack_start(cancel_button, True, True, 0) 464 auth_dialog.action_area.pack_start(submit_button, True, True, 0) 465 auth_dialog.show()
466 467
468 - def pdbauth(self,db,onfailure=None,args=()):
469 470 auth_dialog = gtk.Dialog(title='authentication', parent=None, flags=0 ); 471 472 username_label = gtk.Label("Username:") 473 username_label.show() 474 475 username_entry = gtk.Entry() 476 username_entry.set_text(self._getparamuser()) 477 username_entry.show() 478 479 password_label = gtk.Label("Password:") 480 password_label.show() 481 482 password_entry = gtk.Entry() 483 password_entry.set_visibility(False) 484 password_entry.show() 485 486 server_label = gtk.Label("Server:") 487 server_entry = gtk.Entry() 488 if self._getparamserver(): 489 server_entry.set_text(self._getparamserver()) 490 server_label.show() 491 server_entry.show() 492 493 database_label = gtk.Label("Database:") 494 database_entry = gtk.Entry() 495 if self._getparamdb(): 496 database_entry.set_text(self._getparamdb()) 497 database_label.show() 498 database_entry.show() 499 500 cancel_button = gtk.Button('Cancel') 501 cancel_button.show() 502 cancel_button.connect("clicked", lambda widget: auth_dialog.destroy()) 503 504 submit_button = gtk.Button('OK') 505 submit_button.show() 506 507 authfunc = lambda x: (db.authenticate( 508 self._setparamserver(server_entry.get_text()), 509 self._setparamuser(username_entry.get_text()), 510 self._setparampass(password_entry.get_text()), 511 self._setparamdb(database_entry.get_text()), 512 True) , 513 auth_dialog.destroy(), 514 self.resume_action_callback(), 515 onfailure and apply(onfailure,args)) 516 517 username_entry.connect("activate", authfunc) 518 password_entry.connect("activate", authfunc) 519 server_entry.connect("activate", authfunc) 520 database_entry.connect("activate", authfunc) 521 submit_button.connect("clicked", authfunc) 522 523 524 auth_dialog.vbox.pack_start(username_label, True, True, 0) 525 auth_dialog.vbox.pack_start(username_entry, True, True, 0) 526 auth_dialog.vbox.pack_start(password_label, True, True, 0) 527 auth_dialog.vbox.pack_start(password_entry, True, True, 0) 528 auth_dialog.vbox.pack_start(server_label, True, True, 0) 529 auth_dialog.vbox.pack_start(server_entry, True, True, 0) 530 auth_dialog.vbox.pack_start(database_label, True, True, 0) 531 auth_dialog.vbox.pack_start(database_entry, True, True, 0) 532 auth_dialog.action_area.pack_start(cancel_button, True, True, 0) 533 auth_dialog.action_area.pack_start(submit_button, True, True, 0) 534 auth_dialog.show()
535
536 - def add_job_to_menu(self,job):
537 jobs_item = gtk.MenuItem("Run " + str(job.GetClusterId())) 538 new_job_menu = gtk.Menu() 539 jobs_item.set_submenu(new_job_menu) 540 541 check_job_item = gtk.MenuItem("Check status") 542 check_job_item.connect("activate",self.check_job,job) 543 new_job_menu.append(check_job_item) 544 check_job_item.show() 545 546 terminate_job_item = gtk.MenuItem("Terminate") 547 terminate_job_item.connect("activate",self.remove_job,job) 548 new_job_menu.append(terminate_job_item) 549 terminate_job_item.show() 550 551 clear_job_item = gtk.MenuItem("Clear job") 552 clear_job_item.connect("activate",self.clear_job,job) 553 new_job_menu.append(clear_job_item) 554 clear_job_item.show() 555 556 jobs_item.show() 557 self.jobs_menu.prepend(jobs_item) 558 self.job_q_list.append((job,jobs_item))
559 560
561 - def run(self,widget,data=None):
562 """ 563 Run job on local computer (where client is running). This 564 requires that your I3_WORK environment is set. 565 """ 566 self.PrintText('Running IceTray on local computer in %s' % os.getenv('I3_WORK') ) 567 self.PrintText('Output is printed to stdout (for now)') 568 self.PrintText('-'*40) 569 threading.Thread(target=self.run_thread).start()
570
571 - def run_thread(self):
572 IceTrayXMLWriter(self.GetSteering()).write_to_file('.tmp.xml') 573 path = expandvars('$I3_BUILD/bin/runconfig.py') 574 cmd = '%s .tmp.xml 2>&1' % path 575 print cmd 576 cout = os.popen(cmd,'r') 577 eline = cout.readline() 578 line = 0 579 buff = "" 580 while eline: 581 if line%30 == 0: 582 self.PrintText(buff) 583 buff = "" 584 buff += "\n" + eline.strip() 585 eline = cout.readline() 586 line += 1 587 cout.close() 588 return
589 590
591 - def clear_jobs(self,widget):
592 for job in self.job_q_list: 593 self.jobs_menu.remove(job[1]) 594 del job 595 self.job_q_list = []
596
597 - def check_job(self,widget,job):
598 """ 599 Request status of job from server 600 @todo: deal with proxy option 601 Note: This might seem like a security risk. One might hack the local 602 version of an I3Queue object to run a different command on the 603 server. However, the the server uses the class definitions from it's 604 own libraries and does not care about the client implementation of 605 this class. 606 """ 607 logger.debug("checking status of job from on host %s" % \ 608 job.url or job.GetHost() ) 609 610 client = i3SOAPClient(geturl=self.geturl) 611 client.SetPrinter(self.PrintText) 612 check_q = lambda:client.check_q(job,self._getproduser(),self._getprodpass()) 613 self.submit_auth(check_q)
614
615 - def remove_job(self,widget,job):
616 """ 617 Request removal of job from queue 618 @todo: deal with proxy option 619 """ 620 logger.info("requesting removal of job from queue on host %s" % \ 621 job.url or job.GetHost() ) 622 623 client = i3SOAPClient(geturl=self.geturl) 624 client.SetPrinter(self.PrintText) 625 q_remove = lambda:client.q_remove(job,self._getproduser(),self._getprodpass()) 626 self.submit_auth(q_remove)
627
628 - def clear_job(self,widget,job):
629 630 for j in range(len(self.job_q_list)): 631 if self.job_q_list[j][0].GetClusterId() == job.GetClusterId(): 632 self.jobs_menu.remove(self.job_q_list[j][1]) 633 del self.job_q_list[j] 634 return
635 636 637 638
639 - def getconfig(self,filename):
640 try: 641 steering = Steering() 642 self.configfile = filename 643 self.parser = IceTrayXMLParser(steering) 644 self.parser.ParseFile(filename,validate=self.validatexml) 645 self.LoadConfig(steering) 646 self.ReloadWidgets() 647 except Exception,e: 648 sys.excepthook(sys.exc_type,sys.exc_value,sys.exc_traceback) 649 logger.error(e)
650
651 - def loadpdbfile(self,widget):
652 try: 653 opendbfilechooser = GtkOpenDBFileChooser(self) 654 except Exception,e: logger.error(e)
655
656 - def updatedb(self,widget):
657 try: 658 self.pdb.download() 659 savedbfilechooser = GtkSaveDBFileChooser(self) 660 except Exception,e: 661 logger.debug(e) 662 pass
663
664 - def docupage(self,widget):
665 try: 666 import webbrowser 667 webbrowser.open("http://wiki.icecube.wisc.edu/index.php/IceProd") 668 except Exception,e: 669 logger.debug(e) 670 pass
671
672 - def download(self,widget):
673 try: 674 client = i3SOAPClient(geturl=self.geturl) 675 client.SetPrinter(self.PrintText) 676 self.runlist = GtkRunList(client,self) 677 except Exception,e: 678 logger.error(e) 679 sys.excepthook(sys.exc_type,sys.exc_value,sys.exc_traceback) 680 pass
681
682 - def SetConfigFile(self,cfile):
683 self.configfile = cfile
684
685 - def GetConfigFile(self):
686 return self.configfile
687
688 - def SetSteering(self,steering):
689 self.steering = steering
690 691
692 - def GetIceTrayConfig(self,index=0):
693 return self.steering.GetTrays()[index]
694
695 - def GetSteering(self):
696 return self.steering
697
698 - def reload_widget(self,tab,event,widget):
699 widget.reload(self.steering)
700
701 - def ReloadWidgets(self):
702 for w in self.mywidgets: 703 w.reload(self.steering) 704 705 for t in range(max(0,len(self.steering.GetTrays())), 706 max(0,len(self.trays))): 707 self.notebook.remove_page(t+1) 708 709 for t in range(len(self.steering.GetTrays())): 710 if t < len(self.trays): 711 self.trays[t].reload(self.steering.GetTray(t)) 712 if len(self.trays) > 1: 713 self.notebook.set_tab_label_text(self.trays[t], 714 "IceTray[%d]" % t ) 715 else: 716 self.notebook.set_tab_label_text(self.trays[t], "IceTray") 717 else: 718 self.AddTrayTab(self.steering.GetTray(t)) 719 720 if self.steering.GetOF(): 721 self.AddFilterTab(self.steering)
722 723 724
725 - def LoadCookies(self,cfg=os.path.join(os.getenv('HOME'),".gtkicetray_cookies")):
726 try: 727 cfile = open(cfg); 728 joblist = cPickle.load(cfile) 729 730 for job in joblist: 731 self.add_job_to_menu(job) 732 except Exception, e: 733 self.PrintText(str(e)) 734 pass # don't care if there aren't any cookies
735
736 - def SaveCookies(self,cfg=os.path.join(os.getenv('HOME'),".gtkicetray_cookies")):
737 try: 738 jobs = [job for job,job_entry in self.job_q_list] 739 cfile = open(cfg,'w'); 740 cPickle.dump(jobs,cfile) 741 except Exception,e: 742 logger.warn("could not save cookies: %s" % e)
743
744 - def SaveXMLpdb(self):
745 try: 746 self.pdb.savefile(expandvars("$HOME/.gtktray-paramdb")) 747 except Exception,e: 748 logger.warn("could not save parameter db: %s" % e)
749
750 - def MakeToolbar(self):
751 toolbar = gtk.Toolbar() 752 toolbar.set_orientation(gtk.ORIENTATION_HORIZONTAL) 753 toolbar.set_style(gtk.TOOLBAR_ICONS) 754 755 run_icon = gtk.Image() 756 run_icon.set_from_stock(gtk.STOCK_EXECUTE,gtk.ICON_SIZE_SMALL_TOOLBAR) 757 toolbar.append_element( 758 gtk.TOOLBAR_CHILD_RADIOBUTTON, # type of element 759 None, # widget 760 "Run","Run","",run_icon, 761 self.run, # signal 762 toolbar) # data for signal 763 764 stop_icon = gtk.Image() 765 stop_icon.set_from_stock(gtk.STOCK_STOP,gtk.ICON_SIZE_SMALL_TOOLBAR) 766 toolbar.append_element( 767 gtk.TOOLBAR_CHILD_RADIOBUTTON, # type of element 768 None, # widget 769 "Stop","Stop","",stop_icon, 770 None, # signal 771 toolbar) # data for signal 772 773 toolbar.show() 774 handlebox = gtk.HandleBox() 775 handlebox.add(toolbar) 776 777 return handlebox
778
779 - def MakeMenu(self):
780 """ 781 Create menubar and add menu items 782 """ 783 784 menu_bar = gtk.MenuBar() 785 786 file_menu = gtk.Menu() 787 file_menu.show() 788 789 file_menu_item = gtk.MenuItem("_File") 790 file_menu_item.show() 791 file_menu_item.set_submenu(file_menu) 792 menu_bar.append(file_menu_item) 793 794 edit_menu = gtk.Menu() 795 edit_menu.show() 796 self.edit_menu = edit_menu 797 798 edit_menu_item = gtk.MenuItem("_Edit") 799 edit_menu_item.show() 800 edit_menu_item.set_submenu(edit_menu) 801 menu_bar.append(edit_menu_item) 802 803 addtray_item = gtk.MenuItem("add tray") 804 addtray_item.connect("activate",self.addtray) 805 addtray_item.show() 806 edit_menu.append(addtray_item) 807 808 deltray_item = gtk.MenuItem("remove tray") 809 deltray_item.connect("activate",self.deltray) 810 deltray_item.show() 811 edit_menu.append(deltray_item) 812 813 addof_item = gtk.MenuItem("add filter description") 814 addof_item.connect("activate",self.addof) 815 addof_item.show() 816 edit_menu.append(addof_item) 817 818 delof_item = gtk.MenuItem("remove filter description") 819 delof_item.connect("activate",self.delof) 820 delof_item.show() 821 edit_menu.append(delof_item) 822 823 jobs_menu = gtk.Menu() 824 jobs_menu.show() 825 self.jobs_menu = jobs_menu 826 827 jobs_menu_item = gtk.MenuItem("_Jobs") 828 jobs_menu_item.show() 829 jobs_menu_item.set_submenu(jobs_menu) 830 menu_bar.append(jobs_menu_item) 831 self.LoadCookies() 832 833 tools_menu = gtk.Menu() 834 tools_menu.show() 835 self.tools_menu = tools_menu 836 837 tools_menu_item = gtk.MenuItem("_Tools") 838 tools_menu_item.show() 839 tools_menu_item.set_submenu(tools_menu) 840 menu_bar.append(tools_menu_item) 841 842 help_menu = gtk.Menu() 843 help_menu.show() 844 self.help_menu = help_menu 845 846 help_menu_item = gtk.MenuItem("_Help") 847 help_menu_item.show() 848 help_menu_item.set_submenu(help_menu) 849 menu_bar.append(help_menu_item) 850 851 documentation_item = gtk.MenuItem("IceProd _Documentation") 852 documentation_item.connect("activate",self.docupage) 853 documentation_item.show() 854 help_menu.append(documentation_item) 855 856 open_item = gtk.MenuItem("_Open...") 857 open_item.connect("activate",self.open) 858 open_item.show() 859 file_menu.append(open_item) 860 861 new_item = gtk.MenuItem("_New") 862 new_item.connect("activate",self.new) 863 new_item.show() 864 file_menu.append(new_item) 865 866 close_item = gtk.MenuItem("_Close") 867 close_item.connect("activate",self.close) 868 close_item.show() 869 file_menu.append(close_item) 870 871 download_item = gtk.MenuItem("_Download...") 872 download_item.connect("activate",self.download) 873 download_item.show() 874 file_menu.append(download_item) 875 876 save_item = gtk.MenuItem("_Save") 877 save_item.connect("activate",self.savefile) 878 save_item.show() 879 file_menu.append(save_item) 880 881 saveas_item = gtk.MenuItem("Save _As...") 882 saveas_item.connect("activate",self.saveas) 883 saveas_item.show() 884 file_menu.append(saveas_item) 885 886 submit_item = gtk.MenuItem("Submit _Dataset") 887 submit_item.connect("activate",self.submit_form) 888 submit_item.show() 889 file_menu.append(submit_item) 890 891 run_item = gtk.MenuItem("_Run (local)") 892 run_item.connect("activate",self.run) 893 run_item.show() 894 file_menu.append(run_item) 895 896 quit_item = gtk.MenuItem("_Quit") 897 quit_item.connect("activate",self.delete) 898 quit_item.show() 899 file_menu.append(quit_item) 900 901 clear_jobs_item = gtk.MenuItem("_Clear jobs") 902 clear_jobs_item.connect("activate",self.clear_jobs) 903 clear_jobs_item.show() 904 jobs_menu.append(clear_jobs_item) 905 906 updatedb_item = gtk.MenuItem("_Download Parameter DB...") 907 updatedb_item.connect("activate",self.updatedb) 908 updatedb_item.show() 909 tools_menu.append(updatedb_item) 910 911 loadpdb_item = gtk.MenuItem("_Load Parameter DB File...") 912 loadpdb_item.connect("activate",self.loadpdbfile) 913 loadpdb_item.show() 914 tools_menu.append(loadpdb_item) 915 916 upgrade_item = gtk.MenuItem("_Upgrade Metaprojects...") 917 upgrade_item.connect("activate",self.switchversion) 918 upgrade_item.show() 919 tools_menu.append(upgrade_item) 920 921 drag_item = gtk.CheckMenuItem("_Enable drag & drop") 922 drag_item.connect("activate",self.enable_dragndrop) 923 drag_item.show() 924 tools_menu.append(drag_item) 925 926 desc_item = gtk.CheckMenuItem("_Enable Defaults") 927 desc_item.connect("activate",self.enable_defaults) 928 desc_item.show() 929 tools_menu.append(desc_item) 930 931 return menu_bar
932
933 - def get_i3config(self):
934 return self.steering
935
936 - def geturl(self):
937 return self._setprodurl(self.url_entry.get_child().get_text())
938
939 - def __init__(self, user=None,prod=False,auth=True):
940 self.steering = None 941 self.dragndrop = False 942 self.showdefaults = False 943 self.configfile = "newconfig.xml" 944 self.host = None 945 self.url = [] 946 self.job_q_list = [] 947 self._user = user 948 self.prodflag = prod 949 self.test = False 950 self.trays = [] 951 self.child_pid = 0 952 self.validatexml = True 953 gtk.gdk.threads_init() 954 955 self.cfg = Config(os.path.join(os.getenv('HOME'),".gtkicetrayrc")) 956 try: 957 self.cfg.Read() 958 except Exception,e: 959 print >> sys.stderr, "Could not find configuration" 960 961 if self.cfg.GetValue('URL'): 962 self.url = self.cfg.GetValue('URL').split(',') 963 else: 964 self.url = [] 965 self.pdb = RPCParamDB(geturl=self.geturl) 966 self.pdb.SetPrinter(self.PrintText) 967 self.mywidgets = [] 968 969 self.consoletv = gtk.TextView() 970 self.consoletv.set_cursor_visible(False) 971 self.consoletv.set_wrap_mode(gtk.WRAP_NONE) 972 self.consoletv.set_editable(False) 973 974 table = gtk.Table(3,6,False) 975 consolesw = gtk.ScrolledWindow() 976 self.vbox = gtk.VBox(False,0) 977 self.vpane = gtk.VPaned() 978 menu_bar = self.MakeMenu() 979 menu_bar.show() 980 self.vbox.pack_start(menu_bar,False,False,2) 981 982 hbox = gtk.HBox(False,1) 983 self.url_entry = gtk.combo_box_entry_new_text() 984 urlframe = gtk.Frame("URL") 985 for url in self._getprodurl(): 986 self.url_entry.append_text(url) 987 self.url_entry.set_active(0) 988 989 urlframe.add(self.url_entry) 990 urlframe.show() 991 992 run_icon = gtk.Image() 993 pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(logo.xpm_image_data) 994 run_icon.set_from_stock(gtk.STOCK_EXECUTE,gtk.ICON_SIZE_SMALL_TOOLBAR) 995 #run_icon.set_from_pixbuf(pixbuf.scale_simple(30,30,gtk.gdk.INTERP_TILES)) 996 run_icon.show() 997 run_button = gtk.Button('',stock=gtk.STOCK_NETWORK) 998 #run_button.set_image(run_icon) 999 run_button.show() 1000 run_button.connect("clicked", self.check_server) 1001 hbox.pack_start(urlframe,True,True,2) 1002 hbox.pack_start(run_button,False,False,2) 1003 hbox.show() 1004 1005 self.url_entry.show() 1006 self.vbox.pack_start(hbox,False,False,2) 1007 1008 self.vbox.pack_end(self.vpane,True,True,2) 1009 self.vpane.pack1(table,True,True) 1010 self.vpane.pack2(consolesw,True,True) 1011 self.vbox.show() 1012 self.vpane.show() 1013 1014 consolesw.set_size_request(100, 140) 1015 consolesw.add(self.consoletv) 1016 consolesw.show() 1017 self.consoletv.show() 1018 1019 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 1020 global instances 1021 instances += 1 1022 window = self.window 1023 window.connect("delete_event", self.delete) 1024 window.set_border_width(10) 1025 window.set_size_request(750, 750) 1026 window.add(self.vbox) 1027 window.set_resizable(True) 1028 window.set_position(gtk.WIN_POS_CENTER_ALWAYS) 1029 window.show() 1030 icon = window.render_icon(gtk.STOCK_DIALOG_INFO, gtk.ICON_SIZE_BUTTON) 1031 pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(logo.xpm_image_data) 1032 window.set_icon(pixbuf) 1033 window.show() 1034 1035 # Create a new notebook, place the position of the tabs 1036 self.notebook = gtk.Notebook() 1037 self.notebook.set_tab_pos(gtk.POS_TOP) 1038 table.attach(self.notebook, 0,6,0,1) 1039 self.notebook.show() 1040 self.show_tabs = True 1041 self.show_border = True 1042 table.show()
1043
1044 - def CloseConfig(self):
1045 self.steering = None 1046 for w in self.mywidgets: del w 1047 self.mywidgets = [] 1048 self.trays = [] 1049 while self.notebook.get_current_page() >= 0: 1050 self.notebook.remove_page(self.notebook.get_current_page())
1051
1052 - def LoadConfig(self,steering):
1053 # Steering 1054 self.CloseConfig() 1055 self.steering = steering 1056 label = gtk.Label("Steering") 1057 self.steernote = gtk.Notebook() 1058 self.steernote.show() 1059 self.notebook.append_page(self.steernote, label) 1060 1061 frame = gtk.Frame("Steering") 1062 frame.set_border_width(10) 1063 frame.set_size_request(400, 365) 1064 frame.show() 1065 1066 label = gtk.Label("Parameters") 1067 label.show() 1068 gtksteering = GtkSteering(self.steering) 1069 frame.add(gtksteering) 1070 self.mywidgets.append(gtksteering) 1071 self.steernote.append_page(frame, label) 1072 1073 # Steering - batch options 1074 frame = gtk.Frame("Archive Dependencies") 1075 frame.set_border_width(10) 1076 frame.set_size_request(400, 365) 1077 frame.show() 1078 1079 label = gtk.Label("Dependencies") 1080 label.show() 1081 gtksteerdepend = GtkSteerDepend(self.steering) 1082 frame.add(gtksteerdepend) 1083 self.mywidgets.append(gtksteerdepend) 1084 self.steernote.append_page(frame, label) 1085 1086 # Steering - batch options 1087 frame = gtk.Frame("Batch System Options") 1088 frame.set_border_width(10) 1089 frame.set_size_request(400, 365) 1090 frame.show() 1091 1092 label = gtk.Label("BatchOpts") 1093 label.show() 1094 gtkbatchopts = GtkSteerBatchOpt(self.steering) 1095 frame.add(gtkbatchopts) 1096 self.mywidgets.append(gtkbatchopts) 1097 self.steernote.append_page(frame, label) 1098 1099 # Steering - Externs 1100 frame = gtk.Frame("Externals") 1101 frame.set_border_width(10) 1102 frame.set_size_request(400, 365) 1103 frame.show() 1104 label = gtk.Label("Externals") 1105 label.show() 1106 gtkextern = GtkExtern(self.steering) 1107 frame.add(gtkextern) 1108 self.mywidgets.append(gtkextern) 1109 self.steernote.append_page(frame, label) 1110 1111 if self.steering.GetOF(): 1112 self.AddFilterTab(self.steering) 1113 1114 for tray in self.steering.GetTrays(): 1115 self.AddTrayTab(tray) 1116 1117 #if steering.GetTaskDefinitions(): 1118 # self.AddTaskTab(self.steering) 1119 1120 # Set what page to start at (page 0) 1121 self.notebook.set_current_page(0) 1122 1123 # Create a bunch of buttons 1124 button = gtk.Button("close") 1125 button.connect("clicked", self.delete) 1126 button.show()
1127 1128
1129 - def AddTrayTab(self,tray):
1130 """ 1131 Add a new icetray configuration tab 1132 @param tray: the new IceTrayConfig object 1133 """ 1134 # Tray 1135 gtktray = GtkIceTray(tray,self.pdb) 1136 gtktray.SetPrinter(self.PrintText) 1137 gtktray.show() 1138 label = gtk.Label() 1139 self.notebook.append_page(gtktray, label) 1140 label.set_text("IceTray[%d]" % len(self.trays) ) 1141 label.show() 1142 self.trays.append(gtktray)
1143
1144 - def AddFilterTab(self,steering):
1145 hbox = gtk.HBox() 1146 fbox = gtk.VBox() 1147 self.prefixentry = EventEntry("Prefix") 1148 label = gtk.Label("Prefix") 1149 self.prefixentry.set_reload_function(steering.GetOF().GetPrefix) 1150 self.prefixentry.set_text(str(steering.GetOF().GetPrefix())) 1151 self.prefixentry.show() 1152 hbox.pack_start(self.prefixentry,False,False,2) 1153 fbox.pack_start(hbox) 1154 hbox.show() 1155 1156 frame = gtk.Frame("OfflineFilter") 1157 frame.set_border_width(10) 1158 frame.set_size_request(400, 365) 1159 frame.show() 1160 fbox.pack_start(frame) 1161 fbox.show() 1162 1163 if not steering.GetOF(): steering.SetOF(OfflineFilter()) 1164 label = gtk.Label("OfflineFilter") 1165 label.show() 1166 gtkof = GtkOFilter(steering) 1167 frame.add(gtkof) 1168 self.mywidgets.append(gtkof) 1169 self.steernote.append_page(fbox, label)
1170
1171 - def AddTaskTab(self,steering):
1172 fbox = gtk.VBox() 1173 frame = gtk.Frame("TaskRel") 1174 frame.set_border_width(10) 1175 frame.set_size_request(400, 365) 1176 frame.show() 1177 fbox.pack_start(frame) 1178 fbox.show() 1179 1180 label = gtk.Label("TaskRel") 1181 label.show() 1182 gtk_tasks = GtkDAGRel(steering) 1183 frame.add(gtk_tasks) 1184 self.mywidgets.append(gtk_tasks) 1185 self.steernote.append_page(fbox, label)
1186 1187 1188
1189 -class GtkIceTray(gtk.VBox):
1190
1191 - def reload(self,tray):
1192 self.tray = tray 1193 self.evententry.set_text(self.tray.GetEvents()) 1194 self.iterentry.set_text(self.tray.GetIterations()) 1195 1196 for widget in self.mywidgets: 1197 widget.reload(tray)
1198
1199 - def reload_widget(self,tab,event,widget):
1200 widget.reload(self.tray)
1201
1202 - def SetPrinter(self,printer):
1203 for widget in self.mywidgets: 1204 widget.SetPrinter(printer)
1205
1206 - def GetEvents(self):
1207 self.tray.SetEvents(int(self.evententry.get_text())) 1208 return self.tray.GetEvents()
1209
1210 - def GetIterations(self):
1211 self.tray.SetIterations(int(self.iterentry.get_text())) 1212 return self.tray.GetIterations()
1213
1214 - def __init__(self,tray,database):
1215 gtk.VBox.__init__(self) 1216 self.tray = tray 1217 self.pdb = database 1218 self.mywidgets = [] 1219 hbox = gtk.HBox() 1220 self.evententry=EventEntry() 1221 self.evententry.set_text(str(self.tray.GetEvents())) 1222 self.evententry.show() 1223 self.iterentry=EventEntry("Iterations") 1224 self.iterentry.set_reload_function(IceTrayConfig.GetIterations) 1225 self.iterentry.set_text(str(self.tray.GetIterations())) 1226 self.iterentry.show() 1227 hbox.pack_start(self.evententry,False,False,2) 1228 hbox.pack_start(self.iterentry,False,False,2) 1229 hbox.show() 1230 1231 self.pack_start(hbox,False,False,2) 1232 1233 self.notebook = gtk.Notebook() 1234 1235 # IceProdPre 1236 frame = gtk.Frame("IceProdPre") 1237 frame.set_border_width(10) 1238 frame.set_size_request(400, 365) 1239 frame.show() 1240 1241 label = gtk.Label("IceProdPre") 1242 label.show() 1243 gtkpres = GtkIceProdPre(self.tray,self.pdb) 1244 frame.add(gtkpres) 1245 self.mywidgets.append(gtkpres) 1246 self.notebook.append_page(frame, label) 1247 1248 # Modules 1249 frame = gtk.Frame("Modules") 1250 frame.set_border_width(10) 1251 frame.set_size_request(400, 365) 1252 frame.show() 1253 1254 label = gtk.Label("Modules") 1255 label.show() 1256 gtkmodules = GtkModules(self.tray,self.pdb) 1257 frame.add(gtkmodules) 1258 self.mywidgets.append(gtkmodules) 1259 self.notebook.append_page(frame, label) 1260 1261 # Services 1262 frame = gtk.Frame("Services") 1263 frame.set_border_width(10) 1264 frame.set_size_request(400, 365) 1265 frame.show() 1266 1267 label = gtk.Label("Services") 1268 label.show() 1269 gtkservices = GtkServices(self.tray,self.pdb) 1270 frame.add(gtkservices) 1271 self.mywidgets.append(gtkservices) 1272 self.notebook.append_page(frame, label) 1273 1274 # IceProdPost 1275 frame = gtk.Frame("IceProdPost") 1276 frame.set_border_width(10) 1277 frame.set_size_request(400, 365) 1278 frame.show() 1279 1280 label = gtk.Label("IceProdPost") 1281 label.show() 1282 gtkposts = GtkIceProdPost(self.tray,self.pdb) 1283 frame.add(gtkposts) 1284 self.mywidgets.append(gtkposts) 1285 self.notebook.append_page(frame, label) 1286 1287 1288 # Projects 1289 vbox = gtk.VBox() 1290 frame = gtk.Frame() 1291 frame.set_border_width(10) 1292 frame.set_size_request(500, 365) 1293 frame.show() 1294 1295 gtkprojects = GtkProjects(tray,self.pdb) 1296 self.mywidgets.append(gtkprojects) 1297 1298 tab = gtkTab("Projects") 1299 tab.connect('button_press_event',self.reload_widget,gtkprojects) 1300 tab.show() 1301 self.notebook.append_page(gtkprojects, tab) 1302 self.pack_start(self.notebook,False,False,2) 1303 self.notebook.show() 1304 1305 self.notebook.set_current_page(1)
1306 1307 1308 1309 # Connections 1310 # frame = gtk.Frame("Connections") 1311 # frame.set_border_width(10) 1312 # frame.set_size_request(400, 375) 1313 # frame.show() 1314 1315 # label = gtk.Label("Connections") 1316 # label.show() 1317 # gtkconnections = GtkConnections(self.tray) 1318 # frame.add(gtkconnections) 1319 # self.mywidgets.append(gtkconnections) 1320 # self.notebook.append_page(frame, label) 1321 1322
1323 -class gtkTab(gtk.EventBox):
1324
1325 - def __init__(self,label_text):
1326 gtk.EventBox.__init__(self) 1327 self.set_events(gtk.gdk.BUTTON_PRESS_MASK) 1328 self.label = gtk.Label(label_text) 1329 self.add(self.label)
1330
1331 - def show(self):
1332 gtk.EventBox.show(self) 1333 self.label.show()
1334 1335
1336 -class EventEntry(gtk.Frame):
1337
1338 - def __init__(self,title="Events"):
1339 gtk.Frame.__init__(self,title) 1340 self.evententry = gtk.Entry() 1341 self.add(self.evententry) 1342 self.reload_func = IceTrayConfig.GetEvents
1343
1344 - def set_reload_function(self,func):
1345 self.reload_func = func
1346
1347 - def reload(self,tray):
1348 self.evententry.set_text(str(self.reload_func(tray)))
1349
1350 - def show(self):
1351 gtk.Frame.show(self) 1352 self.evententry.show()
1353
1354 - def get_text(self):
1355 return self.evententry.get_text()
1356
1357 - def set_text(self,txt):
1358 self.evententry.set_text(str(txt))
1359
1360 -def main():
1361 GtkConfig() 1362 return 0
1363 1364 if __name__ == "__main__": 1365 main() 1366