def initForm(self, cmdForm=None): cmdForm.descr.entryByName['WS_address']['widget'].selectitem(0) # if not os.path.exists(self.rc_ad): # open(self.rc_ad,'w') # else: # file = open(self.rc_ad) # text = file.read() # text = text.split() # for line in text: # tmp_line = line.split('User:'******'UserName_Entry']['wcfg']\ # ['textvariable'].set(tmp_line[1]) # tmp_line = line.split('Password:'******'Password_Entry']['wcfg']\ # ['textvariable'].set(tmp_line[1]) # file.close() # def openurl(event): # webbrowser.open('https://nbcr.net:8443/worksphere/start?cid=apply') # cmdForm.descr.entryByName['New_User']['widget'].bind(sequence="<Button-1>", # func=openurl) if hasattr(self.vf, 'dpo') and self.vf.dpo.dpf_filename: self.dpf.set(self.vf.dpo.dpf_filename) cmdForm.descr.entryByName['Run_autodock']['widget'].configure( state='normal') else: if not self.dpf.get(): cmdForm.descr.entryByName['Run_autodock']['widget'].configure( state='disabled') if hasattr(self.vf, 'gpo') and self.vf.gpo.gpf_filename: self.gpf.set(self.vf.gpo.gpf_filename) cmdForm.descr.entryByName['Run_autogrid']['widget'].configure( state='normal') #cmdForm.descr.entryByName['ag_before']['widget'].configure(state='normal') else: if not self.gpf.get(): cmdForm.descr.entryByName['Run_autogrid']['widget'].configure( state='disabled') self.progressBar = ProgressBar( cmdForm.descr.entryByName['WS_ProgressBar']['widget'], labelside=None, width=200, height=20, mode='percent') self.progressBar.setLabelText('Progress...') self.progressBar.set(0) cmdForm.descr.entryByName['WS_ProgressBar']['widget'].grid_forget()
def initForm(self, cmdForm=None): cmdForm.descr.entryByName['WS_address']['widget'].selectitem(0) # if not os.path.exists(self.rc_ad): # open(self.rc_ad,'w') # else: # file = open(self.rc_ad) # text = file.read() # text = text.split() # for line in text: # tmp_line = line.split('User:'******'UserName_Entry']['wcfg']\ # ['textvariable'].set(tmp_line[1]) # tmp_line = line.split('Password:'******'Password_Entry']['wcfg']\ # ['textvariable'].set(tmp_line[1]) # file.close() # def openurl(event): # webbrowser.open('https://nbcr.net:8443/worksphere/start?cid=apply') # cmdForm.descr.entryByName['New_User']['widget'].bind(sequence="<Button-1>", # func=openurl) if hasattr(self.vf,'dpo') and self.vf.dpo.dpf_filename: self.dpf.set(self.vf.dpo.dpf_filename) cmdForm.descr.entryByName['Run_autodock']['widget'].configure(state='normal') else: if not self.dpf.get(): cmdForm.descr.entryByName['Run_autodock']['widget'].configure(state='disabled') if hasattr(self.vf,'gpo') and self.vf.gpo.gpf_filename: self.gpf.set(self.vf.gpo.gpf_filename) cmdForm.descr.entryByName['Run_autogrid']['widget'].configure(state='normal') #cmdForm.descr.entryByName['ag_before']['widget'].configure(state='normal') else: if not self.gpf.get(): cmdForm.descr.entryByName['Run_autogrid']['widget'].configure(state='disabled') self.progressBar = ProgressBar( cmdForm.descr.entryByName['WS_ProgressBar']['widget'], labelside=None, width=200, height=20, mode='percent') self.progressBar.setLabelText('Progress...') self.progressBar.set(0) cmdForm.descr.entryByName['WS_ProgressBar']['widget'].grid_forget()
def __init__(self, master=None,color='white',gui=True): self.automaticSearch = False self.plateform = sys.platform self.rootDirectory="/" self.sharedDirectory="" self.userDirectory="" self.progDirectory="" self.SetDirectory() self.bgcolor=color import Pmv.hostappInterface as epmv self.currDir=epmv.__path__[0] os.chdir(self.currDir) os.chdir('../../../') self.mgltoolsDir=os.path.abspath(os.curdir) self.softdir=["","","",""] self.MODES = ["Blender","Cinema4D","Cinema4DR12","Maya"] self.extensions = ["modeller","pyrosetta","hollow"] self.extdir=["","",""] self.cb = [self.getBlenderDir,self.getC4dDir,self.getC4dr12Dir,self.getMayaDir] self.funcInstall=[self.installBlender,self.installC4d,self.installC4dr12,self.installMaya] self.v = [] self.dir = [] self.log = "" self.msg = None self.chooseDir=None self.gui=gui self.curent =0 self.choosenDir = None self.master = master if self.gui: self.choosenDir = StringVar() master.configure(bg=self.bgcolor) self.frame = Frame(master,bg=self.bgcolor) self.frame.pack() self.imageFile = self.mgltoolsDir+'/MGLToolsPckgs/Pmv/hostappInterface/images/banner.jpg' self.bannerImage = Image.open(self.imageFile) self.bannerTk = ImageTk.PhotoImage(self.bannerImage) self.label_banner = Label(self.frame, image=self.bannerTk,bg=self.bgcolor) self.label_banner.place(x=0,y=0,width=self.bannerImage.size[0],height=self.bannerImage.size[1]) self.label_banner.pack(side=TOP) for i,text in enumerate(self.MODES): frame = Frame(master,bg=self.bgcolor) frame.pack() self.v.append(IntVar()) self.dir.append(StringVar()) b = Checkbutton(frame, text=text, variable=self.v[i],bg=self.bgcolor,command=self.cb[i]) b.pack(side=LEFT,fill=X,anchor=E)#,anchor=W w = Label(frame,textvariable=self.dir[i],bg=self.bgcolor) self.dir[i].set(text+"_dir") w.pack(side=LEFT,fill=X,anchor=E)#,anchor=E # # for i,text in enumerate(self.MODES): # self.v.append(IntVar()) # self.dir.append(StringVar()) # b = Checkbutton(self.frame, text=text, # variable=self.v[i],bg=self.bgcolor,command=self.cb[i]) # b.pack(side=BOTTOM,anchor=W) # # for i,text in enumerate(self.MODES): # w = Label(self.frame,textvariable=self.dir[i],bg=self.bgcolor) # self.dir[i].set(text+"_dir") # w.pack(side=TOP,anchor=E) # i=i+1 # frame2 = Frame(master,bg=self.bgcolor) frame2.pack() self.buttonSEARCH = Button(frame2, text="SEARCH_DIR", fg="red", command=self.findDirectories,bg=self.bgcolor) self.buttonSEARCH.pack(side=LEFT) self.buttonDIR = Button(frame2, text="SET_DIR", fg="red", command=self.setDirectory,bg=self.bgcolor) self.buttonDIR.pack(side=LEFT) self.buttonOK = Button(frame2, text="INSTALL", fg="red", command=self.install,bg=self.bgcolor) self.buttonOK.pack(side=LEFT) self.buttonQuit = Button(frame2, text="QUIT", fg="red", command=self.quit,bg=self.bgcolor) self.buttonQuit.pack(side=LEFT) frame3 = Frame(master,bg=self.bgcolor) frame3.pack() self.progressbar = ProgressBar(master=frame3, labelside='left') self.progressbar.configure(height=20, width=200, init=1, mode='percent', labeltext='') self.pbval = 0 self.msg = StringVar() self.message=Label(frame3,textvariable=self.msg,bg=self.bgcolor,wraplength=350) self.message.pack(side=BOTTOM,fill=BOTH, expand=1) self.msg.set(self.currDir+"\n"+self.mgltoolsDir+'\n')
class Installer: def __init__(self, master=None,color='white',gui=True): self.automaticSearch = False self.plateform = sys.platform self.rootDirectory="/" self.sharedDirectory="" self.userDirectory="" self.progDirectory="" self.SetDirectory() self.bgcolor=color import Pmv.hostappInterface as epmv self.currDir=epmv.__path__[0] os.chdir(self.currDir) os.chdir('../../../') self.mgltoolsDir=os.path.abspath(os.curdir) self.softdir=["","","",""] self.MODES = ["Blender","Cinema4D","Cinema4DR12","Maya"] self.extensions = ["modeller","pyrosetta","hollow"] self.extdir=["","",""] self.cb = [self.getBlenderDir,self.getC4dDir,self.getC4dr12Dir,self.getMayaDir] self.funcInstall=[self.installBlender,self.installC4d,self.installC4dr12,self.installMaya] self.v = [] self.dir = [] self.log = "" self.msg = None self.chooseDir=None self.gui=gui self.curent =0 self.choosenDir = None self.master = master if self.gui: self.choosenDir = StringVar() master.configure(bg=self.bgcolor) self.frame = Frame(master,bg=self.bgcolor) self.frame.pack() self.imageFile = self.mgltoolsDir+'/MGLToolsPckgs/Pmv/hostappInterface/images/banner.jpg' self.bannerImage = Image.open(self.imageFile) self.bannerTk = ImageTk.PhotoImage(self.bannerImage) self.label_banner = Label(self.frame, image=self.bannerTk,bg=self.bgcolor) self.label_banner.place(x=0,y=0,width=self.bannerImage.size[0],height=self.bannerImage.size[1]) self.label_banner.pack(side=TOP) for i,text in enumerate(self.MODES): frame = Frame(master,bg=self.bgcolor) frame.pack() self.v.append(IntVar()) self.dir.append(StringVar()) b = Checkbutton(frame, text=text, variable=self.v[i],bg=self.bgcolor,command=self.cb[i]) b.pack(side=LEFT,fill=X,anchor=E)#,anchor=W w = Label(frame,textvariable=self.dir[i],bg=self.bgcolor) self.dir[i].set(text+"_dir") w.pack(side=LEFT,fill=X,anchor=E)#,anchor=E # # for i,text in enumerate(self.MODES): # self.v.append(IntVar()) # self.dir.append(StringVar()) # b = Checkbutton(self.frame, text=text, # variable=self.v[i],bg=self.bgcolor,command=self.cb[i]) # b.pack(side=BOTTOM,anchor=W) # # for i,text in enumerate(self.MODES): # w = Label(self.frame,textvariable=self.dir[i],bg=self.bgcolor) # self.dir[i].set(text+"_dir") # w.pack(side=TOP,anchor=E) # i=i+1 # frame2 = Frame(master,bg=self.bgcolor) frame2.pack() self.buttonSEARCH = Button(frame2, text="SEARCH_DIR", fg="red", command=self.findDirectories,bg=self.bgcolor) self.buttonSEARCH.pack(side=LEFT) self.buttonDIR = Button(frame2, text="SET_DIR", fg="red", command=self.setDirectory,bg=self.bgcolor) self.buttonDIR.pack(side=LEFT) self.buttonOK = Button(frame2, text="INSTALL", fg="red", command=self.install,bg=self.bgcolor) self.buttonOK.pack(side=LEFT) self.buttonQuit = Button(frame2, text="QUIT", fg="red", command=self.quit,bg=self.bgcolor) self.buttonQuit.pack(side=LEFT) frame3 = Frame(master,bg=self.bgcolor) frame3.pack() self.progressbar = ProgressBar(master=frame3, labelside='left') self.progressbar.configure(height=20, width=200, init=1, mode='percent', labeltext='') self.pbval = 0 self.msg = StringVar() self.message=Label(frame3,textvariable=self.msg,bg=self.bgcolor,wraplength=350) self.message.pack(side=BOTTOM,fill=BOTH, expand=1) self.msg.set(self.currDir+"\n"+self.mgltoolsDir+'\n') # self.createDirChooser() def linuxwhich(self,program): #this function is also in mglutil.util.packageFilePath.py import os def is_exe(fpath): return os.path.exists(fpath) and os.access(fpath, os.X_OK) fpath, fname = os.path.split(program) if fpath: if is_exe(program): return program else: for path in os.environ["PATH"].split(os.pathsep): exe_file = os.path.join(path, program) if is_exe(exe_file): return exe_file return None def SetDirectory(self): #according OS will set all the basic directory: #user/progam/root #in Win XP/2k/2k3 it is C:\Documents and Settings\%username%\ #in Vista, it is C:\Users\%username%\ #%HOMEPATH%.+ self.userDirectory=os.getenv("HOME") if self.plateform == 'darwin': COPY="cp -r" self.progDirectory="/Applications/" #Mac self.preferencesDir=self.userDirectory+"/Library/Preferences/" self.sharedDirectory="/Users/Shared/" elif self.plateform == 'linux': COPY="cp -r" self.progDirectory=os.environ["PATH"].split(os.pathsep) self.preferencesDir=self.userDirectory self.sharedDirectory="/home/" elif self.plateform == 'win32': COPY="xcopy" self.userDirectory="C:"+os.getenv("HOMEPATH") self.progDirectory="C:"+os.sep+"Program Files"+os.sep self.preferencesDir=os.getenv("APPDATA") def say_hi(self): print "hi there, everyone!" def quit(self): self.frame.quit() def install(self): f=open(self.mgltoolsDir+os.sep+'MGLToolsPckgs'+os.sep+'Pmv'+os.sep+'hostappInterface'+os.sep+'epmv_dir.txt','a') for i,v in enumerate(self.v): val=v.get() if val : print "install epmv plug for ",self.MODES[i] self.log+="\ninstall epmv plug for "+self.MODES[i] self.msg.set(self.log) self.funcInstall[i]() #store directory f.write(self.MODES[i]+":"+self.softdir[i]+"\n") f.close() self.makeExtensionfile() self.log+="\nSUCCESS YOU CAN QUIT !" print self.log self.msg.set(self.log) def DirCallback(self,widget, event=None): values = widget.get() print values def quitDir(self): dir = self.choosenDir.get() print "quitDir",dir if self.plateform == "darwin": dir = dir.replace(" ","\ ") self.dir[self.curent].set(dir) self.softdir[self.curent] = dir self.chooseDir.destroy() def setChoosenDir(self): dir = self.choosenDir.get() self.dir[self.curent].set(dir) # print dir def chooseDirectory(self,soft,listeDir): #need a new windows ? self.curent = soft if self.chooseDir is None : self.chooseDir=Frame(self.master) # self.createDirChooser() else : self.chooseDir.destroy() self.chooseDir=Frame(self.master) self.chooseDir.pack() # frame = Frame(self.chooseDir) # frame.pack() # mb3 = MultiRadiobuttons(self.chooseDir,valueList=listeDir, # callback=self.DirCallback) # self.choosenDir.set("") # initialize for i in range(len(listeDir)): # self.choosenDir.set(listeDir[i]) b = Radiobutton(self.chooseDir, text=listeDir[i], variable=self.choosenDir, value=listeDir[i], command=self.setChoosenDir) b.pack(anchor=W) buttonQuit = Button(self.chooseDir, text="OK", command=self.quitDir) buttonQuit.pack(anchor=W) # else : def findDirectories(self): self.automaticSearch = True for i,v in enumerate(self.v): val=v.get() if val : if self.MODES[i] == 'Blender': self.getBlenderDir() elif self.MODES[i] == 'Cinema4D': self.getC4dDir() elif self.MODES[i] == 'Cinema4DR12': self.getC4dr12Dir() elif self.MODES[i] == 'Maya': self.getMayaDir() self.automaticSearch = False def setDirectory(self): for i,v in enumerate(self.v): val=v.get() if val : x = askdirectory(initialdir="", title="where is "+self.MODES[i]+" plugin/script directory") if sys.platform != 'win32': x = x.replace(" ","\ ") print x self.softdir[i] = x self.dir[i].set(x) def listDir(self,dir,sp="*"): return glob.glob(dir+os.sep+sp) def findDirectoryFrom(self,dirname,where,sp="*"): dirs=[] tocheck = self.listDir(where,sp=sp) for dir in tocheck: print dir,dirname if dir.find(dirname) != -1: dirs.append(dir) return dirs def findDirectory(self,dirname,where,pbval=0): result=None if where == None: return result #print "try finding "+dirname+" directory in "+where self.pbval +=pbval if self.pbval > 100 : self.pbval = 0 self.progressbar.set(self.pbval) #print where if dirname in os.listdir(where): print "founded" self.progressbar.set(100) result=os.path.join(where,dirname) else : k=0 #print where tocheck = self.listDir(where) if len(tocheck) > 100: return None for dir in tocheck: self.progressbar.set( (k/len(self.listDir(where)))*100 ) if os.path.isdir(dir): result = self.findDirectory(dirname,dir,k) if result != None: k=k+1 break k=k+1 return result def getDirFromFile(self): #we get the soft dir from a file in Pmv/hostappinterface/epmv_dir.txt f=open(self.currDir+os.sep+'epmv_dir.txt','r') lines=f.readlines() f.close() #now parse it ie format : soft/extension dir for line in lines : elem = line.split(":") for i,soft in enumerate(self.MODES): if elem[0].lower() == self.MODES[i].lower(): self.softdir[i]=elem[1].strip() def getBlenderDir(self): if self.plateform.find("linux") != -1: dir=self.findDirectoryFrom(".blender",self.userDirectory+"/",sp=".*") if len(dir) == 0 : x = askdirectory(initialdir=self.userDirectory, title="where is blender script directory, ie .blender/script") dir = x#self.softdir[2] else : dir = dir[0] dir = dir.replace(" ","\ ") self.dir[0].set(dir) self.softdir[0] = dir elif self.plateform == 'darwin': dir=self.findDirectoryFrom("blender",self.progDirectory+"/") if len(dir) == 0 : x = askdirectory(initialdir=self.userDirectory, title="where is blender script directory, ie .blender/script") dir = x#self.softdir[2] self.dir[0].set(dir) self.softdir[0] = dir elif len(dir) == 1 : dir = dir[0] dir = dir.replace(" ","\ ") self.dir[0].set(dir) self.softdir[0] = dir else : self.chooseDirectory(0,dir) elif self.plateform == 'win32': #blender can be in Prgoram files or Application Data #dir=self.findDirectoryFrom("Blender Foundation",self.progDirectory) #if len(dir) == 0 : dir=self.findDirectoryFrom("Blender Foundation",self.preferencesDir) if len(dir) == 0 : x = askdirectory(initialdir=self.userDirectory, title="where is the Blender Foundation directory") dir = x self.dir[0].set(dir) self.softdir[0] = dir elif len(dir) == 1 : dir = dir[0] # dir = dir+os.sep+"Blender"+os.sep+".blender"+os.sep self.dir[0].set(dir) self.softdir[0] = dir else : self.chooseDirectory(0,dir) if self.automaticSearch : t1=time.time() self.progressbar.setLabelText('searching '+".blender") #is blender define in path dir=packageFilePath.which('blender') if dir == None : dir=self.findDirectory(".blender",self.progDirectory) if dir is None : dir=self.findDirectory(".blender",self.userDirectory) if dir is None : #dir=self.findDirectory(".blender",self.rootDirectory) #if dir is None: dir="not Found" return print "time to find", time.time()-t1 print dir dir = dir.replace(" ","\ ") self.dir[0].set(dir) self.softdir[0] = dir def getC4dDir(self): dir = None if self.plateform == "darwin": dir=self.findDirectoryFrom("CINEMA 4D R11.5",self.progDirectory+"/MAXON/") if len(dir) == 0 : x = askdirectory(initialdir=self.progDirectory, title="where is CINEMA4D 4D R11.5 plugin directory") dir = x self.dir[1].set(dir) self.softdir[1] = dir elif len(dir) == 1 : dir = dir.replace(" ","\ ") self.dir[1].set(dir) self.softdir[1] = dir else : self.chooseDirectory(1,dir) # dir = dir[0] if self.automaticSearch : t1=time.time() self.progressbar.setLabelText('searching '+"Py4D") dir=self.findDirectory("Py4D",self.progDirectory) #if dir is None : # dir=self.findDirectory("Py4D",self.progDirectory) if dir is None: dir="not Found" return print "time to find", time.time()-t1 dir = dir.replace(" ","\ ") self.dir[1].set(dir) self.softdir[1] = dir def getC4dr12Dir(self): dir = None if self.plateform == "darwin": dir=self.findDirectoryFrom("CINEMA 4D R12",self.preferencesDir+"/MAXON/") if len(dir) == 0 : x = askdirectory(initialdir=self.preferencesDir, title="where is CINEMA4D 4D R12 user preferences directory") dir = x self.dir[2].set(dir) self.softdir[2] = dir elif len(dir) == 1 : dir = dir[0] dir = dir.replace(" ","\ ") self.dir[2].set(dir) self.softdir[2] = dir else : self.chooseDirectory(2,dir) elif self.plateform == "win32": dir=self.findDirectoryFrom("CINEMA 4D R12",self.preferencesDir+os.sep+"MAXON"+os.sep) if len(dir) == 0 : x = askdirectory(initialdir=self.preferencesDir, title="where is CINEMA4D 4D R12 user preferences directory") dir = x self.dir[2].set(dir) self.softdir[2] = dir elif len(dir) == 1 : dir = dir[0] # dir = dir + "/plugins/Py4D/" self.dir[2].set(dir) self.softdir[2] = dir else : self.chooseDirectory(2,dir) if self.automaticSearch and dir is None : t1=time.time() self.progressbar.setLabelText('searching '+"C4D R12") dir=self.findDirectory("CINEMA 4D R12",self.progDirectory) #if dir is None : # dir=self.findDirectory("Py4D",self.progDirectory) if dir is None: dir="not Found" return print "time to find", time.time()-t1 dir = dir.replace(" ","\ ") self.dir[2].set(dir) self.softdir[2] = dir def getMayaDir(self): if self.plateform == "darwin": dir=self.sharedDirectory+"/Autodesk/maya/2011/plug-ins/" if not os.path.exists(dir): x = askdirectory(initialdir=self.progDirectory, title="where is MAYA2011 plugin directory") dir = x self.dir[3].set(dir) self.softdir[3] = dir elif self.plateform == "win32": dir=self.findDirectoryFrom("Maya2011",self.progDirectory+os.sep+"Autodesk"+os.sep) if len(dir) ==0 : x = askdirectory(initialdir=self.progDirectory, title="where is MAYA2011 bin/plugins directory") dir = x self.dir[3].set(dir) self.softdir[3] = dir elif len(dir) == 1 : dir = dir[0] dir = dir +os.sep+"bin"+os.sep+"plug-ins" self.dir[3].set(dir) self.softdir[3] = dir else : self.chooseDirectory(3,dir) elif self.automaticSearch and dir is None: dir=self.findDirectory("maya2011",self.rootDirectory) dir = dir.replace(" ","\ ") self.dir[3].set(dir) self.softdir[3] = dir def installBlender(self): if self.plateform =="darwin": self.softdir[0] =self.softdir[0]+"/blender.app/Contents/MacOS/.blender/" elif self.plateform =="win32": self.softdir[0] =self.softdir[0]+os.sep+"Blender"+os.sep+".blender" self.log+="\ninstall blender-epmv plug in "+self.softdir[0] self.msg.set(self.log) #copy the directory of plugin to the blender script directory selected # by the user #change the head of the plugin-files indir = self.currDir+os.sep+"blender"+os.sep+"plugin"+os.sep outdir = self.softdir[0]+os.sep+"scripts"+os.sep files=[] files.append("blenderPmvScriptGUI.py") files.append("blenderPmvClientGUI.py") files.append("epmv_blender_update.py") for f in files : shutil.copy (indir+f, outdir+f) self.changeHeaderFile(outdir+f) #no need to patch linux and mac as there is blender python2.5 #What about windows, already patch MGL but do we need to patch blender? def installC4d(self,update=False): self.log+="\ninstall c4d-epmv plug in "+self.softdir[1]+os.sep+"plugins/Py4D" self.msg.set(self.log) dir = self.softdir[1] if self.plateform == "darwin": dir = dir.replace("\ "," ") py4ddir=dir+os.sep+"plugins/Py4D" #copy the directory of plugin to c4d/plugins/Py4D/plugins/. #Py4D should be already patched if not update: if not os.path.exists(py4ddir): patchpath = dir self.progressbar.setLabelText("getting Py4D") URI="http://mgldev.scripps.edu/projects/ePMV/py4d.tar" #or Tku.tar tmpFileName = dir+"/py4d.tar" geturl(URI, tmpFileName,pb=self.progressbar) TF=tarfile.TarFile(tmpFileName) TF.extractall(patchpath) dirname1=self.currDir+os.sep+"cinema4d"+os.sep+"plugin" dirname2=py4ddir+os.sep+"plugins"+os.sep+"epmv" if os.path.exists(dirname2): shutil.rmtree(dirname2,True) shutil.copytree (dirname1, dirname2) #copy the color per vertex c++ plugin filename1=py4ddir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"epmv_c4d_plugin.py" filename2=py4ddir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"epmv.pyp" shutil.copy (filename1, filename2) filename1=py4ddir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"epmv_update.py" filename2=py4ddir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"epmv_synchro.pyp" shutil.copy (filename1, filename2) filename1=self.currDir+os.sep+"cinema4d"+os.sep+"VertexColor.dylib" filename2=dir+os.sep+"plugins/VertexColor.dylib" shutil.copy (filename1, filename2) else : cmd="cp "+self.currDir+os.sep+"cinema4d"+os.sep+"plugin"+os.sep+"*.py "+self.softdir[1]+os.sep+"plugins"+os.sep+"epmv"+os.sep+"." print cmd os.system(cmd) #update the header changing the MGLTOOLS value files=[] files.append(py4ddir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"epmv_c4d_plugin.py") files.append(py4ddir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"epmv.pyp") for f in files : self.changeHeaderFile(f) def patchC4DR12(self,patchpath): dir = self.softdir[2] patch=os.path.isfile(patchpath+"patched") if self.plateform == "darwin": # dir=dir.replace("\ "," ") # patchpath = dir+"/library/python/packages/osx/" if not patch : # self.progressbar.setLabelText("patching C4D python") URI="http://mgldev.scripps.edu/projects/ePMV/Tk.tar" #or Tku.tar tmpFileName = dir+"/library/python/packages/osx/Tk.tar" geturl(URI, tmpFileName) TF=tarfile.TarFile(tmpFileName) TF.extractall(patchpath) f=open(patchpath+"patched","w") f.write("C4D patched!") f.close() elif self.plateform == "win32": #then patch python framework but need the soft directory #C:Program Files / MAXON / CINEMA4D if not patch : #resource\modules\python\res name1="Python.win32.framework" name2="Python.win32.framework.original" print patchpath+name1 if not os.path.exists(patchpath+name2): os.rename(patchpath+name1,patchpath+name2) #we simply Copy the C:\\Python26 directory.... dirname1="C:\\Python26\\" dirname2=patchpath+name1 shutil.copytree (dirname1, dirname2) # URI="http://mgldev.scripps.edu/projects/ePMV/patchs/py26win.tar" # tmpFileName = patchpath+"py26win.tar" #self.progressbar.setLabelText("patching C4D python") # if not os.path.isfile(tmpFileName): # geturl(URI, tmpFileName) # TF=tarfile.TarFile(tmpFileName) # if not os.path.exists(patchpath+name2): # os.rename(patchpath+name1,patchpath+name2) # TF.extractall(patchpath) f=open(patchpath+"patched","w") f.write("C4D patched!") f.close() def installC4dr12(self,update=False): dir = self.softdir[2] if self.plateform == "darwin": dir = dir.replace("\ "," ") # print "install c4dr12-epmv plug in ",self.softdir[0] self.log+="\ninstall c4dr12-epmv plug in "+self.softdir[2] if self.gui : self.msg.set(self.log) #same should we use the user directory and check on windows #copy the directory of plugin to c4d/plugins/Py4D/plugins/. if not update: #copy the plugin directory #if self.plateform == "win32": import shutil dirname1=self.currDir+os.sep+"cinema4d_dev"+os.sep+"plugin" dirname2=dir+os.sep+"plugins"+os.sep+"epmv" if os.path.exists(dirname2): shutil.rmtree(dirname2,True) shutil.copytree (dirname1, dirname2) filename1=dir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"epmv_c4d_plugin.py" filename2=dir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"epmv.pyp" shutil.copy (filename1, filename2) filename1=dir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"epmv_update.py" filename2=dir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"epmv_synchro.pyp" shutil.copy (filename1, filename2) #patch using 32 or 64bits ? seems that both are working if self.plateform == "darwin": dir=dir.replace("\ "," ") patchpath = dir+"/library/python/packages/osx/" patch=os.path.isfile(patchpath+"patched") if not patch : self.progressbar.setLabelText("patching C4D python") URI="http://mgldev.scripps.edu/projects/ePMV/Tk.tar" #or Tku.tar tmpFileName = dir+"/library/python/packages/osx/Tk.tar" geturl(URI, tmpFileName,pb=self.progressbar) TF=tarfile.TarFile(tmpFileName) TF.extractall(patchpath) f=open(patchpath+"patched","w") f.write("C4D patched!") f.close() elif self.plateform == "win32": #then patch python framework but need the soft directory C:Program Files / MAXON / CINEMA4D print self.progDirectory+"MAXON"+os.sep prog=self.findDirectoryFrom("CINEMA 4D R12",self.progDirectory+"MAXON"+os.sep) if len(prog) ==0 : x = askdirectory(initialdir=self.progDirectory, title="where is CINEMA4D 4D R12 application directory") prog = [x,] patchpath = prog[0]+os.sep+"resource"+os.sep+"modules"+os.sep+"python"+os.sep+"res"+os.sep patch=os.path.isfile(patchpath+"patched") elif len(prog) ==1: patchpath = prog[0]+os.sep+"resource"+os.sep+"modules"+os.sep+"python"+os.sep+"res"+os.sep patch=os.path.isfile(patchpath+"patched") else : #take the first one.... patchpath = prog[0]+os.sep+"resource"+os.sep+"modules"+os.sep+"python"+os.sep+"res"+os.sep patch=os.path.isfile(patchpath+"patched") if not patch : #resource\modules\python\res name1="Python.win32.framework" name2="Python.win32.framework.original" print patchpath+name1 if not os.path.exists(patchpath+name2): os.rename(patchpath+name1,patchpath+name2) #we simply Copy the C:\\Python26 directory.... dirname1="C:\\Python26\\" dirname2=patchpath+name1 shutil.copytree (dirname1, dirname2) # URI="http://mgldev.scripps.edu/projects/ePMV/patchs/py26win.tar" # tmpFileName = patchpath+"py26win.tar" # self.progressbar.setLabelText("patching C4D python") # geturl(URI, tmpFileName,pb=self.progressbar) # TF=tarfile.TarFile(tmpFileName) # TF.extractall(patchpath) f=open(patchpath+"patched","w") f.write("C4D patched!") f.close() else : cmd=COPY+" "+self.currDir+os.sep+"cinema4d_dev"+os.sep+"plugin"+os.sep+"*.py "+dir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"." print cmd os.system(cmd) #update the header changing the MGLTOOLS value files=[] files.append(dir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"epmv_c4d_plugin.py") files.append(dir+os.sep+"plugins"+os.sep+"epmv"+os.sep+"epmv.pyp") for f in files : self.changeHeaderFile(f) def personalizeMaya(self,plugdir,prefDir): shelfMel=""" shelfButton -enableCommandRepeat 1 -enable 1 -width 35 -height 35 -manage 1 -visible 1 -preventOverride 0 -annotation "import maya\\nmaya.cmds.ePMV()\\nepmv = maya.epmvui.epmv\\nself = epmv.mv\\n" -enableBackground 0 -align "center" -label "ePMV" -labelOffset 0 -font "plainLabelFont" -imageOverlayLabel "ePMV" -overlayLabelColor 0.8 0.8 0.8 -overlayLabelBackColor 0 0 0 0.2 """ logo = plugdir+os.sep+"images"+os.sep+"pmv.tif" shelfMel+=' -image "%s"\n' % (logo.replace("\\","/")) shelfMel+=' -image1 "%s"\n' % (logo.replace("\\","/")) shelfMel+=""" -style "iconOnly" -marginWidth 1 -marginHeight 1 -command "import maya\\nmaya.cmds.ePMV()\\nepmv = maya.epmvui.epmv\\nself = epmv.mv\\n" -sourceType "python" -commandRepeatable 1 ; """ windowsPref = "windowPref -topLeftCorner 413 640 -widthHeight 960 480 ePMV;" pluginPref = 'evalDeferred("autoLoadPlugin(\"\", \"ePMV.py\", \"ePMV\")");' filename = prefDir+os.sep+"shelves"+os.sep+"shelf_Custom.mel" #test if exist if not create. if os.path.isfile(filename): f=open(filename,'r') lines = f.readlines() f.close() else : f=open(filename,'w') lines="""global proc shelf_Custom () { global string $gBuffStr; global string $gBuffStr0; global string $gBuffStr1; }""" f.write(lines) f.close() f=open(prefDir+os.sep+"shelves"+os.sep+"shelf_Custom.mel",'w') lines = lines[:-1] for line in lines: f.write(line) f.write(shelfMel) f.write("}\n") f.close() #change the plugin preferences too f=open(prefDir+os.sep+"pluginPrefs.mel",'a') f.write('evalDeferred("autoLoadPlugin(\\"\\", \\"ePMV.py\\", \\"ePMV\\")");') f.close() def installMaya(self,update=False): self.log+="\ninstall maya-epmv plug in "+self.softdir[2] self.msg.set(self.log) #what about windows #maya is in /Applications/Autodesk/maya2011/Maya.app/Contents/MacOS/plug-ins/ePMV.py #preferences are in /Users/ludo/Library/Preferences/Autodesk/maya/2011/prefs #and on windowsXP : C:\Documents and Settings\ludo\My Documents\maya\2011\prefs #and on windows7 vista : C:\Users\USERNAME\Documents\maya\2011\ shelfMel=""" shelfButton -enableCommandRepeat 1 -enable 1 -width 35 -height 35 -manage 1 -visible 1 -preventOverride 0 -annotation "import maya\\nmaya.cmds.ePMV()\\nepmv = maya.epmvui.epmv\\nself = epmv.mv\\n" -enableBackground 0 -align "center" -label "ePMV" -labelOffset 0 -font "plainLabelFont" -imageOverlayLabel "ePMV" -overlayLabelColor 0.8 0.8 0.8 -overlayLabelBackColor 0 0 0 0.2 """ logo = self.currDir+os.sep+"images"+os.sep+"pmv.tif" shelfMel+=' -image "%s"\n' % (logo.replace("\\","/")) shelfMel+=' -image1 "%s"\n' % (logo.replace("\\","/")) shelfMel+=""" -style "iconOnly" -marginWidth 1 -marginHeight 1 -command "import maya\\nmaya.cmds.ePMV()\\nepmv = maya.epmvui.epmv\\nself = epmv.mv\\n" -sourceType "python" -commandRepeatable 1 ; """ windowsPref = "windowPref -topLeftCorner 413 640 -widthHeight 960 480 ePMV;" pluginPref = 'evalDeferred("autoLoadPlugin(\"\", \"ePMV.py\", \"ePMV\")");' #1 link the plugin to plug-dir or copy? plugin is in maya.app folder #special case of /Users/shared/maya/plugin # cmd="cp "+self.currDir+"/autodeskmaya/plugin/mayaPMVui.py "+self.softdir[3]+"/ePMV.py" file1=self.currDir+os.sep+"autodeskmaya"+os.sep+"plugin"+os.sep+"mayaPMVui.py" if self.plateform == 'darwin': file2=self.sharedDirectory+"/Autodesk/maya/2011/plug-ins/ePMV.py" elif self.plateform == "win32": file2=self.softdir[3]+os.sep+"ePMV.py" print file2 else :#linux file2=self.sharedDirectory+"/Autodesk/maya/2011/plug-ins/ePMV.py" try : shutil.copy (file1, file2) except IOError, e: print "Unable to copy file. %s" % e #cmd="cp "+self.currDir+"/autodeskmaya/plugin/mayaPMVui.py "+self.sharedDirectory+"/Autodesk/maya/2011/plug-ins/ePMV.py" #print cmd #os.system(cmd) prefDir="" dirname1=self.currDir+os.sep+"images"+os.sep+"icons" if self.plateform == 'darwin': prefDir=self.preferencesDir+os.sep+"Autodesk"+os.sep+"maya"+\ os.sep+"2011"+os.sep+"prefs" elif self.plateform == 'win32': mydocdir =self.userDirectory+os.sep+"My Documents" if not os.path.exists(mydocdir): mydocdir= self.userDirectory+os.sep+"Documents" prefDir=mydocdir+os.sep+"maya"+\ os.sep+"2011"+os.sep+"prefs" else : prefDir=self.preferencesDir+os.sep+"Autodesk"+os.sep+"maya"+\ os.sep+"2011"+os.sep+"prefs" dirname2=prefDir+os.sep+"icons"+os.sep if os.path.exists(dirname2): #os.remove(dirname2) shutil.rmtree(dirname2,True) shutil.copytree (dirname1, dirname2) #cmd="cp "+self.currDir+"/images/icons/* "+\ # self.preferencesDir+"/Autodesk/maya/2011/prefs/icons/." #What about the c++ plugin? #print cmd #os.system(cmd) if not update: #2 setup the shelf, the preferences, and copy the icons filename = prefDir+os.sep+"shelves"+os.sep+"shelf_Custom.mel" #test if exist if not create. if os.path.isfile(filename): f=open(filename,'r') lines = f.readlines() f.close() else : f=open(filename,'w') lines="""global proc shelf_Custom () { global string $gBuffStr; global string $gBuffStr0; global string $gBuffStr1; }""" f.write(lines) f.close() f=open(prefDir+os.sep+"shelves"+os.sep+"shelf_Custom.mel",'w') lines = lines[:-1] for line in lines: f.write(line) f.write(shelfMel) f.write("}\n") f.close() #change the plugin preferences too f=open(prefDir+os.sep+"pluginPrefs.mel",'a') f.write('evalDeferred("autoLoadPlugin(\\"\\", \\"ePMV.py\\", \\"ePMV\\")");') f.close() #update the header changing the MGLTOOLS value files=[] # files.append(self.softdir[3]+"/ePMV.py") files.append(file2) for f in files : self.changeHeaderFile(f)
class WebServices(MVCommand): def __init__(self): MVCommand.__init__(self) rc = getResourceFolderWithVersion() + os.sep + 'ws' + os.sep if not os.path.exists(rc): os.mkdir(rc) self.proxy_gama = rc + 'proxy_gama' self.rc_ad = rc + "rc_ad" self.login = False if hasattr(self, 'vf.GUI.ROOT'): self.dpf = Tkinter.StringVar(self.vf.GUI.ROOT) self.gpf = Tkinter.StringVar(self.vf.GUI.ROOT) self.prev_dir = Tkinter.StringVar(self.vf.GUI.ROOT) self.ad_radio = Tkinter.IntVar(self.vf.GUI.ROOT) else: self.dpf = Tkinter.StringVar() self.gpf = Tkinter.StringVar() self.prev_dir = Tkinter.StringVar() self.ad_radio = Tkinter.IntVar() self.current_job = None def guiCallback(self, event=None): mainform = self.showForm('default', modal=0, blocking=1., initFunc=self.initForm) def buildFormDescr(self, formName): ifd = InputFormDescr(title = "AutoGrid/AutoDock Web Services") #Web Services Login ifd.append({'name':"LoginGroup", 'widgetType':Pmw.Group, 'container':{'LoginGroup':'w.interior()'}, 'wcfg':{'tag_text':'Web Services Location'}, 'gridcfg':{'sticky':'nswe'} }) ifd.append({'widgetType':Pmw.ComboBox, 'name':'WS_address', 'parent':'LoginGroup', 'wcfg':{'scrolledlist_items': ('http://ws.nbcr.net/opal2/services',), 'listheight':50, 'dropdown':1, 'history':1, 'autoclear':1}, 'gridcfg':{'sticky':'ew', 'row':0, 'column':0, 'columnspan':3} }) # ifd.append({'widgetType':Tkinter.Label, 'name':'New_User', # 'parent':'LoginGroup', 'wcfg':{'text':' New Users?', # 'fg':'Blue','cursor':'hand1'}, # 'gridcfg':{'sticky':'w', 'row':1, 'column':0} # }) # ifd.append({'widgetType':Tkinter.Label, 'name':'UserName_Label', # 'parent':'LoginGroup', 'wcfg':{'text':'User Name'}, # 'gridcfg':{'sticky':'e', 'row':1, 'column':1} # }) # ifd.append({'widgetType':Tkinter.Entry, 'name':'UserName_Entry', # 'parent':'LoginGroup','wcfg':{}, # 'gridcfg':{'sticky':'ew', 'row':1, 'column':2} # }) # ifd.append({'widgetType':Tkinter.Label, 'name':'Password_Label', # 'parent':'LoginGroup', 'wcfg':{'text':'Password'}, # 'gridcfg':{'sticky':'e', 'row':2, 'column':1} # }) # ifd.append({'widgetType':Tkinter.Entry, 'name':'Password_Entry', # 'parent':'LoginGroup', 'wcfg':{'show':'*'}, # 'gridcfg':{'sticky':'ew', 'row':2, 'column':2} # }) # ifd.append({'widgetType':Tkinter.Label, 'name':'Remember_Label', # 'parent':'LoginGroup', # 'wcfg':{'text':'Remember User Name and Password'}, # 'gridcfg':{'sticky':'e', 'row':3, 'column':0,'columnspan':2} # }) # self.RememberLogin_var = Tkinter.BooleanVar() # ifd.append({'widgetType':Tkinter.Checkbutton, 'name':'Remember_Checkbutton', # 'parent':'LoginGroup', 'variable':self.RememberLogin_var, # 'gridcfg':{'sticky':'w', 'row':3, 'column':2} # }) #AutoGrid group ifd.append({'name':"AutoGrid", 'widgetType':Pmw.Group, 'container':{'AutoGrid':'w.interior()'}, 'wcfg':{'tag_text':'AutoGrid'}, 'gridcfg':{'sticky':'nswe'} }) ifd.append({'widgetType':Tkinter.Button, 'name':'Run_autogrid', 'parent':'AutoGrid', 'wcfg':{'text':'Run AutoGrid ', 'command':self.startAutogrid}, 'gridcfg':{'sticky':'w', 'row':0, 'column':0} }) ifd.append( {'name': 'gpf_entry', 'parent':'AutoGrid', 'widgetType':Tkinter.Entry, 'wcfg':{'width':30,'textvariable':self.gpf}, 'gridcfg':{'sticky':'w','row':0,'column':1} }) ifd.append({'name': 'browse_gpf', 'widgetType': Tkinter.Button, 'parent':'AutoGrid', 'text':'Browse', 'command':self.browse_gpf, 'gridcfg':{'sticky':'w','row':0, 'column':2} }) #AutoDock group ifd.append({'name':"AutoDock", 'widgetType':Pmw.Group, 'container':{'AutoDock':'w.interior()'}, 'wcfg':{'tag_text':'AutoDock'}, 'gridcfg':{'sticky':'nswe'} }) ifd.append({'widgetType':Tkinter.Button, 'name':'Run_autodock', 'parent':'AutoDock', 'wcfg':{'text':'Run AutoDock', 'command':self.startAutodock}, 'gridcfg':{'sticky':'w', 'row':0, 'column':0} }) ifd.append( {'name': 'dpf_entry', 'parent':'AutoDock', 'widgetType':Tkinter.Entry, 'wcfg':{'width':30,'textvariable':self.dpf}, 'gridcfg':{'sticky':'w','row':0,'column':1} }) ifd.append({'name': 'browse_dpf', 'widgetType': Tkinter.Button, 'parent':'AutoDock', 'text':'Browse', 'command':self.browse_dpf, 'gridcfg':{'sticky':'w','row':0, 'column':2} }) ifd.append({'name': 'ag_local', 'widgetType': Tkinter.Radiobutton, 'parent':'AutoDock', 'text':'Use local grids', 'tooltip':"This option sends locally stored grid files with Web Services request", 'wcfg':{'variable':self.ad_radio,'value':0}, 'gridcfg':{'sticky':'w','row':1, 'column':0,'columnspan':2} }) # ifd.append({'name': 'ag_before', 'widgetType': Tkinter.Radiobutton, # 'parent':'AutoDock', 'text':'Run AutoGrid first', # 'tooltip':"This option runs AutoGrid Web Services and uses resulting map files for AutoDock", # 'wcfg':{'variable':self.ad_radio,'value':1,'state':'disabled'}, # 'gridcfg':{'sticky':'w','row':2, 'column':0,'columnspan':2} # }) ifd.append({'name': 'use_remote', 'widgetType': Tkinter.Radiobutton, 'parent':'AutoDock', 'text':'Use grids from server directory', 'tooltip':"This option copies map files from previous AutoGrid run", 'wcfg':{'variable':self.ad_radio,'value':2,}, 'gridcfg':{'sticky':'w','row':3, 'column':0,'columnspan':2} }) ifd.append( {'name': 'remote_dir', 'parent':'AutoDock', 'widgetType':Tkinter.Entry, 'wcfg':{'width':23,'textvariable':self.prev_dir}, 'gridcfg':{'sticky':'e','row':3,'column':1,'columnspan':2} }) #Status ifd.append({'name':"StatusGroup", 'widgetType':Pmw.Group, 'container':{'StatusGroup':'w.interior()'}, 'wcfg':{'tag_text':'Web Services Status'}, 'gridcfg':{'sticky':'nswe'} }) ifd.append({'widgetType':Tkinter.Label, 'name':'status0', 'parent':'StatusGroup', 'wcfg':{'text':' ',}, 'gridcfg':{'sticky':'w', 'row':0, 'column':0} }) ifd.append({'widgetType':Tkinter.Label, 'name':'status1', 'parent':'StatusGroup', 'wcfg':{'text':' ',}, 'gridcfg':{'sticky':'w', 'row':1, 'column':0} }) ifd.append({'name':'WS_ProgressBar', 'widgetType':Tkinter.Frame, 'parent':'StatusGroup', 'wcfg':{'height':30}, 'gridcfg':{'sticky':'ew', 'row':2,'column':0} }) ifd.append({'widgetType':Tkinter.Label, 'name':'down_label', 'parent':'StatusGroup', 'wcfg':{'text':' ',}, 'gridcfg':{'sticky':'w', 'row':3, 'column':0} }) return ifd def browse_gpf(self): filename = askopenfilename(filetypes=[('Grid Parameter File','*.gpf')],\ title="Please Select Grid Parameter File", parent=self.cmdForms['default'].root) if filename: self.gpf.set(filename) self.cmdForms['default'].descr.entryByName['Run_autogrid']['widget'].configure(state='normal') #self.cmdForms['default'].descr.entryByName['ag_before']['widget'].configure(state='normal') def browse_dpf(self): filename = askopenfilename(filetypes=[('Dock Parameter File','*.dpf')],\ title="Please Select Dock Parameter File", parent=self.cmdForms['default'].root) if filename: self.dpf.set(filename) self.cmdForms['default'].descr.entryByName['Run_autodock']['widget'].configure(state='normal') def initForm(self, cmdForm=None): cmdForm.descr.entryByName['WS_address']['widget'].selectitem(0) # if not os.path.exists(self.rc_ad): # open(self.rc_ad,'w') # else: # file = open(self.rc_ad) # text = file.read() # text = text.split() # for line in text: # tmp_line = line.split('User:'******'UserName_Entry']['wcfg']\ # ['textvariable'].set(tmp_line[1]) # tmp_line = line.split('Password:'******'Password_Entry']['wcfg']\ # ['textvariable'].set(tmp_line[1]) # file.close() # def openurl(event): # webbrowser.open('https://nbcr.net:8443/worksphere/start?cid=apply') # cmdForm.descr.entryByName['New_User']['widget'].bind(sequence="<Button-1>", # func=openurl) if hasattr(self.vf,'dpo') and self.vf.dpo.dpf_filename: self.dpf.set(self.vf.dpo.dpf_filename) cmdForm.descr.entryByName['Run_autodock']['widget'].configure(state='normal') else: if not self.dpf.get(): cmdForm.descr.entryByName['Run_autodock']['widget'].configure(state='disabled') if hasattr(self.vf,'gpo') and self.vf.gpo.gpf_filename: self.gpf.set(self.vf.gpo.gpf_filename) cmdForm.descr.entryByName['Run_autogrid']['widget'].configure(state='normal') #cmdForm.descr.entryByName['ag_before']['widget'].configure(state='normal') else: if not self.gpf.get(): cmdForm.descr.entryByName['Run_autogrid']['widget'].configure(state='disabled') self.progressBar = ProgressBar( cmdForm.descr.entryByName['WS_ProgressBar']['widget'], labelside=None, width=200, height=20, mode='percent') self.progressBar.setLabelText('Progress...') self.progressBar.set(0) cmdForm.descr.entryByName['WS_ProgressBar']['widget'].grid_forget() def startAutogrid(self): self.cmdForms['default'].descr.entryByName['Run_autogrid']['widget']\ .configure(state='disabled') gpf_file = self.gpf.get() if not os.path.exists(gpf_file): self.cmdForms['default'].descr.entryByName['status0']['widget'].\ configure(text = 'ERROR: gpf file ' + gpf_file + ' does not exist!') return self.host = self.cmdForms['default'].descr.entryByName['WS_address']['widget'].get() # if not self.login : # self.cmdForms['default'].descr.entryByName['status0']['widget'].\ # configure(text='Connecting to '+ self.host + ". Please wait...") # self.vf.GUI.ROOT.update() # f = self.validate_login() # if f == "Failed": # return self.appLocator = AppServiceLocator() self.req = launchJobRequest() input_file = os.path.basename(gpf_file) options = '-p ' + input_file + ' -l ' + os.path.splitext(input_file)[0] + '.glg' self.req._argList = options #input_gpf = ns0.InputFileType_Def('inputFile') #input_gpf._name = input_file gpfFile = open(gpf_file, 'r') gpfFileString = gpfFile.read() gpfFile.close() #input_gpf._contents = gpfFileString gpfFileString = gpfFileString.split('\n') for line in gpfFileString: if line[0:9] == 'receptor ': pdbqs = line.split()[1] #input_pdbqs = ns0.InputFileType_Def('inputFile') #input_pdbqs._name = pdbqs pdbqs = os.path.join(os.path.split(gpf_file)[0],pdbqs) #pdbqsFile = open(pdbqs, 'r') #pdbqsFileString = pdbqsFile.read() #pdbqsFile.close() #input_pdbqs._contents = pdbqsFileString inputFiles = [] #inputFiles.append(input_gpf) #inputFiles.append(input_pdbqs) inputFiles.append(self.uploadFile(gpf_file)) inputFiles.append(self.uploadFile(pdbqs)) self.req._inputFile = inputFiles self.appServicePort = self.appLocator.getAppServicePort( self.host+'/AutogridOpalService') resp = self.appServicePort.launchJob(self.req) self.JobID = resp._jobID self.cmdForms['default'].descr.entryByName['status0']['widget'].\ configure(text = 'Running Autogrid Job ID: ' + self.JobID) self.vf.GUI.ROOT.update() self.vf.GUI.ROOT.after(5, self.checkStatus) self.cmdForms['default'].descr.entryByName['Run_autogrid']['widget'].configure(state='normal') self.prev_dir.set(self.JobID) self.cmdForms['default'].descr.entryByName['use_remote']['widget'].configure(state='normal') def startAutodock(self): self.cmdForms['default'].descr.entryByName['Run_autodock']['widget']\ .configure(state='disabled') dpf_file = self.dpf.get() if not os.path.exists(dpf_file): self.cmdForms['default'].descr.entryByName['status0']['widget'].\ configure(text = 'ERROR: dpf file ' + fpf_file + ' does not exist!') return self.host = self.cmdForms['default'].descr.entryByName['WS_address']['widget'].get() # if not self.login : # self.cmdForms['default'].descr.entryByName['status0']['widget'].\ # configure(text='Connecting to '+ self.host + ". Please wait...") # self.vf.GUI.ROOT.update() # f = self.validate_login() # if f == "Failed": # return self.appLocator = AppServiceLocator() self.req = launchJobRequest() input_file = os.path.basename(dpf_file) options = '-p ' + input_file + ' -l ' + os.path.splitext(input_file)[0] + '.dlg' self.req._argList = options #input_dpf = ns0.InputFileType_Def('inputFile') #input_dpf._name = input_file dpfFile = open(dpf_file, 'r') dpfFileString = dpfFile.read() dpfFile.close() #input_dpf._contents = dpfFileString #DPF file inputFiles = [] inputFiles.append(self.uploadFile(dpf_file)) run_option = self.ad_radio.get() if run_option == 0: # sends locally stored grid files inputs = re.findall("\w*.\w*\.map ",dpfFileString) inputs.extend(re.findall("\w*\.maps.fld",dpfFileString)) inputs.extend(re.findall("\w*.pdbq[t]*",dpfFileString)) for input in inputs: input = input.strip() #ws_input = ns0.InputFileType_Def('inputFile') #ws_input._name = input input_full_name = os.path.join(os.path.split(dpf_file)[0],input) #inputFile = open(input_full_name, 'r') #inputFileString = inputFile.read() #inputFile.close() #ws_input._contents = inputFileString inputFiles.append(self.uploadFile(input_full_name)) elif run_option == 2: # runs AutoGrid first prev_dir = self.prev_dir.get() inputs = re.findall("\w*.\w*\.map ",dpfFileString) inputs.extend(re.findall("\w*\.maps.fld",dpfFileString)) host = 'http://'+self.host.split('/')[2] for input in inputs: self.req._argList += " " +host+"/"+prev_dir+"/"+input pdbq_input = re.findall("\w*.pdbq[t]*",dpfFileString) pdbq_input = pdbq_input[0].strip() #ws_input = ns0.InputFileType_Def('inputFile') #ws_input._name = pdbq_input input_full_name = os.path.join(os.path.split(dpf_file)[0],pdbq_input) #inputFile = open(input_full_name, 'r') #inputFileString = inputFile.read() #inputFile.close() #ws_input._contents = inputFileString inputFiles.append(self.uploadFile(input_full_name)) self.req._inputFile = inputFiles self.vf.GUI.ROOT.update() self.appServicePort = self.appLocator.getAppServicePort( self.host+'/AutodockOpalService',) resp = self.appServicePort.launchJob(self.req) self.JobID = resp._jobID self.cmdForms['default'].descr.entryByName['status0']['widget'].\ configure(text = 'Running Autodock Job ID: ' + self.JobID) self.vf.GUI.ROOT.update() self.vf.GUI.ROOT.after(5, self.checkStatus) self.cmdForms['default'].descr.entryByName['Run_autodock']['widget'].configure(state='normal') def uploadFile(self, path): """ this function given a string containing a path creates a InputFileType to be used with jobLaunch """ inputFile = ns0.InputFileType_Def('inputFile') inputFile._name = os.path.basename(path) if self.isOpal2(): #use attachment this is opal2 server inputFile._attachment = open(path, "r") else: #it's not a opal2 server don't user attachment infile = open(path, "r") inputFile._contents = infile.read() infile.close() return inputFile def isOpal2(self): """return True if we are using Opal2""" print "self.host is: " + self.host if self.host.find("/opal2/") != -1: return True else: return False def checkStatus(self): resp = self.appServicePort.queryStatus(queryStatusRequest(self.JobID)) if resp._code == 8: # 8 = GramJob.STATUS_DONE descr = self.cmdForms['default'].descr descr.entryByName['status0']['widget'].configure(text=resp._message) webbrowser.open(resp._baseURL) descr.entryByName['status1']['widget'].configure(text=resp._baseURL, fg='Blue',cursor='hand1') def openurl(event): webbrowser.open(resp._baseURL) descr.entryByName['status1']['widget'].bind(sequence="<Button-1>", func=openurl) self.resp = self.appServicePort.getOutputs(getOutputsRequest(self.JobID)) descr.entryByName['WS_ProgressBar']['widget'].grid(sticky='ew', row=2, column=0) self.opener = urllib.FancyURLopener(cert_file=self.proxy_gama, key_file=self.proxy_gama) self.download_finished = False self.new_download = True self.file_counter = -1 inputs = [x for x in self.resp._outputFile if x._name[-3:] !='dlg'] if len(inputs) != len(self.resp._outputFile): for input in inputs: self.resp._outputFile.remove(input) self.download() return else: self.cmdForms['default'].descr.entryByName['status0']['widget'].\ configure(text = "Status: " + resp._message) self.cmdForms['default'].descr.entryByName['status1']['widget'].\ configure(text = "") self.vf.GUI.ROOT.after(5000, self.checkStatus) def download(self): if self.new_download: self.file_counter += 1 if self.file_counter > self.resp._outputFile.__len__() - 1 : self.cmdForms['default'].descr.entryByName['WS_ProgressBar']\ ['widget'].grid_forget() self.cmdForms['default'].descr.entryByName['down_label']\ ['widget'].configure(text = "") self.cmdForms['default'].descr.entryByName['Run_autogrid']\ ['widget'].configure(state='normal') return self.progressBar.configure(progressformat='percent', labeltext='Progress ... ', max =100) self.progressBar.set(0) remote_file = self.resp._outputFile[self.file_counter] self.cmdForms['default'].descr.entryByName['down_label']['widget'].\ configure(text = "Downloading " + remote_file._name + " " + str(self.file_counter+1) +" of " + str(self.resp._outputFile.__len__())) self._url = self.opener.open(remote_file._url) try: self._out = open(remote_file._name,"w") except IOError: showerror("Download Failed!", "Permission denied: " +os.path.join(os.getcwd(),remote_file._name), parent = self.cmdForms['default'].root) return bytes = int(self._url.headers.dict['content-length']) self._progress_counter = 0 self._download_bytes = bytes/100 if self._download_bytes == 0: self._download_bytes = 1 self.new_download = False self.vf.GUI.ROOT.after(1, self.download) return else: self._progress_counter += 1 if self._progress_counter > 100: self._progress_counter = 100 self.progressBar.set(self._progress_counter) tmp = self._url.read(self._download_bytes) if tmp: self._out.write(tmp) else: self._url.close() self._out.close() self.new_download = True self.vf.GUI.ROOT.after(50, self.download) def validate_login(self): self.login = False from mglutil.web.services.SecuritymyproxyloginImplService_services import \ loginUserMyProxyRequestWrapper, \ SecuritymyproxyloginImplServiceLocator gamaLoginLocator = SecuritymyproxyloginImplServiceLocator() gamaLoginService = gamaLoginLocator.getSecuritymyproxyloginImpl( ssl=1,transport=httplib.HTTPSConnection) req = loginUserMyProxyRequestWrapper() username = self.cmdForms['default'].descr.\ entryByName['UserName_Entry']['widget'].get() passwd = self.cmdForms['default'].descr.\ entryByName['Password_Entry']['widget'].get() if not username or not passwd: showerror("Username or Password is missing", "Login failed. Please type your User Name and Password,\ or click on New User?", parent = self.cmdForms['default'].root) return "Failed" req._username = username req._passwd = passwd resp = gamaLoginService.loginUserMyProxy(req) f = open(self.proxy_gama, "w") f.write(resp._loginUserMyProxyReturn) f.close() if self.RememberLogin_var.get(): file = open(self.rc_ad,'w') user = self.cmdForms['default'].descr.entryByName\ ['UserName_Entry']['widget'].get() passwd = self.cmdForms['default'].descr.entryByName\ ['Password_Entry']['widget'].get() file.write("User:%s\nPassword:%s\n"%(user,passwd)) self.login = True
def __init__(self, about, noSplash=False, app=None): """Constructor for SplashScreen""" self.app = app name = validFilename(about.title) self.version = about.version rcWithVersion = getResourceFolderWithVersion() if rcWithVersion is not None: registration = rcWithVersion + os.sep + '.registration' self.timing_rc = rcWithVersion + os.sep + '.timing_' + name self.usage_rc = rcWithVersion + os.sep + '.usage_' + name try: open(self.usage_rc, 'a').write(str(time.time()) + "\n") except: pass else: registration = None self.timing_rc = None self.usage_rc = None self.noSplash = noSplash self.registered = False # change this to False to check registration self.register = None # check if the user has registered if registration is None or os.path.exists(registration): self.registered = True #self.check_for_updates(registration) else: # count number of use and ask to register lines = open(self.usage_rc).readlines() if len(lines) < 10: self.registered = True self.waitTk = tkinter.IntVar() self.percent = 0 if self.timing_rc is None: self.timing_data = [] else: try: timing_file = open(self.timing_rc, 'r+') except: timing_file = open(self.timing_rc, 'w+') self.timing_data = timing_file.readlines() timing_file.close() ###self.percent = 0 if self.timing_data: for data in self.timing_data: self.percent += int(data) self.percent = int(self.percent / len(self.timing_data)) self.percent = 100 / self.percent if self.percent == 0: self.percent = 1 self.counter = 0 if self.registered and self.noSplash: return self.splash_win = tkinter.Toplevel() self.splash_win.overrideredirect(1) self.splash_win.withdraw() _splashDisplayed[self.app] = self frame = tkinter.Frame(self.splash_win, relief='raised', bd=3) frame.pack() try: about.gui(master=frame) except Exception as inst: print(inst) self.progressBar = ProgressBar(master=frame, labelside=None, width=420, height=20, mode='percent') self.progressBar.setLabelText('Loading Modules...') self.progressBar.set(0) if not self.registered: text = """ Please Register! It helps us secure funding for supporting development and you won't have to click these buttons again in the future. Thanks.""" tkinter.Label(frame, text = text, font =(ensureFontCase('helvetica'), 14, 'bold') ).\ pack() tkinter.Button(frame, text='Register Now', bg='Green', command=self.Register_Now).pack(side='left') self.Later_Button = tkinter.Button(frame, text='Remind Me Later', state='disabled', command=self.Later) self.Later_Button.pack(side='right') self._updateprogressBar() self.splash_win.update_idletasks() width = self.splash_win.winfo_reqwidth() height = self.splash_win.winfo_reqheight() screenwidth = self.splash_win.winfo_screenwidth() if screenwidth > 2000: screenwidth = 1000 x = (screenwidth - width) / 2 - self.splash_win.winfo_vrootx() y = (self.splash_win.winfo_screenheight() - height) / 4 - \ self.splash_win.winfo_vrooty() if x < 0: x = 0 if y < 0: y = 0 geometry = '%dx%d+%d+%d' % (width, height, x, y) self.splash_win.geometry(geometry) self.splash_win.update_idletasks() self.splash_win.deiconify() self.splash_win.update() self.splash_win_children = self.splash_win.children self.splash_win.children = [ ] # this is needed to avoid problems self.changeFont
class Update: """ package : Support module : update class : Update description: Provides GUI and command line interface for updating MGLTools """ def __init__(self): if sys.platform == 'linux2': if sys.maxsize > 2147483647: #os.popen('uname -m').read() == 'x86_64\n': self.sys_prefix = 'x86_64Linux2' else: self.sys_prefix = 'i86Linux2' self.update_file = self.sys_prefix + '.tar.gz' elif os.name == 'nt': #sys.platform == 'win32': self.sys_prefix = 'win32' self.update_file = self.sys_prefix + '.zip' elif sys.platform == 'darwin': uname = os.uname() if uname[2].startswith('8'): name = '8' else: name = '9' if uname[-1] == "i386": self.sys_prefix = "i86Darwin" + name else: self.sys_prefix = "ppcDarwin" + name self.update_file = self.sys_prefix + '.tar.gz' else: print("Sorry no nightly builds is available for your platform.") print(sys.platform) from user import home from Support.version import __version__ self.rc = home + os.sep + ".mgltools" + os.sep + __version__ self.updates_rc_dir = self.rc + os.sep + 'update' if not os.path.isdir(self.updates_rc_dir): os.mkdir(self.updates_rc_dir) self.latest = 'tested' # or 'nightly' self.master = None self.updates_dir = None from Support.version import __version__ self.Version = __version__ self.baseURL = base_url + '/' + self.Version self.date_latest = None self.date_tested = None self.latestURL = None self.testedURL = None def setUpdatesDir(self): """Gets update directory path from '.mgltools/update/'+self.latest. If this file doesn't exists, updates_dir is set to one directory up from PIL packages directory""" if not self.updates_dir: latest_rc = self.updates_rc_dir + os.sep + 'tested' if os.path.exists(latest_rc): self.updates_dir = open(latest_rc).read() if self.updates_dir: self.updates_dir = self.updates_dir.split('\t')[0] self.updates_dir = os.path.split(self.updates_dir)[0] if not self.updates_dir: latest_rc = self.updates_rc_dir + os.sep + 'nightly' if os.path.exists(latest_rc): self.updates_dir = open(latest_rc).read() if self.updates_dir: self.updates_dir = self.updates_dir.split('\t')[0] self.updates_dir = os.path.split(self.updates_dir)[0] if not self.updates_dir or not os.path.exists(self.updates_dir): path = os.path.split( os.path.split(os.path.abspath(__file__))[0])[0] # to find ../lib/python2.5/site-packages/ self.updates_dir = path + os.sep + 'Updates' def testWritable(self): "Tests if we can open(mgltools.tar.gz,'w') in the Updates directory" if not os.path.isdir(self.updates_dir): try: os.mkdir(self.updates_dir) except Exception as inst: print(inst) if self.master: showinfo( "Could not create " + self.updates_dir, "Please select directory for downloading updates.") self.browseUpdatesDir() else: self.updates_dir = input( "Could not create " + self.updates_dir + "\nPlease enter directory path for saving updates\n") if not self.updates_dir: return False else: self.testWritable() try: open(self.updates_dir + os.sep + 'mgltools.tar.gz', 'w') os.remove(self.updates_dir + os.sep + 'mgltools.tar.gz') except Exception as inst: if self.master: showinfo( "Could not create " + self.updates_dir + os.sep + 'mgltools.tar.gz', "Please select directory for downloading updates.") self.browseUpdatesDir() else: self.updates_dir = input( "Could not create " + self.updates_dir + os.sep + "mgltools.tar.gz\n" "Please enter directory path for saving updates\n") if not self.updates_dir: return False else: self.testWritable() return True def getUpdates(self, packages=[]): "Downloads and unpacks updates" self.setUpdatesDir() if not self.testWritable(): print("Updates are not installed!") return if not self.checkRegistration(): print("Updates are not installed!") self.cancel() return regDict = pickle.load(open(self.rc + os.sep + ".registration")) UserID = regDict['UserID'] update_url = self.baseURL if not self.date_latest or not self.date_tested: self.getInfo() date_tested = self.date_tested date_latest = self.date_latest if self.latest == 'tested': update_url = self.testedURL self.clearUpdates() else: if date_tested == date_latest: try: self.clearUpdates() except: pass update_url = self.testedURL self.latest = 'tested' else: latest_rc = self.updates_rc_dir + os.sep + self.latest if os.path.exists(latest_rc): lines = open(latest_rc).readlines() if lines: date = lines[0].split('\t')[1] if date < date_latest: self.updates_dir += os.sep + 'nightly_' self.updates_dir += date_latest.replace('/', '_') lines.insert( 0, self.updates_dir + "\t" + date_latest + '\n') open(latest_rc, 'w').writelines(lines) else: self.updates_dir += os.sep + 'nightly' self.updates_dir += '_' + date_latest.replace('/', '_') open(latest_rc, 'w').write(self.updates_dir + "\t" + date_latest + '\n') else: self.updates_dir += os.sep + 'nightly' self.updates_dir += '_' + date_latest.replace('/', '_') open(latest_rc, 'w').write(self.updates_dir + "\t" + date_latest + '\n') update_url = self.latestURL if self.latest == 'tested': if not os.path.isdir(self.updates_dir): os.mkdir(self.updates_dir) self.updates_dir += os.sep + 'tested' if not os.path.isdir(self.updates_dir): os.mkdir(self.updates_dir) tar_file = self.update_file download_file = open(tar_file, 'wb') url_file = urllib.request.FancyURLopener().open(update_url) if self.master: upload_size = url_file.headers['content-length'] per_size = int(upload_size) / 99 self.progressBar.configure(labeltext="Progress ...") self.master.update() for i in range(101): if self.updates_dir == 'cancel': return self.progressBar.set(i) self.master.update() tmp = url_file.read(per_size) if tmp: download_file.write(tmp) else: download_file.close() url_file.close() break self.progressBar.canvas.itemconfig(self.progressBar.progressLabel, text=" Please wait...") self.master.update() else: print("Downloading updates from\n" + update_url + "\nPlease wait...") download_file.write(url_file.read()) download_file.close() if os.name != 'nt': #sys.platform != 'win32': tar = tarfile.open(tar_file) for tarinfo in tar: tar.extract(tarinfo, path=self.updates_dir) tar.close() else: unzipper = unzip.unzip() unzipper.extract(tar_file, self.updates_dir) os.remove(tar_file) if self.latest == 'tested': latest_rc = self.updates_rc_dir + os.sep + self.latest open(latest_rc, 'w').write(self.updates_dir + "\t" + date_tested) headers = { "Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain" } update_dict = {} update_dict['UserID'] = UserID update_dict['type'] = self.latest if self.latest == 'tested': update_dict['date'] = date_tested else: update_dict['date'] = date_latest params = urllib.parse.urlencode(update_dict) conn = http.client.HTTPConnection("www.scripps.edu:80") conn.request("POST", "/cgi-bin/sanner/update_mgltools_user.py", params, headers) response = conn.getresponse() conn.close() if self.master: self.finishGUI() def gui(self): "GUI for MGLTools updates" import tkinter self.master = tkinter.Tk() self.master.lift() self.master.title("Update MGLTools") self.master.option_add('*font', "Times 12 bold") text = "Update Manager" tkinter.Label(self.master, text=text, bg='white', font=(ensureFontCase('helvetica'), 16)).grid(column=0, row=0, columnspan=3, sticky='snew') tested_rc = self.updates_rc_dir + os.sep + "tested" nightly_rc = self.updates_rc_dir + os.sep + "nightly" tested_dir = None nightly_dir = None if os.path.exists(tested_rc): tested_dir = open(tested_rc).read() if os.path.exists(nightly_rc): nightly_dir = open(nightly_rc).readlines() text = "You are running MGLTools " + self.Version if nightly_dir: tmp = nightly_dir[0] text += " with nightly update from " + tmp.split()[1] if len(nightly_dir) > 1: text += "\nOlder installed updates:\n" for item in nightly_dir[1:]: text += " nightly " + item.split('\t')[1] + "\n" if tested_dir: text += " tested " + tested_dir.split('\t')[1] elif tested_dir: text += "\nOlder installed updates:\n" text += " tested " + tested_dir.split('\t')[1] elif tested_dir: text += " with tested update from " + tested_dir.split()[1] tkinter.Label(self.master, text=text, bg='white', justify='left').grid(row=1, column=0, columnspan=3, sticky='snew') self.notebook = Pmw.NoteBook(self.master) self.notebook.grid(row=2, column=0, columnspan=3, sticky='snew') webPage = self.notebook.add('Online') self.webPage = webPage self.updateCheckbutton = tkinter.Checkbutton(webPage, text="Check for Updates", command=self.checkUpdates) self.updateCheckbutton.grid(row=0, column=0, columnspan=3, sticky='nw') self.tk_latest = tkinter.IntVar() from mglutil.gui.BasicWidgets.Tk.progressBar import ProgressBar self.frame = tkinter.Frame(self.master, relief='groove') self.frame.grid(row=4, column=0, columnspan=3, sticky='ew') self.progressBar = ProgressBar(master=self.frame, labelside=None, width=200, height=20, mode='percent') self.progressBar.setLabelText('Progress...') self.frame.grid_forget() self.waitTk = tkinter.IntVar() if tested_dir or nightly_dir: tkinter.Button(self.master, text="Revert to " + self.Version, command=self.clearUpdatesGUI).grid(row=5, column=0) if nightly_dir: if len(nightly_dir) > 1: tkinter.Button(self.master, text="Rollback to nightly " + \ nightly_dir[1].split('\t')[1], command=self.rollback).grid(row=5, column=1) elif tested_dir: tkinter.Button(self.master, text="Rollback to tested " + \ tested_dir.split('\t')[1], command=self.rollback).grid(row=5, column=1) tkinter.Button(self.master, text="Cancel", command=self.cancel).\ grid(row=5, column=2) self.tested_dir = tested_dir self.nightly_dir = nightly_dir filePage = self.notebook.add('File') self.localLabel = tkinter.Label(filePage, text="Update from Local File", justify='left', fg='gray45') self.localLabel.grid() self.localButton = tkinter.Button(filePage, text="Browse...", command=self.updateLocal) self.localButton.grid() self.notebook.setnaturalsize() return self.waitTk def checkUpdates(self): """This command is called when Check for Updates button is pressed""" self.updateCheckbutton.configure(state='disabled') #check to see if self.Version is the latest version = urllib.request.urlopen(base_url + '/version').read().strip() if self.Version < version: txt = "New version (" + version + ") is available for download." tkinter.Label(self.webPage, text=txt).\ grid(row=1, column=0, sticky='ew') l = tkinter.Label(self.webPage, fg='Blue', cursor='hand1', text='http://mgltools.scripps.edu/downloads') l.grid(row=2, column=0, sticky='ew') def openurl(evt=None): webbrowser.open('http://mgltools.scripps.edu/downloads') l.bind(sequence="<Button-1>", func=openurl) self.notebook.setnaturalsize() if not self.date_latest or not self.date_tested: self.getInfo() date_tested = self.date_tested date_latest = self.date_latest updatesLabel = tkinter.Label(self.webPage, text='Available updates:', justify='left') updatesLabel.grid(row=3, column=0, sticky='w') self.testedButton = None self.nightlyButton = None def getTested(): webbrowser.open_new(self.testedURL) def getNightly(): webbrowser.open_new(self.latestURL) if self.tested_dir and date_tested: if date_tested > self.tested_dir.split()[1]: testedGroup = tkinter.LabelFrame( self.webPage, padx=5, pady=5, text="Updates - Tested Builds") testedGroup.grid(row=4, column=0, columnspan=3, sticky='ew') tkinter.Label(testedGroup, text=date_tested +' ', justify='left').\ grid(row=0, column=0, sticky='w') self.testedButton = tkinter.Button(testedGroup, text=' Install ', command=self.updateTested) self.testedButton.grid(row=0, column=1, sticky='ew') self.downloadTested = tkinter.Button(testedGroup, text=' Save to File ', command=getTested) self.downloadTested.grid(row=0, column=2, sticky='ew') elif date_tested: testedGroup = tkinter.LabelFrame(self.webPage, padx=5, pady=5, text="Updates - Tested Builds") testedGroup.grid(row=4, column=0, columnspan=3, sticky='ew') tkinter.Label(testedGroup, text=date_tested+' ',justify='left').\ grid(row=0, column=0, sticky='w') self.testedButton = tkinter.Button(testedGroup, text=' Install ', command=self.updateTested) self.testedButton.grid(row=0, column=1, sticky='ew') self.downloadTested = tkinter.Button(testedGroup, text=' Save to File ', command=getTested) self.downloadTested.grid(row=0, column=2, sticky='ew') if self.nightly_dir and date_latest: if date_latest > self.nightly_dir[0].split()[1]: nightlyGroup = tkinter.LabelFrame( self.webPage, padx=5, pady=5, text="Updates - Nightly Builds") nightlyGroup.grid(row=5, column=0, columnspan=3, sticky='ew') tkinter.Label(nightlyGroup, text=date_latest,justify='left').\ grid(row=0, column=0, sticky='w') self.nightlyButton = tkinter.Button(nightlyGroup, text='Install', command=self.updateNightly) self.nightlyButton.grid(row=0, column=1, sticky='ew') self.downloadNightly = tkinter.Button(nightlyGroup, text='Save to File', command=getNightly) self.downloadNightly.grid(row=0, column=2, sticky='ew') elif date_latest: if date_latest > date_tested: nightlyGroup = tkinter.LabelFrame( self.webPage, padx=5, pady=5, text="Updates - Nightly Builds") nightlyGroup.grid(row=5, column=0, columnspan=3, sticky='ew') tkinter.Label(nightlyGroup, text=date_latest,justify='left').\ grid(row=0, column=0, sticky='w') self.nightlyButton = tkinter.Button(nightlyGroup, text='Install', command=self.updateNightly) self.nightlyButton.grid(row=0, column=1, sticky='ew') self.downloadNightly = tkinter.Button(nightlyGroup, text='Save to File', command=getNightly) self.downloadNightly.grid(row=0, column=2, sticky='ew') # If test results summary is available for current platform (or at least for Linux), # add a button to show it. self.summary_file = "testsummary" + sys.platform + ".html" if sys.platform == "darwin": if os.uname()[-1] == 'Power Macintosh': prt = "powerpc" else: prt = "i386" self.summary_file = "testsummary" + sys.platform + prt + ".html" date_summary = self.getDate( self.baseURL + '/latest/', self.baseURL + '/latest/' + self.summary_file) if not date_summary: # no test summary for current platform self.summary_file = "testsummarylinux2.html" date_summary = self.getDate( self.baseURL + '/latest/', self.baseURL + '/latest/' + self.summary_file) #print "date_summary:", date_summary #print "self.summary_file:", self.summary_file if date_summary == date_latest: # add a button to show the report summary tkinter.Label(nightlyGroup, text='Click to see test summary:', justify='left', fg='gray45').grid(row=1, column=0, columnspan=2, sticky='w') self.summaryButton = tkinter.Button( nightlyGroup, text="Test Summary", command=self.showTestSummary) self.summaryButton.grid(row=1, column=2, sticky='ew') if not self.testedButton and not self.nightlyButton: updatesLabel.configure( text="No updates are available at this time.") self.notebook.setnaturalsize() def checkRegistration(self): if not self.rc: return False regfile = self.rc + os.sep + ".registration" if not os.path.exists(regfile): from mglutil.splashregister.register import Register_User register = Register_User(self.Version) while register.master: self.master.update() if not os.path.exists(regfile): return False return True def updateLocal(self): "Updates from local file" fileTypes = [('', '*.zip *.gz')] file = askopenfilename(parent=self.master, title='Choose a file', filetypes=fileTypes) if not file: return self.setUpdatesDir() if not self.testWritable(): print("Updates are not installed!") return self.localButton.configure(state='disabled') self.localLabel.configure(text='Please Wait...') self.master.update() mtime = os.path.getmtime(file) import time mdate = time.localtime(mtime) date_latest = str(mdate[0]) + '/' + str(mdate[1]) + '/' + str(mdate[2]) latest_rc = self.updates_rc_dir + os.sep + 'nightly' if os.path.exists(latest_rc): lines = open(latest_rc).readlines() if lines: self.updates_dir += os.sep + 'nightly_' self.updates_dir += date_latest.replace('/', '_') lines.insert(0, self.updates_dir + " " + date_latest + '\n') open(latest_rc, 'w').writelines(lines) else: self.updates_dir += os.sep + 'nightly' self.updates_dir += '_' + date_latest.replace('/', '_') open(latest_rc, 'w').write(self.updates_dir + " " + date_latest + '\n') else: self.updates_dir += os.sep + 'nightly' self.updates_dir += '_' + date_latest.replace('/', '_') open(latest_rc, 'w').write(self.updates_dir + " " + date_latest + '\n') if not os.path.isdir(self.updates_dir): os.mkdir(self.updates_dir) if file.endswith('.gz'): tar = tarfile.open(file) for tarinfo in tar: tar.extract(tarinfo, path=self.updates_dir) tar.close() else: unzipper = unzip.unzip() unzipper.extract(file, self.updates_dir) if self.master: self.finishGUI() def browseUpdatesDir(self): self.updates_dir = askdirectory() def cancel(self): self.updates_dir = 'cancel' self.finishGUI() def finishGUI(self): self.waitTk.set(1) self.master.destroy() def rollback(self): nighlty_dir = None tested_dir = None nighlty_rc = self.updates_rc_dir + os.sep + 'nightly' if os.path.exists(nighlty_rc): nighlty_dir = open(nighlty_rc).readlines() tested_rc = self.updates_rc_dir + os.sep + 'tested' if os.path.exists(tested_rc): tested_dir = open(tested_rc).read() if nighlty_dir: if len(nighlty_dir) > 1: open(nighlty_rc, 'w').writelines(nighlty_dir[1:]) else: os.remove(nighlty_rc) rm_dirs(nighlty_dir[0].split()[0]) elif tested_dir: self.clearUpdates() self.finishGUI() def updateTested(self): self.testedButton.configure(state='disabled') self.frame.grid(row=4, column=0, columnspan=3, sticky='ew') self.progressBar.setLabelText("Downloading Updates. Please wait...") self.master.update() self.latest = 'tested' self.getUpdates() def updateNightly(self): self.nightlyButton.configure(state='disabled') self.frame.grid(row=4, column=0, columnspan=3, sticky='ew') self.progressBar.setLabelText("Downloading Updates. Please wait...") self.master.update() self.latest = 'nightly' self.getUpdates() def clearUpdates(self): "Removes all updates files" updates_rc = [] updates_rc.append(self.updates_rc_dir + os.sep + 'nightly') updates_rc.append(self.updates_rc_dir + os.sep + 'tested') for update in updates_rc: if os.path.exists(update): update_dir = open(update).read() os.remove(update) if update_dir: update_dir = update_dir.split('\t')[0] if update_dir.find('tested') == -1 and update_dir.find( 'nightly') == -1: print("Refusing to delete " + update_dir) print("Please delete " + update_dir + " to clear updates") return if os.path.isdir(update_dir): mgl_dirs = os.listdir(update_dir) for dir in mgl_dirs: dir_path = update_dir + os.sep + dir if os.path.isdir(dir_path): rm_dirs(dir_path) else: os.remove(dir_path) os.rmdir(update_dir) def showTestSummary(self): webbrowser.open_new(self.baseURL + '/latest/' + self.summary_file) def getInfo(self): "Gets info about nighly and tested builds" nightly_url = self.baseURL + '/latest/' f = urllib.request.urlopen(nightly_url) html = f.read() start = html.find(self.update_file) if start > 0: html = html[start:].split() self.date_latest = html[10].split('</tt>')[0] self.latestURL = html[6].split("\"")[1] f.close() nightly_url = self.baseURL + '/latest-tested/' f = urllib.request.urlopen(nightly_url) html = f.read() start = html.find(self.update_file) if start > 0: html = html[start:].split() self.date_tested = html[10].split('</tt>')[0] self.testedURL = html[6].split("\"")[1] f.close() def getDate(self, nightly_url, update_url): "This function is used to extract date from remote directory listing" f = urllib.request.urlopen(nightly_url) html = f.read() start = html.find(update_url) if start < 0: return None html = html[start:].split() date = html[10].split('</tt>')[0] f.close() return date def clearUpdatesGUI(self): try: self.clearUpdates() except: pass self.finishGUI()
def gui(self): "GUI for MGLTools updates" import tkinter self.master = tkinter.Tk() self.master.lift() self.master.title("Update MGLTools") self.master.option_add('*font', "Times 12 bold") text = "Update Manager" tkinter.Label(self.master, text=text, bg='white', font=(ensureFontCase('helvetica'), 16)).grid(column=0, row=0, columnspan=3, sticky='snew') tested_rc = self.updates_rc_dir + os.sep + "tested" nightly_rc = self.updates_rc_dir + os.sep + "nightly" tested_dir = None nightly_dir = None if os.path.exists(tested_rc): tested_dir = open(tested_rc).read() if os.path.exists(nightly_rc): nightly_dir = open(nightly_rc).readlines() text = "You are running MGLTools " + self.Version if nightly_dir: tmp = nightly_dir[0] text += " with nightly update from " + tmp.split()[1] if len(nightly_dir) > 1: text += "\nOlder installed updates:\n" for item in nightly_dir[1:]: text += " nightly " + item.split('\t')[1] + "\n" if tested_dir: text += " tested " + tested_dir.split('\t')[1] elif tested_dir: text += "\nOlder installed updates:\n" text += " tested " + tested_dir.split('\t')[1] elif tested_dir: text += " with tested update from " + tested_dir.split()[1] tkinter.Label(self.master, text=text, bg='white', justify='left').grid(row=1, column=0, columnspan=3, sticky='snew') self.notebook = Pmw.NoteBook(self.master) self.notebook.grid(row=2, column=0, columnspan=3, sticky='snew') webPage = self.notebook.add('Online') self.webPage = webPage self.updateCheckbutton = tkinter.Checkbutton(webPage, text="Check for Updates", command=self.checkUpdates) self.updateCheckbutton.grid(row=0, column=0, columnspan=3, sticky='nw') self.tk_latest = tkinter.IntVar() from mglutil.gui.BasicWidgets.Tk.progressBar import ProgressBar self.frame = tkinter.Frame(self.master, relief='groove') self.frame.grid(row=4, column=0, columnspan=3, sticky='ew') self.progressBar = ProgressBar(master=self.frame, labelside=None, width=200, height=20, mode='percent') self.progressBar.setLabelText('Progress...') self.frame.grid_forget() self.waitTk = tkinter.IntVar() if tested_dir or nightly_dir: tkinter.Button(self.master, text="Revert to " + self.Version, command=self.clearUpdatesGUI).grid(row=5, column=0) if nightly_dir: if len(nightly_dir) > 1: tkinter.Button(self.master, text="Rollback to nightly " + \ nightly_dir[1].split('\t')[1], command=self.rollback).grid(row=5, column=1) elif tested_dir: tkinter.Button(self.master, text="Rollback to tested " + \ tested_dir.split('\t')[1], command=self.rollback).grid(row=5, column=1) tkinter.Button(self.master, text="Cancel", command=self.cancel).\ grid(row=5, column=2) self.tested_dir = tested_dir self.nightly_dir = nightly_dir filePage = self.notebook.add('File') self.localLabel = tkinter.Label(filePage, text="Update from Local File", justify='left', fg='gray45') self.localLabel.grid() self.localButton = tkinter.Button(filePage, text="Browse...", command=self.updateLocal) self.localButton.grid() self.notebook.setnaturalsize() return self.waitTk