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

Source Code for Module iceprod.client.gtk.GtkInput

  1  #!/bin/env python 
  2  #   copyright  (c) 2005 
  3  #   the icecube collaboration 
  4  #   $Id: $ 
  5  # 
  6  #   @version $Revision: $ 
  7  #   @date $Date: $ 
  8  #   @author Juan Carlos Diaz Velez <juancarlos@icecube.wisc.edu> 
  9  #       @brief icetray connections frame for GtkIcetraConfig application 
 10  ######################################################################### 
 11   
 12  import pygtk 
 13  import threading 
 14  pygtk.require('2.0') 
 15  import gtk 
 16  import re 
 17  import time 
 18  from gtkcal import Cal 
 19  import iceprod 
 20  from iceprod.core import dataclasses 
 21  from iceprod.core.dataclasses import * 
 22  from iceprod.core import metadata 
 23  from iceprod.core import lex 
 24  from GtkAddSimCat import GtkAddSimCat  
 25  from iceprod.client.soaptrayclient import i3SOAPClient 
 26   
 27   
28 -class GtkInput:
29
30 - def __init__(self,parent,test=False,template=False):
31 32 self.parent = parent 33 self.ticket = 0 34 self.maxjobs = 0 35 self.descriptionstr = iceprod.client.descriptionstr 36 self.description = "" 37 self.descmap = {} 38 self.difplus = metadata.DIF_Plus() 39 self.dif = self.difplus.GetDIF() 40 self.plus = self.difplus.GetPlus() 41 self.vbox = gtk.VBox(False,0) 42 self.tv = gtk.TextView() 43 self.template = template 44 if test: 45 buff = self.tv.get_buffer() 46 buff.insert(buff.get_end_iter(),'Test...') 47 self.sw = gtk.ScrolledWindow() 48 49 self.frame = gtk.Frame() 50 self.frame.set_border_width(20) 51 52 self.sumframe = gtk.Frame("Summary") 53 self.sumframe.set_border_width(10) 54 self.sumframe.show() 55 self.sumframe.add(self.sw) 56 57 self.b0 = gtk.Button('Submit',stock=gtk.STOCK_EXECUTE) 58 self.b0.connect('clicked', self.submit) 59 60 self.hbbox = gtk.HButtonBox() 61 self.hbbox.pack_start(self.b0, False, False, 1) 62 63 gridbox = gtk.HBox() 64 # Grid(s) 65 self.grid_entry = gtk.Entry() 66 self.grid_entry.set_max_length(300) 67 self.grid_entry.connect("activate", self.submit) 68 self.gridframe = gtk.Frame("Grid(s) to use") 69 if self.template: 70 self.grid_entry.set_text("Hut1") 71 self.gridframe.add(self.grid_entry) 72 gridbox.pack_start(self.gridframe,False,False,1) 73 74 # Maxjobs 75 print self.template 76 if self.template: 77 self.maxjobs = 10 78 self.maxjobs_entry = gtk.Entry() 79 self.maxjobs_entry.set_max_length(10) 80 self.maxjobs_entry.connect("activate", self.submit) 81 self.maxjobs_entry.set_text(str(self.maxjobs)) 82 self.maxjobsframe = gtk.Frame("Number of jobs in dataset") 83 self.maxjobsframe.add(self.maxjobs_entry) 84 gridbox.pack_start(self.maxjobsframe,False,False,1) 85 86 self.vbox.pack_start(gridbox,False,False,1) 87 88 # Title Text field 89 #self.title_entry = gtk.Entry() 90 if test: 91 self.dif.SetEntryTitle('test') 92 elif self.template: 93 self.dif.SetEntryTitle('Template') 94 95 #self.title_entry.set_max_length(80) 96 #self.title_entry.connect("activate", self.submit) 97 #self.entryframe = gtk.Frame("DIF Entry Title") 98 #self.entryframe.add(self.title_entry) 99 100 hbox = gtk.HBox() 101 #hbox.pack_start(self.entryframe,False,False,1) 102 103 # DIF Sensor menu 104 hbbox = gtk.HButtonBox() 105 sensor_menu = gtk.combo_box_new_text() 106 sensor_menu.connect('changed', self.set_dif_sensor) 107 self.dif.SetSensorName("ICECUBE") 108 if test or self.template: 109 item = sensor_menu.append_text("ICECUBE") 110 sensor_menu.set_active(0) 111 else: 112 for s in self.dif.GetValidSensorNames(): 113 item = sensor_menu.append_text(s) 114 sensorIndex = self.dif.GetValidSensorNames().keys().index('ICECUBE') 115 sensor_menu.set_active(sensorIndex) 116 117 self.sensorframe = gtk.Frame("Sensor") 118 self.sensorframe.add(sensor_menu) 119 120 hbbox.pack_start(self.sensorframe,False,False,1) 121 hbox.pack_start(hbbox,False,False,1) 122 123 #initialize descripton 124 steering = self.parent.GetSteering() 125 what = steering.GetParameter('description') 126 if what: 127 self.descriptionstr = what.GetValue() 128 else: 129 steering.AddParameter("string","description",descriptionstr) 130 131 inputdataset = steering.GetParameter('inputdataset') 132 if inputdataset: 133 self.descriptionstr += "input dataset %s. " % inputdataset.GetValue() 134 135 136 137 # Simprod Ticket No. 138 self.ticket_entry = gtk.Entry() 139 140 self.ticket_entry.set_max_length(6) 141 self.ticket_entry.connect("activate", self.submit) 142 self.ticket_entry.set_text('0') 143 self.ticketframe = gtk.Frame("SimProd Ticket No.") 144 self.ticketframe.add(self.ticket_entry) 145 146 hbox.pack_start(self.ticketframe,False,False,1) 147 148 149 # Parent dataset 150 if self.template: 151 self.parent.GetSteering().SetParentId(0) 152 parentId = self.parent.GetSteering().GetParentId() 153 self.pid_entry = gtk.Label() 154 self.pid_entry.set_markup( 155 "<span foreground='red'><b>%d</b></span>" % parentId) 156 self.pidframe = gtk.Frame("Parent ID") 157 self.pidframe.add(self.pid_entry) 158 hbox.pack_start(self.pidframe,False,False,1) 159 self.vbox.pack_start(hbox,False,False,1) 160 161 162 # Plus Category menu 163 category_menu = gtk.combo_box_new_text() 164 category_menu.connect('changed', self.set_plus_category) 165 if test or self.template: 166 self.plus.SetCategory('unclassified') 167 item = category_menu.append_text(self.plus.GetCategory()) 168 for cat in self.plus.GetValidCategories(): 169 if cat != 'unclassified': 170 item = category_menu.append_text(cat) 171 else: 172 item = category_menu.append_text("[Select Category]") 173 for cat in self.plus.GetValidCategories(): 174 item = category_menu.append_text(cat) 175 category_menu.set_active(0) 176 177 self.catframe = gtk.Frame("Category") 178 self.catframe.add(category_menu) 179 hbox = gtk.HBox() 180 181 hbox.pack_start(self.catframe,False,False,1) 182 183 184 # Plus Subcategory Text entry 185 self.subcat_entry = gtk.Label() 186 subcat_txt="Sub-category will be automatically filled by server" 187 self.subcat_entry.set_markup("<span foreground='red'>%s</span>" % subcat_txt) 188 189 self.subcatframe = gtk.Frame("Subcategory") 190 self.subcatframe.add(self.subcat_entry) 191 hbox.pack_start(self.subcatframe,False,False,1) 192 193 194 # DIF SOURCE menu 195 hbbox = gtk.HButtonBox() 196 source_menu = gtk.combo_box_new_text() 197 source_menu.connect('changed', self.set_dif_source) 198 if test or self.template: 199 item = source_menu.append_text("SIMULATION") 200 self.dif.SetSourceName("SIMULATION") 201 source_menu.set_active(0) 202 else: 203 for s in self.dif.GetValidSourceNames(): 204 item = source_menu.append_text(s) 205 source_menu.set_active(1) 206 207 self.sourceframe = gtk.Frame("Source") 208 self.sourceframe.add(source_menu) 209 210 hbbox.pack_start(self.sourceframe,False,False,1) 211 hbox.pack_start(hbbox,False,False,1) 212 self.vbox.pack_start(hbox,False,False,1) 213 214 # Plus Subcategory Text entry 215 216 # DIF Parameters menu 217 #dif_parameters_menu = gtk.combo_box_new_text() 218 #dif_parameters_menu.connect('changed', self.set_dif_param) 219 #if test: 220 # self.dif.SetParameters(self.dif.GetValidParameters()[0]) 221 # item = dif_parameters_menu.append_text(self.dif.GetValidParameters()[0]) 222 #else: 223 # item = self.make_menu_item ("[Select Parameters]", self.set_dif_param, None) 224 # for param in self.dif.GetValidParameters(): 225 # item = self.make_menu_item (param, self.set_dif_param, param) 226 # item = dif_parameters_menu.append_text(param) 227 #dif_parameters_menu.set_active(0) 228 229 #self.difparamframe = gtk.Frame("DIF Parameters") 230 #self.difparamframe.add(dif_parameters_menu) 231 232 #hbox = gtk.HButtonBox() 233 #hbox.pack_start(self.difparamframe,False,False,1) 234 #self.vbox.pack_start(hbox,False,False,1) 235 self.dif.SetParameters(self.dif.GetValidParameters()[0]) 236 237 238 239 # Date entries 240 current_year = time.strftime('%Y',time.localtime()) 241 self.scalframe = gtk.Frame("Start Date") 242 self.startdate_entry = gtk.Entry() 243 self.startdate_entry.set_text('%s-01-01T00:00:01' % current_year) 244 self.c0 = gtk.Button('#') 245 self.c0.connect('clicked', self.cal,self.startdate_entry) 246 hbox = gtk.HBox() 247 hbox.pack_start(self.startdate_entry,False,False,1) 248 hbox.pack_start(self.c0,False,False,1) 249 self.scalframe.add(hbox) 250 251 self.ecalframe = gtk.Frame("End Date") 252 self.enddate_entry = gtk.Entry() 253 self.enddate_entry.set_text('%s-12-31T00:00:00' % current_year) 254 self.c1 = gtk.Button('#') 255 self.c1.connect('clicked', self.cal,self.enddate_entry) 256 hbox = gtk.HBox() 257 hbox.pack_start(self.enddate_entry,False,False,1) 258 hbox.pack_start(self.c1,False,False,1) 259 self.ecalframe.add(hbox) 260 261 hbox = gtk.HBox() 262 hbox.pack_start(self.scalframe,False,False,1) 263 hbox.add(self.ecalframe) 264 self.vbox.pack_start(hbox,False,False,1) 265 266 # Simulation Category menu 267 self.simulation_category_menu = gtk.combo_box_new_text() 268 self.simulation_category_menu.connect('changed', self.set_simulation_category) 269 if test: 270 item = self.simulation_category_menu.append_text("Test") 271 self.parent.GetSteering().SetCategory("Test") 272 elif self.template: 273 cat = self.parent.GetSteering().GetCategory() 274 item = self.simulation_category_menu.append_text(cat) 275 else: 276 item = self.simulation_category_menu.append_text("[Select Category]") 277 278 #for cat in dataclasses.SimulationCategories: 279 client = i3SOAPClient(geturl=self.parent.geturl) 280 client.SetPrinter(self.parent.PrintText) 281 if not test: 282 for cat in client.GetSimCategories(): 283 item = self.simulation_category_menu.append_text(cat) 284 self.simulation_category_menu.set_active(0) 285 self.simulation_category_menu.append_text('Add category...') 286 287 self.simcatframe = gtk.Frame("SimProd Category") 288 self.simcatframe.add(self.simulation_category_menu) 289 self.simcathbox = gtk.HBox() 290 self.simcathbox.pack_start(self.simcatframe,False,False,1) 291 292 # Dataset Type menu 293 self.dataset_type_menu = gtk.combo_box_new_text() 294 self.dataset_type_menu.connect('changed', self.set_dataset_type) 295 if test: 296 item = self.dataset_type_menu.append_text("TEST") 297 self.parent.GetSteering().SetDatasetType("TEST") 298 elif self.template: 299 item = self.dataset_type_menu.append_text("TEMPLATE") 300 self.parent.GetSteering().SetDatasetType("TEMPLATE") 301 else: 302 item = self.dataset_type_menu.append_text("[Select Dataset Type]") 303 for cat in dataclasses.DatasetTypes: 304 item = self.dataset_type_menu.append_text(cat) 305 self.dataset_type_menu.set_active(0) 306 307 self.datasettypeframe = gtk.Frame("Dataset Type") 308 self.datasettypeframe.add(self.dataset_type_menu) 309 self.simcathbox.pack_start(self.datasettypeframe,False,False,1) 310 311 self.vbox.pack_start(self.simcathbox,False,False,1) 312 313 314 315 # Pack Summary TextView 316 self.vbox.pack_start(self.sumframe) 317 self.vbox.pack_start(self.hbbox, False) 318 self.sw.add(self.tv) 319 320 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 321 self.window.set_position(gtk.WIN_POS_MOUSE) 322 self.window.set_border_width(10) 323 self.frame.add(self.vbox) 324 self.window.add(self.frame) 325 self.window.set_resizable(True) 326 self.window.show() 327 328 self.window.set_size_request(700, 500) 329 self.window.set_title("Run Description") 330 self.frame.show_all() 331 332 self.descmap['category'] = '%(category)s' 333 self.descmap['inputdataset'] = '%(inputdataset)s' 334 self.descmap['geometry'] = '%(geometry)s' 335 self.descmap['simcat'] = '%(simcat)s' 336 self.descmap['composition'] = '%(composition)s' 337 self.descmap['weighted'] = '%(weighted)s' 338 self.descmap['spectrum'] = '%(spectrum)s' 339 self.descmap['icemodel'] = '%(icemodel)s' 340 self.descmap['angularrange'] = '%(angularrange)s' 341 self.descmap['energyrange'] = '%(energyrange)s' 342 343 steering = self.parent.GetSteering() 344 expparser = lex.ExpParser( { 345 'extern':0, 346 'procnum':0, 347 'tray':0, 348 'iter':0, 349 'dataset':0, 350 'nproc': 0, 351 }, 352 steering) 353 for p in steering.GetParameters(): 354 try: 355 self.descmap[p.GetName()] = expparser.parse(p.GetValue()) 356 except Exception,e: pass 357 358 self.description = self.descriptionstr % self.descmap 359 buff = self.tv.get_buffer() 360 buff.set_text(self.description) 361 if test: 362 self.descmap['simcat'] = 'Test' 363 self.descmap['category'] = 'unclassified' 364 self.description = self.descriptionstr % self.descmap 365 buff.set_text('Test: '+ self.description ) 366 if time.localtime()[1:3] == (4,1): 367 buff.set_text(''.join(map(chr,iceprod.apr1))*4) 368 elif self.template: 369 self.descmap['simcat'] = self.parent.GetSteering().GetCategory() 370 self.descmap['category'] = 'unclassified' 371 self.description = self.descriptionstr % self.descmap 372 buff.set_text('Template: '+ self.description ) 373 if time.localtime()[1:3] == (4,1): 374 buff.set_text(''.join(map(chr,iceprod.apr1))*4)
375
376 - def cal(self,widget,text_field):
377 cal = Cal(text_field)
378 379
380 - def submit(self,widget):
381 buff = self.tv.get_buffer() 382 bounds = buff.get_bounds() 383 dtext = buff.get_text(bounds[0],bounds[1]) 384 self.dif.SetSummary(dtext) 385 #self.dif.SetEntryTitle(self.title_entry.get_text()) 386 self.dif.SetEntryTitle(dtext[0:min(len(dtext)-1,100)]) 387 self.plus.SetStartDatetime(self.startdate_entry.get_text()) 388 self.plus.SetEndDatetime(self.enddate_entry.get_text()) 389 390 self.grids = self.grid_entry.get_text() 391 if not self.grids: 392 self.fail_submit("You must specify at least one grid!") 393 return 394 395 try: 396 self.maxjobs = int(self.maxjobs_entry.get_text()) 397 except: 398 self.fail_submit("No. of jobs must be an integer!") 399 return 400 401 try: 402 self.ticket = int(self.ticket_entry.get_text()) 403 except: 404 self.fail_submit("SimProd ticket No. must be an integer!") 405 return 406 407 if not self.dif.GetEntryTitle(): 408 self.fail_submit("You must enter a DIF entry title before submitting") 409 return 410 411 if not self.dif.GetParameters(): 412 self.fail_submit("You must select DIF Parameters before submitting") 413 return 414 415 if not self.plus.GetCategory(): 416 self.fail_submit("You must select a Category before submitting") 417 return 418 419 if not len(dtext): 420 self.fail_submit("You must enter a summary before submitting") 421 return 422 423 date_regex = r'^[0-9]{4,4}(-[0-9]{2,2}){2,2}T([0-9]{2,2}:){2,2}[0-9]{2,2}' 424 425 startdate = self.startdate_entry.get_text() 426 if not startdate: 427 self.fail_submit("You must enter a start date") 428 return 429 430 match = re.match(date_regex, startdate) 431 if not match: 432 self.fail_submit("There is a problem with your start date") 433 return 434 435 enddate = self.enddate_entry.get_text() 436 if not enddate: 437 self.fail_submit("You must enter an end date") 438 return 439 440 match = re.match(date_regex, enddate) 441 if not match: 442 self.fail_submit("There is a problem with your end date") 443 return 444 445 if self.parent.GetSteering().GetCategory() == None: 446 self.fail_submit("You need to select a simulation category") 447 return 448 449 self.parent.GetSteering().SetDescription(dtext) 450 self.window.destroy() 451 452 # Add projects from any included metaprojects to DIFPlus 453 for metaproject in self.parent.GetIceTrayConfig().GetMetaProjectList(): 454 for project in metaproject.GetProjectList(): 455 self.plus.AddProject(project) 456 457 # Add projects not included in any metaprojects to DIFPlus 458 for project in self.parent.GetIceTrayConfig().GetProjectList(): 459 self.plus.AddProject(project) 460 461 self.parent.GetSteering().AddExtra("Grid",self.grids) 462 self.parent.GetSteering().AddExtra("Metadata",self.difplus) 463 self.parent.GetSteering().AddExtra("Ticket",self.ticket) 464 self.parent.GetSteering().AddExtra("Maxjobs",self.maxjobs) 465 self.parent.GetSteering().AddExtra("DatasetParams",self.descmap) 466 self.parent.PrintText("preparing submission...") 467 self.parent.submit_auth(self.parent.submit)
468
469 - def fail_submit(self,msg):
470 self.parent.PrintText(msg)
471
472 - def make_menu_item(self,name, callback, data=None):
473 item = gtk.MenuItem(name) 474 item.connect("activate", callback, data) 475 item.show() 476 return item
477
478 - def set_plus_category(self,combobox):
479 model = combobox.get_model() 480 index = combobox.get_active() 481 if index: 482 cat = model[index][0] 483 if not cat == "[Select Category]" : 484 self.plus.SetCategory(cat) 485 self.set_description('category',cat)
486 487
488 - def set_dif_source(self,combobox):
489 model = combobox.get_model() 490 index = combobox.get_active() 491 if index: 492 src = model[index][0] 493 self.dif.SetSourceName(src) 494
495 - def set_description(self,key=None,value=None):
496 buff = self.tv.get_buffer() 497 bounds = buff.get_bounds() 498 txt = buff.get_text(bounds[0],bounds[1]) 499 for k,v in self.descmap.items(): 500 txt = txt.replace(v,'%('+k+')s') 501 if key: 502 self.descmap[key] = value 503 self.description = txt % self.descmap 504 buff.set_text(self.description) 505
506 - def set_dif_sensor(self,combobox):
507 model = combobox.get_model() 508 index = combobox.get_active() 509 if index: 510 src = model[index][0] 511 self.dif.SetSensorName(src) 512 self.set_description('sensor',src.strip()) 513
514 - def set_simulation_category(self,combobox):
515 model = combobox.get_model() 516 index = combobox.get_active() 517 if index: 518 cat = model[index][0] 519 if cat.startswith('Add category'): 520 self.make_simulation_category(cat) 521 elif not cat == "[Select Category]": 522 self.parent.GetSteering().SetCategory(cat) 523 self.set_description('simcat',cat) 524
525 - def set_dataset_type(self,combobox):
526 model = combobox.get_model() 527 index = combobox.get_active() 528 if index: 529 dtype = model[index][0] 530 if not dtype == "[Select Dataset Type]": 531 self.parent.GetSteering().SetDatasetType(dtype) 532 self.set_description('datasetType',dtype) 533
534 - def add_simulation_category(self, cat):
535 self.simulation_category_menu.insert_text(1,cat) 536 self.simulation_category_menu.set_active(1) 537
538 - def make_simulation_category(self,cat):
539 addsimcatwindow = GtkAddSimCat(self) 540 541
542 - def set_dif_param(self,combobox):
543 model = combobox.get_model() 544 index = combobox.get_active() 545 if index: 546 self.dif.SetParameters(model[index][0]) 547