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

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