From 7162b4ee74dabea9ee5b51bb4291103854fa715a 2012-12-20 20:42:38 From: Daniel Valdez Date: 2012-12-20 20:42:38 Subject: [PATCH] Envio de graficos por FTP: -Se agrega modulo customftp.py al folder graphics, este folder contiene la clase Ftp para envio de datos por ftp, en este caso se enviaran solo imagenes. -Se agrega el metodo sendByFTP a la clase Figure. -El metodo sendByFTP se llama solo desde RTIPlot y CoherenceMap --- diff --git a/schainpy/model/graphics/customftp.py b/schainpy/model/graphics/customftp.py new file mode 100644 index 0000000..c63a184 --- /dev/null +++ b/schainpy/model/graphics/customftp.py @@ -0,0 +1,293 @@ +import os.path +import ftplib + + +class Ftp(): + """ + Ftp is a public class used to define custom File Transfer Protocol from "ftplib" python module + + Non-standard Python modules used: None + + Written by "Daniel Suarez":mailto:daniel.suarez@jro.igp.gob.pe Oct. 26, 2010 + """ + + def __init__(self,host = None, username=None, passw=None, remotefolder=None): + """ + This method is used to setting parameters for FTP and establishing connection to remote host + + Inputs: + host - remote host IP Address + + username - remote host Username + + passw - remote host Passw + + remotefolder - remote host current working directory + + Return: void + + Affects: + self.status - in Error Case or Connection Failed this parameter is set to 1 else 0 + + self.folderList - sub-folder list of remote folder + + self.fileList - file list of remote folder + + + """ + + if ((host == None) and (username==None) and (passw==None) and (remotefolder==None)): + host, username, passw, remotefolder = self.parmsByDefault() + + self.host = host + self.username = username + self.passw = passw + self.remotefolder = remotefolder + self.file = None + self.ftp = None + self.status = 0 + + try: + self.ftp = ftplib.FTP(self.host) + self.ftp.login(self.username,self.passw) + self.ftp.cwd(self.remotefolder) +# print 'Connect to FTP Server: Successfully' + + except ftplib.all_errors: + print 'Error FTP Service' + self.status = 1 + return + + + + self.dirList = [] + + try: + self.dirList = self.ftp.nlst() + + except ftplib.error_perm, resp: + if str(resp) == "550 No files found": + print "no files in this directory" + self.status = 1 + return + + except ftplib.all_errors: + print 'Error Displaying Dir-Files' + self.status = 1 + return + + self.fileList = [] + self.folderList = [] + #only for test + for f in self.dirList: + name, ext = os.path.splitext(f) + if ext != '': + self.fileList.append(f) +# print 'filename: %s - size: %d'%(f,self.ftp.size(f)) + + def parmsByDefault(self): + host = 'jro.igp.gob.pe' + username = 'operaciones' + passw = 'mst98vhf' + remotefolder = '/users/database/on-line/' + + return host, username, passw, remotefolder + + + def mkd(self,dirname): + """ + mkd is used to make directory in remote host + + Input: + dirname - directory name + + Return: + 1 in error case else 0 + """ + try: + self.ftp.mkd(dirname) + except: + print 'Error creating remote folder:%s'%dirname + return 1 + + return 0 + + + def delete(self,filename): + """ + delete is used to delete file in current working directory of remote host + + Input: + filename - filename to delete in remote folder + + Return: + 1 in error case else 0 + """ + + try: + self.ftp.delete(filename) + except: + print 'Error deleting remote file:%s'%filename + return 1 + + return 0 + + def download(self,filename,localfolder): + """ + download is used to downloading file from remote folder into local folder + + Inputs: + filename - filename to donwload + + localfolder - directory local to store filename + + Returns: + self.status - 1 in error case else 0 + """ + + self.status = 0 + + + if not(filename in self.fileList): + print 'filename:%s not exists'%filename + self.status = 1 + return self.status + + newfilename = os.path.join(localfolder,filename) + + self.file = open(newfilename, 'wb') + + try: + print 'Download: ' + filename + self.ftp.retrbinary('RETR ' + filename, self.__handleDownload) + print 'Download Complete' + except ftplib.all_errors: + print 'Error Downloading ' + filename + self.status = 1 + return self.status + + self.file.close() + + return self.status + + + def __handleDownload(self,block): + """ + __handleDownload is used to handle writing file + """ + self.file.write(block) + + + def upload(self,filename,remotefolder=None): + """ + upload is used to uploading local file to remote directory + + Inputs: + filename - full path name of local file to store in remote directory + + remotefolder - remote directory + + Returns: + self.status - 1 in error case else 0 + """ + + if remotefolder == None: + remotefolder = self.remotefolder + + self.status = 0 + + try: + self.ftp.cwd(remotefolder) + + self.file = open(filename, 'rb') + + (head, tail) = os.path.split(filename) + + command = "STOR " + tail + + print 'Uploading: ' + tail + self.ftp.storbinary(command, self.file) + print 'Upload Completed' + + except ftplib.all_errors: + print 'Error Uploading ' + tail + self.status = 1 + return self.status + + self.file.close() + + #back to initial directory in __init__() + self.ftp.cwd(self.remotefolder) + + return self.status + + + def dir(self,remotefolder): + """ + dir is used to change working directory of remote host and get folder and file list + + Input: + remotefolder - current working directory + + Affects: + self.fileList - file list of working directory + + Return: + infoList - list with filenames and size of file in bytes + + self.folderList - folder list + """ + + self.remotefolder = remotefolder + print 'Change to ' + self.remotefolder + try: + self.ftp.cwd(remotefolder) + except ftplib.all_errors: + print 'Error Change to ' + self.remotefolder + infoList = None + self.folderList = None + return infoList,self.folderList + + self.dirList = [] + + try: + self.dirList = self.ftp.nlst() + + except ftplib.error_perm, resp: + if str(resp) == "550 No files found": + print "no files in this directory" + infoList = None + self.folderList = None + return infoList,self.folderList + except ftplib.all_errors: + print 'Error Displaying Dir-Files' + infoList = None + self.folderList = None + return infoList,self.folderList + + infoList = [] + self.fileList = [] + self.folderList = [] + for f in self.dirList: + name,ext = os.path.splitext(f) + if ext != '': + self.fileList.append(f) + value = (f,self.ftp.size(f)) + infoList.append(value) + + if ext == '': + self.folderList.append(f) + + return infoList,self.folderList + + + def close(self): + """ + close is used to close and end FTP connection + + Inputs: None + + Return: void + + """ + self.ftp.close() \ No newline at end of file diff --git a/schainpy/model/graphics/figure.py b/schainpy/model/graphics/figure.py index a78d659..65c44cf 100644 --- a/schainpy/model/graphics/figure.py +++ b/schainpy/model/graphics/figure.py @@ -2,7 +2,7 @@ import os import numpy import time, datetime import mpldriver - +from customftp import * class Figure: @@ -117,6 +117,7 @@ class Figure: self.heightscreen) self.axesObjList = [] + def setDriver(self, driver=mpldriver): @@ -160,6 +161,11 @@ class Figure: self.__driver.saveFigure(self.fig, filename, *args) + def sendByFTP(self, figfilename): + ftpObj = Ftp() + ftpObj.upload(figfilename) + ftpObj.close() + def draw(self): self.__driver.draw(self.fig) diff --git a/schainpy/model/jroplot.py b/schainpy/model/jroplot.py index 09d6a77..e605f76 100644 --- a/schainpy/model/jroplot.py +++ b/schainpy/model/jroplot.py @@ -1,5 +1,5 @@ import numpy -import time, datetime +import time, datetime, os from graphics.figure import * class CrossSpectraPlot(Figure): @@ -194,6 +194,7 @@ class RTIPlot(Figure): self.HEIGHT = 150 self.WIDTHPROF = 120 self.HEIGHTPROF = 0 + self.counterftp = 0 def getSubplots(self): @@ -238,7 +239,7 @@ class RTIPlot(Figure): def run(self, dataOut, idfigure, wintitle="", channelList=None, showprofile='True', xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, timerange=None, - save=False, figpath='./', figfile=None): + save=False, figpath='./', figfile=None, ftp=False, ftpratio=1): """ @@ -333,6 +334,12 @@ class RTIPlot(Figure): self.saveFigure(figpath, figfile) + self.counterftp += 1 + if (ftp and (self.counterftp==ftpratio)): + figfilename = os.path.join(figpath,figfile) + self.sendByFTP(figfilename) + self.counterftp = 0 + if x[1] + (x[1]-x[0]) >= self.axesList[0].xmax: self.__isConfig = False @@ -709,6 +716,7 @@ class CoherenceMap(Figure): self.HEIGHT = 150 self.WIDTHPROF = 120 self.HEIGHTPROF = 0 + self.counterftp = 0 def getSubplots(self): ncol = 1 @@ -745,7 +753,7 @@ class CoherenceMap(Figure): def run(self, dataOut, idfigure, wintitle="", pairsList=None, showprofile='True', xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, timerange=None, - save=False, figpath='./', figfile=None, + save=False, figpath='./', figfile=None, ftp=False, ftpratio=1, coherence_cmap='jet', phase_cmap='RdBu_r'): if pairsList == None: @@ -853,6 +861,12 @@ class CoherenceMap(Figure): self.saveFigure(figpath, figfile) + self.counterftp += 1 + if (ftp and (self.counterftp==ftpratio)): + figfilename = os.path.join(figpath,figfile) + self.sendByFTP(figfilename) + self.counterftp = 0 + if x[1] + (x[1]-x[0]) >= self.axesList[0].xmax: self.__isConfig = False