00001 __version__ = "$Revision: 2.10 $" 00002 00003 import os 00004 import sys 00005 import imp 00006 import fnmatch 00007 import logging 00008 import traceback 00009 from types import ModuleType 00010 00011 from qt import QScrollView, QVBox, QApplication, QString, SIGNAL, SLOT, QObject 00012 00013 from userAppBrowserGui import userAppBrowserGui 00014 from userAppTree import userAppTree 00015 00016 class userModule(object): 00017 Param = ('.py', 'r', imp.PY_SOURCE) 00018 SysModules = sys.modules.keys() 00019 00020 def __init__(self, root, packagename, groupname, appname): 00021 self.module = None 00022 self.__deps = [] 00023 self.__root = root 00024 self.__packagename = packagename 00025 self.__groupname = groupname 00026 self.__appname = appname 00027 self.__import() 00028 00029 def __import(self): 00030 root = self.__root 00031 packagename = self.__packagename 00032 groupname = self.__groupname 00033 appname = self.__appname 00034 appfile = os.path.join(root, packagename, groupname, appname+'.py') 00035 fp = file(appfile, 'r') 00036 try: 00037 previous = sys.modules.keys() 00038 module = imp.load_module(appname, fp, appfile, userModule.Param) 00039 fp.close() 00040 s = dir(module) 00041 if 'userModuleName' in s and 'userGui' in s: 00042 self.module = module 00043 self.__deps = [] 00044 if 'userApplication' in s: 00045 for (dep, module) in sys.modules.items(): 00046 if (dep not in previous) and type(module) == ModuleType: 00047 dep_path = dep.split('.') 00048 if len(dep_path) == 4: 00049 if dep_path[0] == packagename and dep_path[1] == groupname: 00050 self.__deps.append(dep) 00051 else: 00052 self.module = None 00053 del module 00054 except Exception, msg: 00055 fp.close() 00056 traceback.print_exc() 00057 00058 def reload(self): 00059 del self.module 00060 for dep in self.__deps: 00061 if dep in sys.modules: 00062 del sys.modules[dep] 00063 self.__import() 00064 00065 00066 def import_initfile(root, packagename, groupname): 00067 initfile = os.path.join(root, packagename, groupname, '__init__.py') 00068 fp = file(initfile, 'r') 00069 modname = packagename+groupname+'__init' 00070 userapps = [] 00071 try: 00072 module = imp.load_module(modname, fp, initfile, userModule.Param) 00073 fp.close() 00074 if 'UserApps' in dir(module): 00075 for app in module.UserApps: 00076 userapps.append(app) 00077 del module 00078 except Exception, msg: 00079 fp.close() 00080 traceback.print_exc() 00081 return userapps 00082 00083 class userAppBrowser(userAppBrowserGui): 00084 Debug = 0 00085 Info = 1 00086 Warn = 2 00087 Error = 3 00088 Fatal = 4 00089 00090 LevelNames = { 00091 Debug: 'DEBUG', 00092 Info: 'INFO', 00093 Warn: 'WARN', 00094 Error: 'ERROR', 00095 Fatal: 'FATAL' 00096 } 00097 00098 Color = {Debug : 'green', 00099 Info : 'black', 00100 Warn : 'blue', 00101 Error : 'red', 00102 Fatal : 'red' 00103 } 00104 00105 MaxLines = 500 00106 SaveLines = 250 00107 00108 def __init__(self, rc, appdir): 00109 userAppBrowserGui.__init__(self) 00110 self.setCaption("User Applications Browser") 00111 self.__rc = rc 00112 self.__appdir = appdir 00113 self.guis = {} 00114 self.guisOrder = [] 00115 self.__tab_frames = [] 00116 for (verlevel, vername) in userAppBrowser.LevelNames.items(): 00117 self.VerbosityBox.insertItem(QString(vername), verlevel) 00118 self.VerbosityBox.setCurrentItem(1) 00119 self.__playButtons = [self.ResetButton, 00120 self.StopButton, 00121 self.PauseButton, 00122 self.RunButton] 00123 self.__setPlayButtons(enabled=False) 00124 self.__tree = userAppTree(self.userAppTreeGui) 00125 self.__loaddir() 00126 self.__logtext = [] 00127 self.userAppTextBrowser.setTextFormat(QObject.LogText) 00128 00129 def __setPlayButtons(self, enabled): 00130 for button in self.__playButtons: 00131 button.setEnabled(enabled) 00132 00133 def verbosity(self): 00134 return userAppBrowser.LevelNames[self.VerbosityBox.currentItem()] 00135 00136 def updateSchema(self): 00137 self.__tree.loadNodes(self.__rc.common().getLAT()) 00138 for usergui in self.guis.values(): 00139 usergui.updateSchema() 00140 00141 def updateSuites(self): 00142 for usergui in self.guis.values(): 00143 if 'updateSuite' in dir(usergui): 00144 usergui.updateSuite() 00145 00146 def getGui(self, appname): 00147 return self.guis[appname] 00148 00149 def getTree(self): 00150 return self.__tree 00151 00152 def loaded(self, appgui): 00153 if not self.RunButton.isEnabled(): 00154 self.__setPlayButtons(enabled=True) 00155 for usergui in self.guis.values(): 00156 if usergui == appgui: 00157 self.userAppLabel.setText(appgui.usrmodule.module.userModuleName) 00158 usergui.loaded() 00159 else: 00160 usergui.unloaded() 00161 00162 def __loadApps(self, root, packagename, groupname): 00163 usrmodules = [] 00164 appnames = import_initfile(root, packagename, groupname) 00165 for appname in appnames: 00166 usrmodule = userModule(root, packagename, groupname, appname) 00167 if usrmodule.module is not None: 00168 usrmodules.append(usrmodule) 00169 logging.debug('userAppBrowser: loading %s.%s' %(groupname, appname)) 00170 else: 00171 logging.debug('userAppBrowser: skipping %s.%s'%(groupname, appname)) 00172 return usrmodules 00173 00174 def __loaddir(self): 00175 (root, packagename) = os.path.split(self.__appdir) 00176 if packagename == '': (root, packagename) = os.path.split(root) 00177 sys.path.insert(0, root) 00178 groupnames = import_initfile(root, packagename, '') 00179 self.guisOrder = [] 00180 for groupname in groupnames: 00181 usrmodules = self.__loadApps(root, packagename, groupname) 00182 if len(usrmodules): 00183 self.guisOrder.append([groupname, []]) 00184 newtab = QScrollView(self.userAppTabs) 00185 frame = QVBox(newtab.viewport()) 00186 newtab.addChild(frame) 00187 self.userAppTabs.addTab(newtab, groupname) 00188 self.__tab_frames.append(newtab) 00189 for usrmodule in usrmodules: 00190 module = usrmodule.module 00191 usergui = module.userGui(frame, self.__rc, usrmodule) 00192 self.guis[module.userModuleName] = usergui 00193 self.guisOrder[-1][1].append(module.userModuleName) 00194 00195 sys.path.remove(root) 00196 00197 def ResetClicked(self): 00198 self.__rc.ResetClicked() 00199 00200 def StopClicked(self): 00201 self.__rc.StopClicked() 00202 00203 def PauseClicked(self): 00204 self.__rc.PauseClicked() 00205 00206 def RunClicked(self): 00207 self.__rc.RunClicked() 00208 00209 def purge(self): 00210 self.__rc.execGUImethod(self.__purge) 00211 00212 def __purge(self): 00213 lines = len(self.__logtext) 00214 if lines > userAppBrowser.MaxLines: 00215 self.__logtext = self.__logtext[lines-userAppBrowser.SaveLines:] 00216 self.userAppTextBrowser.clear() 00217 for line in self.__logtext: 00218 self.userAppTextBrowser.append(line) 00219 00220 def append(self, message, level): 00221 self.__rc.execGUImethodNR(self.__append, message, level) 00222 00223 def __append(self, message, level): 00224 color = userAppBrowser.Color[level] 00225 message = '<font color=%s>%s</font>'%(color, message) 00226 self.__logtext.append(message) 00227 self.userAppTextBrowser.append(message) 00228 00229 00230 if __name__ == '__main__': 00231 from LATTE.client.gOptions import Options 00232 00233 class panelsTest(object): 00234 def __init__(self, browser): 00235 self.__browser = browser 00236 00237 def getUserApp(self): 00238 return self.__browser 00239 00240 class rcTest(object): 00241 def __init__(self): 00242 self.__panels = {} 00243 self.__prefs = {'logdir': '/tmp'} 00244 00245 def addPanel(self, name, browser): 00246 panel = panelsTest(browser) 00247 self.__panels[name] = panel 00248 00249 def panels(self): 00250 return self.__panels 00251 00252 def preferences(self): 00253 return self.__prefs 00254 00255 options = Options(['appdir']) 00256 try: 00257 options.parse() 00258 except Exception, msg: 00259 options.usage() 00260 raise Exception, msg 00261 00262 app = QApplication(sys.argv) 00263 app.connect(app, SIGNAL("lastWindowClosed()"),app, SLOT("quit()")) 00264 rc = rcTest() 00265 win = userAppBrowser(rc, appdir=options.appdir) 00266 rc.addPanel('Global', win) 00267 win.updateSuites() 00268 win.show() 00269 app.exec_loop()