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()
Ejemplo n.º 2
0
    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)
Ejemplo n.º 5
0
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
Ejemplo n.º 7
0
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()
Ejemplo n.º 8
0
    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