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

Source Code for Module iceprod.client.gtk.GtkProjectEditor

  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  from iceprod.core.dataclasses import * 
 13  import pygtk 
 14  pygtk.require('2.0') 
 15  import gtk, gobject 
 16  import logging 
 17  from GtkIPModule import * 
 18   
 19  logger = logging.getLogger('GtkProjectEditor') 
 20  NotConnectedException = 'Not connected' 
 21   
 22   
23 -class GtkProjectEditor(GtkIPModule):
24
25 - def get_iconfig(self):
26 return self.icetray
27
28 - def __init__(self,icetray,db):
29 # create a liststore with three int columns 30 gtk.VBox.__init__(self) 31 self.icetray= icetray 32 self.mdict = {} 33 self.pdict = {} 34 self.db = db 35 36 self.textbuffer = None 37 self.tree_store = gtk.TreeStore( int,str,str,gobject.TYPE_BOOLEAN ) 38 self.metaproject_dict = { } 39 40 if not db.cached and not db.connect(): 41 raise NotConnectedException, 'Could not connect to database' 42 self.rownum = 0 43 self.rows = {} 44 for mrow in db.GetMetaProjects(): 45 mid = mrow.GetId() 46 mpname = mrow.GetName() 47 mver = mrow.GetVersion() 48 mselected = False 49 50 metaproj = self.get_iconfig().GetMetaProject(mpname) 51 if metaproj and metaproj.GetVersion() == mrow.GetVersion(): 52 mselected = not mselected 53 54 metadict = [ mid, mpname, mver, mselected ] 55 56 projdict = {} 57 for prow in db.GetProjects(mid): 58 pid = prow.GetId() 59 pname = prow.GetName() 60 ver = prow.GetVersion() 61 selected = False 62 63 if mselected: 64 proj = self.get_iconfig().GetProject(pname) 65 if proj and proj.GetVersion() == prow.GetVersion(): 66 selected = not selected 67 self.pdict[proj.GetName()] = selected 68 69 projdict[pid]=[pid,pname,ver[0],ver[1],ver[2],selected] 70 self.rows[mid] = { 71 'metaproject':metadict,'projects':projdict 72 } 73 if not db.cached: db.disconnect(); 74 75 self.sw = gtk.ScrolledWindow() 76 77 # Set sort column 78 self.tv = gtk.TreeView(self.tree_store) 79 self.pack_start(self.sw) 80 self.sw.add(self.tv) 81 self.tv.column = [None]*7 82 self.tv.column[0] = gtk.TreeViewColumn('DbID') 83 self.tv.column[1] = gtk.TreeViewColumn('Meta-Project') 84 self.tv.column[2] = gtk.TreeViewColumn('version') 85 self.tv.column[3] = gtk.TreeViewColumn('Selected') 86 self.tv.cell = [None]*7 87 88 self.selection = self.tv.get_selection() 89 self.selection.connect('changed', self.on_selection_changed) 90 91 for i in range(3): 92 self.tv.cell[i] = gtk.CellRendererText() 93 self.tv.append_column(self.tv.column[i]) 94 self.tv.column[i].set_sort_column_id(i) 95 self.tv.column[i].pack_start(self.tv.cell[i], True) 96 self.tv.column[i].set_attributes(self.tv.cell[i], text=i) 97 98 self.tv.cell[3] = gtk.CellRendererToggle() 99 self.tv.cell[3].set_property('activatable', True) 100 self.tv.cell[3].connect( 'toggled', self.row_toggled) 101 self.tv.append_column(self.tv.column[3]) 102 self.tv.column[3].pack_start(self.tv.cell[3], True) 103 self.tv.column[3].add_attribute( self.tv.cell[3], "active", 3) 104 105 self.show_all() 106 107 108 for m in self.rows.keys(): 109 metaproject = self.rows[m]['metaproject'] 110 projects = self.rows[m]['projects'] 111 parent = self.tree_store.append( None, metaproject )
112
113 - def set_text_buffer(self,textbuffer):
114 self.textbuffer = textbuffer
115
116 - def write_text_buffer(self,text):
117 if self.textbuffer: 118 self.textbuffer.set_text(text) 119 else: 120 print text 121
122 - def on_selection_changed(self,selection):
123 model, iter = selection.get_selected() 124 id = model.get_value(iter, 0) 125 name = model.get_value(iter, 1) 126 version = model.get_value(iter, 2) 127 logger.info("selected(%d): %s.%s" % (id,name,version)) 128
129 - def adddependencies(self, project, mp):
130 """ 131 Recursively add project and its dependencies to metaproject 132 """ 133 for dep in self.db.GetProjectDependencies(project.GetId(),mp.GetId()): 134 if not mp.HasProject(project.GetName()): 135 mp.AddProject(project.GetName(),project) 136 project.AddDependency(dep) 137 self.adddependencies(dep,mp)
138 139
140 - def getmetaproject(self, model, path):
141 """ 142 Add selected metaproject to configuration. Import modules and their 143 parameters. 144 """ 145 # Create a new metaproject and set version 146 newmp = MetaProject() 147 newmp.SetId( model[path][0] ) 148 newmp.SetName( model[path][1] ) 149 newmp.SetVersion(model[path][2]) 150 151 # Create a temporary configuration 152 new_config = IceTrayConfig() 153 new_config.AddMetaProject(newmp.GetName(),newmp) 154 155 # Get all configured modules in previous configuration 156 for oldmod in self.get_iconfig().GetModules(): 157 for project in self.db.GetProjectsMM(oldmod,newmp): 158 newmp.AddProject(project.GetName(),project) 159 self.adddependencies(project, newmp) 160 161 # Get all configured services in previous configuration 162 for oldserv in self.get_iconfig().GetServices(): 163 for project in self.db.GetProjectsMM(oldserv,newmp): 164 newmp.AddProject(project.GetName(),project) 165 self.adddependencies(project, newmp) 166 167 # Get missing projects and dependencies 168 if self.get_iconfig().HasMetaProject(newmp.GetName()): 169 oldmp = self.get_iconfig().GetMetaProject(newmp.GetName()) 170 for p in self.db.GetProjects(newmp.GetId()): 171 if oldmp.HasProject(p.GetName()) and not newmp.HasProject(p.GetName()): 172 newmp.AddProject(p.GetName(),p) 173 174 # Loop over modules in old configuration and fetch their projects 175 for oldmod in self.get_iconfig().GetModules(): 176 if not new_config.HasModule(oldmod.GetName()): 177 depend = self.db.GetProjectsMM(oldmod,newmp) 178 if not depend: 179 oldmod.SetDescription( 'class %s not found in metaproject %s %s' %( 180 oldmod.GetClass(), 181 newmp.GetName(), 182 newmp.GetVersion())) 183 else: 184 oldmod.AddProject(depend[0].GetName(),depend[0]) 185 new_config.AddModule(oldmod) 186 187 # Loop over services in old configuration and fetch their projects 188 for oldserv in self.get_iconfig().GetServices(): 189 if not new_config.HasService(oldserv.GetName()): 190 depend = self.db.GetProjectsMM(oldserv,newmp) 191 if not depend: 192 oldserv.SetDescription('class %s not found for project %s %s' %( 193 oldserv.GetClass(), 194 newmp.GetName(), 195 newmp.GetVersion())) 196 else: 197 oldserv.AddProject(depend[0].GetName(),depend[0]) 198 new_config.AddService(oldserv) 199 200 # Overwrite metaproject 201 self.get_iconfig().AddMetaProject(newmp.GetName(),newmp) 202 203 # Overwrite modules 204 for newmod in new_config.GetModules(): 205 self.get_iconfig().AddModule(newmod) 206 207 # Overwrite services 208 for newserv in new_config.GetServices(): 209 self.get_iconfig().AddService(newserv) 210 211 self.mdict[newmp.GetId()] = newmp 212 return newmp
213 214
215 - def do_change(self, model, path, iter,connect=True):
216 if not self.db.cached and \ 217 not self.db.connect(): 218 return 219 220 if model[path][3]: 221 self.getmetaproject(model,path) 222 self.madd[ model[path][1] ] = True 223 224 else: 225 self.mdelete[ model[path][1] ] = True 226 return
227
228 - def commit_changes(self, widget, data=None):
229 self.madd = {} 230 self.mdelete = {} 231 model = self.tree_store 232 model.foreach(self.do_change) 233 234 # delete any metaproject that is not being added or overwritten 235 for mp in self.mdelete.keys(): 236 if not self.madd.has_key(mp): 237 self.get_iconfig().RemoveMetaProject(mp) 238 return
239
240 - def toggle_group(self,model, iter,bval):
241 """ 242 Toggle parent (metaproject) and children (individual projects) 243 """ 244 while iter: 245 cpath = model.get_path(iter) 246 project = model[cpath][1] 247 model[cpath][3] = bval 248 if self.pdict.has_key(project): 249 self.pdict[project] = bval 250 iter = model.iter_next(iter)
251
252 - def row_toggled( self,cell, path):
253 """ 254 Sets the toggled state on the toggle button to true or false. 255 """ 256 model = self.tree_store 257 iter = model.get_iter(path) 258 value_to_set = not model[path][3] 259 self.toggle_group(model,model.get_iter_first(),False) 260 if model.iter_has_child(iter): # This is a meta project 261 # check all projects in this metaproject 262 chiter = model.iter_children(iter) 263 self.toggle_group(model,chiter,value_to_set) 264 model[path][3] = value_to_set 265 self.pdict[model[path][1]] = value_to_set
266