Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | Related Pages

userAppBrowser.py

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()

Generated on Fri Jul 21 13:26:34 2006 for LATTE R04-12-00 by doxygen 1.4.3