ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/ns_dev/Python/NinoCode/Active_prgs/MCP/Trunk/MCP_Lib.py
Revision: 483
Committed: Wed Nov 20 20:20:23 2013 UTC (12 years, 4 months ago) by nino.borges
Content type: text/x-python
Original Path: Python/NinoCode/Active_prgs/MCP/MCP_Lib.py
File size: 53125 byte(s)
Log Message:
Updated was location to new.

File Contents

# User Rev Content
1 ninoborges 8 """
2    
3     MCP_Lib
4    
5     Created by
6     Emanuel Borges
7     10.25.2010
8    
9     This wil be the main library for the MCP aplications. Shared methods will be
10     kept here. Version informaiton for the entire MCP program will be kept here to.
11    
12     """
13    
14 nino.borges 464 import os,sys, win32com.client,ConcordanceHelperTools,subprocess,ftplib,NinoGenTools, win32com.decimal_23
15 ninoborges 8
16     def GetCaseList(sys_Overwrite ="", accessConnectionObj = None):
17 nino.borges 189 """ Main method to parse and return usable lists of cases. returns list of my cases, office cases and all cases.
18     also returns the cases directory."""
19 ninoborges 8 #print os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])),"settings.sys")
20     if sys_Overwrite:
21     casesDir = open(os.path.join(sys_Overwrite,"settings.sys")).readline().replace("\n","")
22     else:
23     casesDir = open(os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])),"settings.sys")).readline().replace("\n","")
24     #casesDir = r"C:\Documents and Settings\eborges\My Documents\My Dropbox\Documents\Cases"
25     responsibleCases = []
26 nino.borges 454 activeCases = []
27 nino.borges 189 officeCases = []
28     allCases = []
29 nino.borges 462 casePathStyleMatrix = {}
30 nino.borges 189 tPMName,tPMID,nul = GetTPMInfo()
31     if accessConnectionObj:
32     accessDB = accessConnectionObj
33     else:
34     print "connecting to matter tracking access db..."
35     ## Production version
36     accessDB = AccessDBConnection(r"\\chiads01\app\DS_CaseTrack\TPM_CaseTracking.mdb")
37    
38     ## Testing version
39     #accessDB = AccessDBConnection(r"W:\Manny\testing\TPM_CaseTracking.mdb")
40     print "connected to DB."
41     officeList = GetFullOfficeList()
42    
43     cliMatList = []
44     for office in officeList:
45     cliMatList.extend(accessDB.RetrieveOfficeCaseList(office))
46     cliMatList.sort()
47     for cliMat in cliMatList:
48     caseName = accessDB.GetCaseName(cliMat)
49 nino.borges 464 casePathStyle = accessDB.GetCasePathStyle(cliMat)
50    
51     cliMat = cliMat.replace(".","-")
52    
53 nino.borges 189 allCases.append('%s_(%s)'%(caseName,cliMat))
54 nino.borges 464
55 nino.borges 462 if not casePathStyle:
56     casePathStyle = None
57 nino.borges 464 #casePathStyleMatrix['%s_(%s)'%(caseName,cliMat)] = casePathStyle
58     casePathStyleMatrix['%s'%cliMat] = casePathStyle
59 nino.borges 189
60 ninoborges 8 if tPMName == 'ANALYST':
61     casesDir = None
62 nino.borges 189 officeCases = allCases
63     responsibleCases = allCases
64 nino.borges 454 activeCases = allCases
65 ninoborges 8 else:
66 nino.borges 189 myMatterList = accessDB.RetrieveMyCaseList(tPMID)
67 nino.borges 454 myActiveMatterList = accessDB.RetrieveMyActiveCaseList(tPMID)
68 ninoborges 8 for file in os.listdir(casesDir):
69     if os.path.isdir(os.path.join(casesDir,file)):
70     if file == "_Template_":
71     pass
72     elif file == "zzzz_dormant_":
73     pass
74     else:
75 nino.borges 189 officeCases.append(file)
76     ## if the case's matter is in my matter list, also append to responsibleCases
77     clientMatter = file.split("_(")[1]
78     clientMatter = clientMatter[:-1]
79     clientMatter = clientMatter.replace('-','.')
80     if clientMatter in myMatterList:
81     responsibleCases.append(file)
82 nino.borges 454 if clientMatter in myActiveMatterList:
83     activeCases.append(file)
84 nino.borges 460 responsibleCases.sort()
85     activeCases.sort()
86     officeCases.sort()
87 nino.borges 462 return responsibleCases, activeCases, officeCases, allCases, casesDir,casePathStyleMatrix
88 ninoborges 8
89     def GetTPMInfo(sys_Overwrite = ""):
90     """ Main method to parse and return the TMP and the Employee ID"""
91     if sys_Overwrite:
92     syscaseDir,tPMName, tPMID,office = open(os.path.join(sys_Overwrite,"settings.sys")).readlines()
93     else:
94     syscaseDir,tPMName, tPMID,office = open(os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])),"settings.sys")).readlines()
95    
96     #syscaseDir,tPMName, tPMID = open(os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])),"settings.sys")).readlines()
97     tPMName = tPMName.replace("\n","")
98     tPMID = tPMID.replace("\n","")
99     office = office.replace("\n","")
100     return tPMName, tPMID, office
101    
102     def GetFullOfficeList():
103     """Simply returns a list of all of the offices."""
104     officeList = ['Boston','Brussels','Chicago','Huston','London','Los Angeles','Miami','Moscow','Munich','New York',
105     'Orange County','Rome','San Diego','Silicon Valley','Washington, D.C.']
106     return officeList
107    
108     def GetOtherCaseFolder(office):
109     """This method will return the case folder for cases that you dont own"""
110     ## So this is in two places that I now have to maintian... not sure I like that.
111     caseFolderMatrix={'Boston':r"\\bstads01\app\Manny\Cases",
112     'Chicago':r"\\chiads01\data\CLI\Litigation_Support\MCP\Cases",
113     'Los Angeles':r"\\lasads01\data\Cli\_Lit_Support\MCP",
114     'New York':r"\\nykads01\data\cli\LitSupport\MCP\Cases",
115     'Miami':r"\\nykads01\data\cli\LitSupport\MCP\Cases",
116     'Orange County':r"\\lasads01\data\Cli\_Lit_Support\MCP",
117     'San Diego':r"\\lasads01\data\Cli\_Lit_Support\MCP",
118     'Silicon Valley':r"\\lasads01\data\Cli\_Lit_Support\MCP",
119 nino.borges 483 'Washington, D.C.':r"\\wdcads01\data\Cli\_Lit_Support\MCP\Cases"}
120 ninoborges 8 try:
121     location = caseFolderMatrix[office]
122     except:
123     location = None
124     return location
125 nino.borges 464 def CreateCasePathStyleFolders(platform,clientMatter):
126     """This method will create the "new style" case folder paths for a case on IDS"""
127     ## make sure that the CLMFolderPath exists, else make the folders needed to make it exist.
128     CLMFolderPath = ConcordanceHelperTools.ParseClientMatterRemote(clientMatter)
129    
130     expeObj = ExpeDatConnection(platform)
131    
132     ## Test each folder, and subfolder, on the new style spec to see if they are there, if not create them.
133     newStyleFolderPathList = [
134     "Productions\\MWE_Client\\Backloads",
135     "Productions\\MWE_Client\\Exports",
136     "Productions\\Other_Party",
137     "Review_Docs\\Hard_Copy",
138     "Review_Docs\\Loose",
139     "Review_Docs\\Processed_Data",
140     "Review_Docs\\TIFs",
141     "Working"
142     ]
143     for pathPart in newStyleFolderPathList:
144     newLocation = os.path.join(CLMFolderPath,pathPart)
145     pathExists = expeObj.TestPath(newLocation)
146     tempPath = newLocation
147     pathRemainingList = []
148     while pathExists == False:
149     tempPath, tempPart = os.path.split(tempPath)
150     pathRemainingList.append(tempPart)
151     pathExists = expeObj.TestPath(tempPath)
152     if pathRemainingList:
153     pathRemainingList.reverse()
154     #print pathRemainingList
155     for pathPiece in pathRemainingList:
156     tempPath = os.path.join(tempPath,pathPiece)
157     expeObj.CreateNewPath(tempPath)
158     print "DEBUG: testing password file"
159     pathExists = expeObj.TestPath(os.path.join(CLMFolderPath,"Productions\\MWE_Client\\Exports\\_passwords.txt"))
160     if pathExists:
161     print "DEBUG: file already exists"
162     else:
163     pw_file = open(os.path.join(os.getenv('TEMP'),"_passwords.txt"),'w')
164     pw_file.close()
165     expeObj.CopyToLN(os.path.join(os.getenv('TEMP'),"_passwords.txt",),os.path.join(CLMFolderPath,"Productions\\MWE_Client\\Exports"))
166 ninoborges 8
167 nino.borges 464
168 nino.borges 266 def GetArchiveFileTypeList():
169     """Returns a list of extensions of archive type files"""
170     return [".ZIP", ".RAR",".TAR",".7Z"]
171    
172 ninoborges 8 def GetMCPVersion():
173     """Returns the current version of the entire MCP program set"""
174 nino.borges 482 return 'v 1.8.0 Build (006)'
175 ninoborges 8
176    
177     class AccessDBConnection:
178     def __init__(self, accessDB):
179     daoEngine = win32com.client.Dispatch('DAO.DBEngine.36')
180     self.daoDB = daoEngine.OpenDatabase(accessDB)
181    
182     def MakeNewRSConnection(self, table, specialSelect = "*", specialWhere="" ):
183     """ This method will make a new RS connection for either reading or writing."""
184     if specialWhere:
185     statement = "SELECT %s FROM %s WHERE %s"%(specialSelect,table, specialWhere)
186     else:
187     statement = "SELECT %s FROM %s"%(specialSelect,table)
188     daoRSObj = self.daoDB.OpenRecordset(statement)
189     return daoRSObj
190    
191     def CloseAccessConnection(self):
192     """This closes the entire connection and not just the RS"""
193     self.daoDB.Close()
194    
195 nino.borges 459 def RetrieveAllTPMMatrix(self):
196     """Retrieves a dictionary of all TPMs and their offices. {TPM:(timekeeperID,OfficeLocation)}"""
197     daoRSObj = self.MakeNewRSConnection('tbl_Ref_Employee', specialWhere = "staffCategory = 'TPM'")
198     daoRSObj.MoveLast()
199     fullCount = daoRSObj.RecordCount
200     daoRSObj.MoveFirst()
201    
202     tpmDict = {}
203     for i in range(fullCount):
204     tpmDict[daoRSObj.Fields('TPMName').Value] = (daoRSObj.Fields('TimekeeperID').Value,daoRSObj.Fields('OfficeLocation').Value)
205     daoRSObj.MoveNext()
206     daoRSObj.Close()
207     return tpmDict
208    
209 nino.borges 462 def RetrieveAllCaseListMatrix(self):
210     """Retrieves all of the cases in the database regardless of assignment but in matrix format
211     where the CLM is matched to yes/no if they use the new case structure..(client matter list)"""
212     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData')
213     daoRSObj.MoveLast()
214     fullCount = daoRSObj.RecordCount
215     daoRSObj.MoveFirst()
216    
217     accessDBCLMListMatrix = {}
218     for i in range(fullCount):
219     newCasePathStyle = daoRSObj.Fields('CasePathFolderStyle').Value
220     if newCasePathStyle:
221     pass
222     else:
223     newCasePathStyle = None
224     accessDBCLMListMatrix[daoRSObj.Fields('ClientMatterNum').Value] = newCasePathStyle
225     daoRSObj.MoveNext()
226     daoRSObj.Close()
227     return accessDBCLMListMatrix
228 nino.borges 459
229 nino.borges 462
230 ninoborges 8 def RetrieveAllCaseList(self):
231     """Retrieves all of the cases in the database regardless of assignment.(client matter list)"""
232     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData')
233     daoRSObj.MoveLast()
234     fullCount = daoRSObj.RecordCount
235     daoRSObj.MoveFirst()
236    
237     accessDBCLMList = []
238     for i in range(fullCount):
239     accessDBCLMList.append(daoRSObj.Fields('ClientMatterNum').Value)
240     daoRSObj.MoveNext()
241     daoRSObj.Close()
242     return accessDBCLMList
243    
244     def RetrieveMyCaseList(self, empID):
245     """Retrieves just 1 employees case list (client matter list)"""
246     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "empID = '%s'"%empID)
247     daoRSObj.MoveLast()
248     fullCount = daoRSObj.RecordCount
249     daoRSObj.MoveFirst()
250    
251     accessDBCLMList = []
252     for i in range(fullCount):
253     accessDBCLMList.append(daoRSObj.Fields('ClientMatterNum').Value)
254     daoRSObj.MoveNext()
255     daoRSObj.Close()
256     return accessDBCLMList
257    
258 nino.borges 454 def RetrieveMyActiveCaseList(self,empID):
259     """Retrieves only the Active cases for just 1 employees case list (client matter list)"""
260     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "empID = '%s' and ProjectStatus = 'Active'"%empID)
261     daoRSObj.MoveLast()
262     fullCount = daoRSObj.RecordCount
263     daoRSObj.MoveFirst()
264    
265     accessDBCLMList = []
266     for i in range(fullCount):
267     accessDBCLMList.append(daoRSObj.Fields('ClientMatterNum').Value)
268     daoRSObj.MoveNext()
269     daoRSObj.Close()
270     return accessDBCLMList
271    
272    
273 ninoborges 8 def RetrieveOfficeCaseList(self, primaryOffice):
274     """Retrieves the case list for an entire office. Note, a case can be owned by a TPM in another office but
275     the primary office might still be an office that that TPM does not work for. Also people are not always
276     good about updating the primary office...(client matter list)"""
277     accessDBCLMList = []
278     try:
279     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "PrimaryOffice = '%s'"%primaryOffice)
280     daoRSObj.MoveLast()
281     fullCount = daoRSObj.RecordCount
282     daoRSObj.MoveFirst()
283    
284    
285     for i in range(fullCount):
286     accessDBCLMList.append(daoRSObj.Fields('ClientMatterNum').Value)
287     daoRSObj.MoveNext()
288     daoRSObj.Close()
289     except:
290     pass
291     return accessDBCLMList
292    
293     def RetrieveProductionsByCLM(self,CLM):
294     """This will retrieve a FULL production matrix for a specific clm"""
295     daoRSObj = self.MakeNewRSConnection('Tbl_MatterProductionDetail',
296 nino.borges 321 "ProductionID,ProductionComplDate, BegBates,EndBates,ProdDocCount,ProdPageCount,Notes,ProducedTo,ProductionMedia,ProductionSource,RequestedBy,ProductionDate,ProductionMediaPassword",
297 ninoborges 8 specialWhere = "ClientMatterNum='%s' ORDER BY ProductionComplDate"%CLM)
298     try:
299     ## Getting an exception that I cant capture when table is empty.
300     ## this will test and return empty if empty, until I can figure out a better test.
301     daoRSObj.MoveLast()
302     tableHasData = True
303     except:
304     tableHasData = False
305     productionList = []
306 nino.borges 321 productionMatrix = {}
307 ninoborges 8 if tableHasData:
308     fullCount = daoRSObj.RecordCount
309     daoRSObj.MoveFirst()
310     for i in range(fullCount):
311     try:
312     pgCount = str(int(daoRSObj.Fields('ProdPageCount').Value))
313     except:
314     pgCount = '0'
315     try:
316     docCount = str(int(daoRSObj.Fields('ProdDocCount').Value))
317     except:
318     docCount = '0'
319 nino.borges 321 grouping = str(daoRSObj.Fields('ProducedTo').Value)
320     if grouping:
321     pass
322     else:
323     grouping = 'default'
324     if grouping in productionMatrix.keys():
325     productionMatrix[grouping].append((str(daoRSObj.Fields('ProductionID').Value),
326 ninoborges 8 str(daoRSObj.Fields('ProductionComplDate').Value).split(' ')[0],
327 nino.borges 321 str(daoRSObj.Fields('ProductionDate').Value).split(' ')[0],
328 ninoborges 8 str(daoRSObj.Fields('BegBates').Value),str(daoRSObj.Fields('EndBates').Value),
329     docCount,pgCount,
330 nino.borges 321 str(daoRSObj.Fields('ProducedTo').Value),
331     str(daoRSObj.Fields('RequestedBy').Value),
332     str(daoRSObj.Fields('ProductionMedia').Value),
333     str(daoRSObj.Fields('ProductionMediaPassword').Value),
334     str(daoRSObj.Fields('ProductionSource').Value),
335 ninoborges 8 str(daoRSObj.Fields('Notes').Value)))
336 nino.borges 321 else:
337     productionMatrix[grouping] = [(str(daoRSObj.Fields('ProductionID').Value),
338     str(daoRSObj.Fields('ProductionComplDate').Value).split(' ')[0],
339     str(daoRSObj.Fields('ProductionDate').Value).split(' ')[0],
340     str(daoRSObj.Fields('BegBates').Value),str(daoRSObj.Fields('EndBates').Value),
341     docCount,pgCount,
342     str(daoRSObj.Fields('ProducedTo').Value),
343     str(daoRSObj.Fields('RequestedBy').Value),
344     str(daoRSObj.Fields('ProductionMedia').Value),
345     str(daoRSObj.Fields('ProductionMediaPassword').Value),
346     str(daoRSObj.Fields('ProductionSource').Value),
347     str(daoRSObj.Fields('Notes').Value))]
348     #productionList.append((str(daoRSObj.Fields('ProductionID').Value),
349     # str(daoRSObj.Fields('ProductionComplDate').Value).split(' ')[0],
350     # str(daoRSObj.Fields('BegBates').Value),str(daoRSObj.Fields('EndBates').Value),
351     # docCount,pgCount,
352     # str(daoRSObj.Fields('Notes').Value)))
353 ninoborges 8 daoRSObj.MoveNext()
354 nino.borges 321 #print len(productionList)
355 ninoborges 8 daoRSObj.Close()
356 nino.borges 321 return productionMatrix
357 ninoborges 8
358    
359     def RetrieveUploadsByCLM(self, CLM):
360     """This will retrieve a FULL upload matrix for a specific clm. This wil also pick the best Size (gb,mb,kb), since it's just for display."""
361     daoRSObj = self.MakeNewRSConnection('tbl_ClientDataQuantity',
362     "UEPOCH,ReviewPlatform,DataLoadDate,DataLoadedGB,DataLoadedMB,DataLoadedKB",
363     specialWhere = "ClientMatterNum='%s'"%CLM)
364     try:
365     ## Getting an exception that I cant capture when table is empty.
366     ## this will test and return empty if empty, until I can figure out a better test.
367     daoRSObj.MoveLast()
368     tableHasData = True
369     except:
370     tableHasData = False
371     caseUploadList = []
372     if tableHasData:
373     fullCount = daoRSObj.RecordCount
374     daoRSObj.MoveFirst()
375    
376     for i in range(fullCount):
377     if daoRSObj.Fields('DataLoadedKB').Value:
378     size = str(daoRSObj.Fields('DataLoadedKB').Value) + ' KB'
379     elif daoRSObj.Fields('DataLoadedMB').Value:
380     size = str(daoRSObj.Fields('DataLoadedMB').Value) + ' MB'
381     else:
382     size = str(daoRSObj.Fields('DataLoadedGB').Value) + ' GB'
383    
384     caseUploadList.append((str(daoRSObj.Fields('UEPOCH').Value),daoRSObj.Fields('ReviewPlatform').Value,
385     str(daoRSObj.Fields('DataLoadDate').Value).split(' ')[0],size))
386     daoRSObj.MoveNext()
387     daoRSObj.Close()
388     return caseUploadList
389    
390     def RetrieveOfficeUploads(self, primaryOffice):
391     """This only returns a matrix of clm{[EPOCH]}, since there isnt a reason to sync uploads from access"""
392     myClientMatterList = self.RetrieveOfficeCaseList(primaryOffice)
393     daoRSObj = self.MakeNewRSConnection('tbl_ClientDataQuantity')
394     daoRSObj.MoveLast()
395     fullCount = daoRSObj.RecordCount
396     daoRSObj.MoveFirst()
397    
398     caseUploadMatrix = {}
399     for i in range(fullCount):
400     currentClientMatter = daoRSObj.Fields('ClientMatterNum').Value
401     if currentClientMatter in myClientMatterList:
402     epoch = str(daoRSObj.Fields('UEPOCH').Value)
403     try:
404     caseUploadMatrix[currentClientMatter].append(epoch)
405     except:
406     caseUploadMatrix[currentClientMatter] = [epoch]
407     daoRSObj.MoveNext()
408     daoRSObj.Close()
409     return caseUploadMatrix
410    
411     def RetrieveMyCaseUploads(self,empID):
412     """This only returns a matrix of clm{[EPOCH]}, since there isnt a reason to sync uploads from access"""
413     myClientMatterList = self.RetrieveMyCaseList(empID)
414     daoRSObj = self.MakeNewRSConnection('tbl_ClientDataQuantity')
415     daoRSObj.MoveLast()
416     fullCount = daoRSObj.RecordCount
417     daoRSObj.MoveFirst()
418    
419     caseUploadMatrix = {}
420     for i in range(fullCount):
421     currentClientMatter = daoRSObj.Fields('ClientMatterNum').Value
422     if currentClientMatter in myClientMatterList:
423     epoch = daoRSObj.Fields('UEPOCH').Value
424     if epoch:
425     epoch = str(epoch)
426     if '.' in epoch:
427     epoch = epoch.split('.')[0]
428    
429     try:
430     caseUploadMatrix[currentClientMatter].append(epoch)
431     except:
432     caseUploadMatrix[currentClientMatter] = [epoch]
433     #loadedDate = daoRSObj.Fields('DataLoadDate').Value
434     #loadedDate = str(loadedDate.Format('%Y%m%d'))
435     #loadedSize =daoRSObj.Fields('DataLoadedGB').Value
436     #loadedSizeType = " GB"
437     #
438     #if loadedSize:
439     # ## If the GB loaded size exists, use that.
440     # pass
441     #else:
442     # ## if it does not, use the MB loaded field.
443     # loadedSize =daoRSObj.Fields('DataLoadedMB').Value
444     # loadedSizeType = " MB"
445     #loadedSize = str(loadedSize)
446     #if "." in loadedSize:
447     # loadedSize = loadedSize[:loadedSize.index('.')+3]
448     #try:
449     # caseUploadMatrix[currentClientMatter].append((loadedDate,loadedSize+loadedSizeType))
450     #except:
451     # caseUploadMatrix[currentClientMatter] = [(loadedDate,loadedSize+loadedSizeType)]
452     daoRSObj.MoveNext()
453     daoRSObj.Close()
454     return caseUploadMatrix
455    
456     def AddNewCase(self, caseName, CLM, TPM_Name, empID, chargable = False, reviewPlatform = "", responsibleVendor = "", responsibleOffice = ""):
457     """Adds a new case in the access DB."""
458     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData')
459     daoRSObj.AddNew()
460     daoRSObj.Fields('ClientMatterNum').Value = CLM
461     daoRSObj.Fields('CaseName').Value = caseName
462     daoRSObj.Fields('EmpID').Value = empID
463     daoRSObj.Fields('TPM').Value = TPM_Name
464     daoRSObj.Fields('PrimaryOffice').Value = responsibleOffice
465     daoRSObj.Update()
466     daoRSObj.Close()
467    
468     ## Per aaron, add to two other tables
469     clientNumber = CLM.split('.')[0]
470     daoRSObj = self.MakeNewRSConnection('tbl_Ref_Client')
471     try:
472     daoRSObj.AddNew()
473     daoRSObj.Fields('ClientNum').Value = clientNumber
474     daoRSObj.Update()
475     except:
476     pass
477     daoRSObj.Close()
478    
479     daoRSObj = self.MakeNewRSConnection('tbl_Ref_ClientMatter')
480     try:
481     daoRSObj.AddNew()
482     daoRSObj.Fields('ClientNum').Value = clientNumber
483     daoRSObj.Fields('ClientMatterNum').Value = CLM
484     daoRSObj.Update()
485     except:
486     pass
487     daoRSObj.Close()
488    
489     ## These below make their own record sets.
490     if chargable:
491     ## change this one aaron adds it.
492     pass
493     if reviewPlatform:
494     self.UpdateReviewPlatform(CLM, reviewPlatform)
495     if responsibleVendor:
496     self.UpdateResponsibleVendor(CLM,responsibleVendor)
497    
498    
499    
500     def UpdateChargable(self, CLM, chargable):
501     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
502     daoRSObj.Edit()
503     daoRSObj.Fields('BillableMatter').Value = chargable
504     daoRSObj.Update()
505     daoRSObj.Close()
506    
507     def GetChargable(self,CLM):
508     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
509     chargable = daoRSObj.Fields('BillableMatter').Value
510     daoRSObj.Close()
511     return chargable
512 nino.borges 321
513     def UpdateDisclosureLetter(self,CLM, letterSaved, pathToLetter):
514     """Allows you to check or uncheck the state of the disclosure letter and the link to it."""
515     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
516     daoRSObj.Edit()
517     daoRSObj.Fields('DisclosureLetterSaved').Value = letterSaved
518     daoRSObj.Fields('LinktoDisclosureLetter').Value = pathToLetter
519     daoRSObj.Update()
520     daoRSObj.Close()
521 ninoborges 8
522 nino.borges 321 def GetDisclosureLetter(self, CLM):
523     """Returns the state of the saved letter and the path to the disclosure letter"""
524     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
525     letterSaved = daoRSObj.Fields('DisclosureLetterSaved').Value
526     pathToLetter = daoRSObj.Fields('LinktoDisclosureLetter').Value
527     #pathToLetter = "foo"
528     #print letterSaved
529     daoRSObj.Close()
530     return letterSaved,pathToLetter
531    
532 ninoborges 8 def UpdateReviewPlatform(self, CLM, reviewPlatform):
533     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
534     daoRSObj.Edit()
535     daoRSObj.Fields('ReviewPlatform').Value = reviewPlatform
536     daoRSObj.Update()
537     daoRSObj.Close()
538    
539     def GetReviewPlatform(self,CLM):
540     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
541     platform = daoRSObj.Fields('ReviewPlatform').Value
542     daoRSObj.Close()
543     return platform
544    
545     def UpdateResponsibleVendors(self, CLM,responsibleVendorTpl):
546     """VendorTpl should be a tuple of (processing,scanning,hosting) with None if you dont have it"""
547     processingVendor, scanningVendor, hostingVendor = responsibleVendorTpl
548     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
549     if processingVendor:
550     daoRSObj.Edit()
551     daoRSObj.Fields('ProcessingVendor').Value = processingVendor
552     daoRSObj.Update()
553     if scanningVendor:
554     daoRSObj.Edit()
555     daoRSObj.Fields('ScanningVendor').Value = scanningVendor
556     daoRSObj.Update()
557     if hostingVendor:
558     daoRSObj.Edit()
559     daoRSObj.Fields('HostingVendor').Value = hostingVendor
560     daoRSObj.Update()
561     daoRSObj.Close()
562    
563     def GetResponsibleVendorTpl(self, CLM):
564     """Returns a tuple of (processing,scanning,hosting) with None if you dont have it"""
565     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
566     processingVendor = daoRSObj.Fields('ProcessingVendor').Value
567     scanningVendor = daoRSObj.Fields('ScanningVendor').Value
568     hostingVendor = daoRSObj.Fields('HostingVendor').Value
569     daoRSObj.Close()
570     tmpTpl = (processingVendor,scanningVendor,hostingVendor)
571     return tmpTpl
572    
573     def UpdateCaseUpload(self, CLM, reviewPlatform, uploadMatrix):
574     """Format for matrix is epoch is key and uploads are in a tpl. (12/23/2010,49MB) Date format is mm/dd/yyyy"""
575     daoRSObj = self.MakeNewRSConnection('tbl_ClientDataQuantity')
576    
577     ## Dont for get to convert the date first somewhere.
578     for i in uploadMatrix.keys():
579     (date, size) = uploadMatrix[i]
580     daoRSObj.AddNew()
581     daoRSObj.Fields('ClientMatterNum').Value = CLM
582     daoRSObj.Fields('UEPOCH').Value = i
583     daoRSObj.Fields('DataLoadDate').Value = date
584     daoRSObj.Fields('ReviewPlatform').Value = reviewPlatform
585 nino.borges 453
586 ninoborges 8 if "GB" in size:
587     daoRSObj.Fields('dataLoadedGB').Value = float(size.replace("GB",""))
588     elif "MB" in size:
589     daoRSObj.Fields('dataLoadedMB').Value = float(size.replace("MB",""))
590     else:
591 nino.borges 453 if "bytes" in size:
592     size = "1 KB"
593 ninoborges 8 daoRSObj.Fields('DataLoadedKB').Value = float(size.replace("KB",""))
594     daoRSObj.Update()
595     daoRSObj.Close()
596    
597     def DeleteCaseUpload(self,CLM,UEPOCH):
598     """This method will let you delete a single case upload but only if it was added by the MCP.
599     i.e has a UEPOCH"""
600     ## When calling UEPOCHs, dont put it in a ''
601     daoRSObj = self.MakeNewRSConnection('tbl_ClientDataQuantity', specialWhere = "UEPOCH=%s"%UEPOCH)
602     ## WHERE AND is not working so I'm going to have to WHERE for the UEPOCH and then do a quick search for the CLM, to be safe.
603     daoRSObj.MoveLast()
604     recordCount = daoRSObj.RecordCount
605     daoRSObj.MoveFirst()
606     ## This wont allow you to delete if there are multiple records with same UEPOCH
607     if recordCount == 1:
608     val2 = daoRSObj.Fields('ClientMatterNum').Value
609     if val2 == CLM:
610     daoRSObj.Delete()
611     errorRpt = False
612     else:
613     errorRpt = True
614     else:
615     errorRpt = True
616     daoRSObj.Close()
617     #print errorRpt
618     return errorRpt
619 nino.borges 321
620     def GetProducedToEntities(self,CLM):
621     """This will return, for a specific matter, a list of the current 'produced to' options, as kind of a history. """
622     daoRSObj = self.MakeNewRSConnection('Tbl_MatterProductionDetail',
623     specialWhere = "ClientMatterNum='%s'"%CLM)
624     prodToList = []
625     try:
626     daoRSObj.MoveLast()
627     tableHasData = True
628     except:
629     tableHasData = False
630     productionMatrix = {}
631     if tableHasData:
632     fullCount = daoRSObj.RecordCount
633     daoRSObj.MoveFirst()
634     for i in range(fullCount):
635     if daoRSObj.Fields('ProducedTo').Value:
636     productionMatrix[daoRSObj.Fields('ProducedTo').Value] = 1
637     daoRSObj.MoveNext()
638     prodToList = productionMatrix.keys()
639     daoRSObj.Close()
640     return prodToList
641    
642     def GetProductionRequestedByNames(self,CLM):
643     """This will return, for a specific matter, a list of the current 'production requested by names, as kind of a history. """
644     daoRSObj = self.MakeNewRSConnection('Tbl_MatterProductionDetail',
645     specialWhere = "ClientMatterNum='%s'"%CLM)
646     reqByList = []
647     try:
648     daoRSObj.MoveLast()
649     tableHasData = True
650     except:
651     tableHasData = False
652     reqByMatrix = {}
653     if tableHasData:
654     fullCount = daoRSObj.RecordCount
655     daoRSObj.MoveFirst()
656     for i in range(fullCount):
657     if daoRSObj.Fields('RequestedBy').Value:
658     reqByMatrix[daoRSObj.Fields('RequestedBy').Value] = 1
659     daoRSObj.MoveNext()
660     reqByList = reqByMatrix.keys()
661     daoRSObj.Close()
662     return reqByList
663 ninoborges 8
664 nino.borges 321 def UpdateProductionDetail(self, CLM, prodID, prodProcessedDate, begBates,endBates,prodDocCount, prodPageCount, prodNotes, prodTo, prodMedia,prodSource,prodReqBy,prodSentDate,prodMediaPassword):
665 ninoborges 8 """This method will let you add an entire produciton record to the production table. All fields are manadatory.
666     the date is in mm/dd/yyyy format."""
667     try:
668     testdaoRSObj = self.MakeNewRSConnection('Tbl_MatterProductionDetail', specialSelect ="ProductionID",specialWhere = "ClientMatterNum='%s'"%CLM)
669     testdaoRSObj.MoveLast()
670     testRecordCount = testdaoRSObj.RecordCount
671     testdaoRSObj.MoveFirst()
672     prodList = []
673     if testRecordCount:
674     for i in range(testRecordCount):
675     prodList.append(testdaoRSObj.Fields('ProductionID').Value)
676     testdaoRSObj.MoveNext()
677     testdaoRSObj.Close()
678     #print testRecordCount
679     #print prodList
680     if prodID in prodList:
681     prodIncrement = NinoGenTools.Counter(1)
682     prodID = prodID+ "_"+"%0*d"%(4,prodIncrement.count)
683     prodIncrement.inc()
684     while prodID in prodList:
685     prodID = prodID[:-4] +"%0*d"%(4,prodIncrement.count)
686     prodIncrement.inc()
687     except:
688     pass
689    
690     daoRSObj = self.MakeNewRSConnection('Tbl_MatterProductionDetail')
691     daoRSObj.AddNew()
692     daoRSObj.Fields('ClientMatterNum').Value = CLM
693     daoRSObj.Fields('ProductionID').Value = prodID
694 nino.borges 321 daoRSObj.Fields('ProductionComplDate').Value = prodProcessedDate
695 ninoborges 8 daoRSObj.Fields('BegBates').Value = begBates
696     daoRSObj.Fields('EndBates').Value = endBates
697     daoRSObj.Fields('ProdDocCount').Value = prodDocCount
698     daoRSObj.Fields('ProdPageCount').Value = prodPageCount
699     daoRSObj.Fields('Notes').Value = prodNotes
700 nino.borges 321 daoRSObj.Fields('ProducedTo').Value =prodTo
701     daoRSObj.Fields('ProductionMedia').Value =prodMedia
702     daoRSObj.Fields('ProductionSource').Value =prodSource
703     daoRSObj.Fields('RequestedBy').Value =prodReqBy
704     daoRSObj.Fields('ProductionDate').Value =prodSentDate
705     daoRSObj.Fields('ProductionMediaPassword').Value =prodMediaPassword
706 ninoborges 8
707     daoRSObj.Update()
708     daoRSObj.Close()
709    
710     def UpdateResponsibleAttorney(self, CLM, responsibleAttny):
711     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
712     daoRSObj.Edit()
713     daoRSObj.Fields('PrimaryAttorneyContact').Value = responsibleAttny
714     daoRSObj.Update()
715     daoRSObj.Close()
716    
717     def GetResponsibleAttorney(self, CLM):
718     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
719     val = daoRSObj.Fields('PrimaryAttorneyContact').Value
720     daoRSObj.Close()
721     return val
722    
723     def UpdateOtherAttorneys(self,CLM, otherAttorneysList):
724     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
725     daoRSObj.Edit()
726     ## add this when aaron adds it.
727     daoRSObj.Update()
728     daoRSObj.Close()
729    
730     def UpdateResponsibleParalegal(self,CLM, responsibleParalegal):
731     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
732     daoRSObj.Edit()
733     daoRSObj.Fields('ParalegalContact').Value = responsibleParalegal
734     daoRSObj.Update()
735     daoRSObj.Close()
736    
737     def GetResponsibleParalegal(self,CLM):
738     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
739     val = daoRSObj.Fields('ParalegalContact').Value
740     daoRSObj.Close()
741     return val
742    
743     def UpdatePrimaryOffice(self,CLM, primaryOffice):
744     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
745     daoRSObj.Edit()
746     daoRSObj.Fields('PrimaryOffice').Value = primaryOffice
747     daoRSObj.Update()
748     daoRSObj.Close()
749    
750     def GetPrimaryOffice(self,CLM):
751     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
752     val = daoRSObj.Fields('PrimaryOffice').Value
753     daoRSObj.Close()
754     return val
755    
756 nino.borges 459 def UpdateResponsibleTPM(self, CLM, tPMName,empID):
757 ninoborges 8 """Format should be last, first"""
758     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
759     daoRSObj.Edit()
760     daoRSObj.Fields('TPM').Value = tPMName
761 nino.borges 459 daoRSObj.Fields('EmpID').Value = empID
762 ninoborges 8 daoRSObj.Update()
763     daoRSObj.Close()
764    
765     def GetResponsibleTPM(self,CLM):
766     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
767     val = daoRSObj.Fields('TPM').Value
768     daoRSObj.Close()
769     return val
770    
771 nino.borges 462 def GetCasePathStyle(self,CLM):
772     """Returns teh case path style as a OLD/NEW/None denoting if this case uses the new folder pathing"""
773     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
774     val = daoRSObj.Fields('CasePathFolderStyle').Value
775     daoRSObj.Close()
776     return val
777    
778     def UpdateCasePathStyle(self,CLM,style):
779     """Update the case path style as OLD/NEW/None to denote if this case uses the new folder pathing"""
780     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
781     daoRSObj.Edit()
782     daoRSObj.Fields('CasePathFolderStyle').Value = style
783     daoRSObj.Update()
784     daoRSObj.Close()
785    
786 ninoborges 8 def GetCaseStatus(self,CLM):
787     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
788     val = daoRSObj.Fields('ProjectStatus').Value
789     daoRSObj.Close()
790     return val
791    
792     def UpdateCaseStatus(self,CLM,status):
793     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
794     daoRSObj.Edit()
795     daoRSObj.Fields('ProjectStatus').Value = status
796     daoRSObj.Update()
797     daoRSObj.Close()
798    
799     def GetCaseName(self,CLM):
800     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
801     val = daoRSObj.Fields('CaseName').Value
802     daoRSObj.Close()
803     return val
804    
805     def UpdateCaseName(self,CLM,caseName):
806     """This is just the internal name for the case"""
807     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
808     daoRSObj.Edit()
809     daoRSObj.Fields('CaseName').Value = caseName
810     daoRSObj.Update()
811     daoRSObj.Close()
812 nino.borges 343
813     def UpdateClientMatterNum(self,oldCLM,newCLM):
814     """Changes the client matter number for a case"""
815     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%oldCLM)
816     daoRSObj.Edit()
817     daoRSObj.Fields('ClientMatterNum').Value = newCLM
818     daoRSObj.Update()
819     daoRSObj.Close()
820 ninoborges 8
821 nino.borges 232 def GetAlternateMediaPath(self,CLM):
822     """Returns the alternate media path"""
823     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
824     val = daoRSObj.Fields('AlternateMediaPath').Value
825     daoRSObj.Close()
826     return val
827    
828     def UpdateAlternateMediaPath(self,CLM,alternateMediaPath):
829     """Updates the alternate Media Path in the db"""
830     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
831     daoRSObj.Edit()
832     daoRSObj.Fields('AlternateMediaPath').Value = alternateMediaPath
833     daoRSObj.Update()
834     daoRSObj.Close()
835    
836     def GetVendorFolderPath(self,CLM):
837     """Returns the vendor Folder path"""
838     try:
839     daoRSObj = self.MakeNewRSConnection('tbl_VendorFolderPath', specialWhere = "ClientMatterNum='%s'"%CLM)
840     val = daoRSObj.Fields('VendorFolderPath').Value
841     daoRSObj.Close()
842     except:
843     val = None
844     return val
845    
846     def UpdateVendorFolderPath(self,CLM,vendorFolderPath):
847     """Updates the Vendor Folder Path in the db"""
848 nino.borges 303 #print vendorFolderPath
849     try:
850     daoRSObj = self.MakeNewRSConnection('tbl_VendorFolderPath', specialWhere = "ClientMatterNum='%s'"%CLM)
851     daoRSObj.Edit()
852     except:
853     daoRSObj = self.MakeNewRSConnection('tbl_VendorFolderPath')
854     daoRSObj.Edit()
855     daoRSObj.Fields('ClientMatterNum').Value = CLM
856 nino.borges 232 daoRSObj.Fields('VendorFolderPath').Value = vendorFolderPath
857     daoRSObj.Update()
858     daoRSObj.Close()
859 nino.borges 303
860     def GetUploadCostRate(self,CLM):
861     """Returns the upload cost for a case"""
862     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
863     val = daoRSObj.Fields('UploadCost_GB').Value
864     daoRSObj.Close()
865     return val
866 nino.borges 232
867 nino.borges 303 def UpdateUploadCostRate(self,CLM, uploadCost):
868     """Updates the upload cost for a case"""
869     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
870     daoRSObj.Edit()
871     daoRSObj.Fields('UploadCost_GB').Value = uploadCost
872     daoRSObj.Update()
873     daoRSObj.Close()
874    
875     def GetStorageCostRate(self,CLM):
876     """Returns the Storage cost for a case"""
877     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
878     val = daoRSObj.Fields('StorageCost_GB').Value
879     daoRSObj.Close()
880     return val
881    
882     def UpdateStorageCostRate(self,CLM, storageCost):
883     """Updates the upload cost for a case"""
884     daoRSObj = self.MakeNewRSConnection('tbl_MatterTrackingData', specialWhere = "ClientMatterNum='%s'"%CLM)
885     daoRSObj.Edit()
886     daoRSObj.Fields('StorageCost_GB').Value = storageCost
887     daoRSObj.Update()
888     daoRSObj.Close()
889    
890     def GetDefaultUploadCostRate(self, platform = "Relativity"):
891     """Returns the current default upload cost"""
892     if platform == "Relativity":
893     cost = "50"
894     else:
895     cost = "50"
896     return cost
897    
898     def GetDefaultStorageCostRate(self, platform = "Relativity"):
899     """Returns the current default storage cost"""
900     if platform == "Relativity":
901     cost = "20"
902     else:
903     cost = "20"
904     return cost
905    
906 ninoborges 8 class ExpeDatConnection:
907     def __init__(self, platform):
908     if platform == "Relativity":
909     self.initialPath = "Relativity"
910     #self.userName = "eborges"
911     else:
912     self.initialPath = "Concordance Data"
913     #self.userName = "eborgesc"
914    
915     self.userName = "eborges"
916 nino.borges 446 #self.hostName = "@mweftp.litigation.lexisnexis.com"
917 nino.borges 453 self.hostName = "@transfer.mcdermottdiscovery.com"
918 ninoborges 8 self.userPassword = "9atrEFeh"
919     #self.exeLocation = r"C:\Documents and Settings\eborges\My Documents\MyDownloads\ExpDat\movedat.exe"
920 nino.borges 482 win7ExpdtPath = os.path.join(os.getenv('USERPROFILE'),'appdata/local/ExpDat')
921     if os.path.exists(win7ExpdtPath):
922     self.exeLocation = os.path.join(win7ExpdtPath,'movedat.exe')
923     else:
924     self.exeLocation = r"C:\Program Files\ExpDat\movedat.exe"
925 ninoborges 8
926 nino.borges 203 def ListDir(self,path):
927     """Returns the contents of a directory. returns files, dirs."""
928 nino.borges 453 print "debug: listing dir"
929 nino.borges 203 path = os.path.join(self.initialPath,path)
930 nino.borges 453 args = [self.exeLocation,"-K","%s:%s%s:%s"%(self.userName,self.userPassword,self.hostName,path)]
931 nino.borges 203 fnull = open(os.devnull, 'w')
932     process = subprocess.Popen(args,stdout = subprocess.PIPE, stderr = fnull)
933     rawFileList,errCode =process.communicate()
934     rawFileList = rawFileList.split("\n")
935     fileList = []
936     dirList = []
937     if rawFileList:
938     for i in rawFileList:
939     if i:
940     i = i.split(" ")[-1]
941     if i[-1] == "/":
942     dirList.append(i)
943     else:
944     fileList.append(i)
945     fnull.close()
946 nino.borges 453 print "debug: dir listed."
947 nino.borges 203 return fileList, dirList
948 nino.borges 458
949     def ExpeDatWalk(self,top, topdown=True, onerror=None):
950     """
951     Generator that yields tuples of (root, dirs, nondirs).
952     """
953     ## Here I'm creating a generator like os.walk
954    
955     # Make the FTP object's current directory to the top dir.
956     #ftp.cwd(top)
957    
958     # We may not have read permission for top, in which case we can't
959     # get a list of the files the directory contains. os.path.walk
960     # always suppressed the exception then, rather than blow up for a
961     # minor reason when (say) a thousand readable directories are still
962     # left to visit. That logic is copied here.
963     #try:
964     nondirs,dirs = self.ListDir(top)
965     #except os.error, err:
966     # if onerror is not None:
967     # onerror(err)
968     # return
969    
970     if topdown:
971     yield top, dirs, nondirs
972     for entry in dirs:
973     #dname = entry[0]
974     dname = entry
975     path = os.path.join(top, dname)
976     print path
977     #if entry[-1] is None: # not a link
978     for x in self.ExpeDatWalk(path, topdown, onerror):
979     yield x
980     if not topdown:
981     yield top, dirs, nondirs
982    
983 nino.borges 203
984     def GatherFullDirListMatrix(self,vendorFolder):
985     """Returns a matrix of a list path, with all the files and dirs in a vendor folder"""
986 nino.borges 458 ## UPDATE TO USE GENERATOR ABOVE INSTEAD
987 nino.borges 203 fileList,dirList = self.ListDir(vendorFolder)
988     folderMatrix = []
989     currentPath = vendorFolder
990     for indFile in fileList:
991     folderMatrix.append(indFile)
992     #while dirList:
993     for dir in dirList:
994 nino.borges 232 #print dir
995 nino.borges 206 newPath = os.path.join(currentPath, dir)
996 nino.borges 203 print currentPath
997 nino.borges 206 subFileList,subDirList = self.ListDir(newPath)
998 nino.borges 203 newList = []
999     for indFile in subFileList:
1000     newList.append(indFile)
1001 nino.borges 232 #print indFile
1002 nino.borges 203 folderMatrix.append([dir,newList])
1003 nino.borges 232 #print folderMatrix
1004 nino.borges 203 #while dirList:
1005     return folderMatrix
1006    
1007 nino.borges 232 def GatherSize(self,path):
1008     """Returns the size of a given path or archive"""
1009     extension = os.path.splitext(path)[1]
1010     path = os.path.join(self.initialPath,path)
1011     #path = self.initialPath + "/" + path
1012     if extension.upper() == '.ZIP':
1013 nino.borges 453 args = [self.exeLocation,"-D","-K","%s:%s%s:%s=zipsize"%(self.userName,self.userPassword,self.hostName,path)]
1014 nino.borges 232 fnull = open(os.devnull, 'w')
1015     process = subprocess.Popen(args,stdout = subprocess.PIPE, stderr = fnull)
1016     rawFileSize,errCode =process.communicate()
1017     elif extension == "":
1018 nino.borges 453 args = [self.exeLocation,"-K","%s:%s%s:%s=*lr"%(self.userName,self.userPassword,self.hostName,path)]
1019 nino.borges 232 #print args
1020     fnull = open(os.devnull, 'w')
1021     process = subprocess.Popen(args,stdout = subprocess.PIPE, stderr = fnull)
1022     rawDirList,errCode =process.communicate()
1023     rawDirList = rawDirList.split("\n")
1024     rawFileSize = 0
1025     for line in rawDirList[1:]:
1026 nino.borges 453 #print "Debug:" + line
1027 nino.borges 232 if line:
1028     size = line.split("\t")[1]
1029     itemType = line.split("\t")[3]
1030     if itemType == "F":
1031     rawFileSize = rawFileSize + int(size,16)
1032     else:
1033 nino.borges 453 args = [self.exeLocation,"-K","%s:%s%s:%s=*ls"%(self.userName,self.userPassword,self.hostName,path)]
1034 nino.borges 232 #print args
1035     fnull = open(os.devnull, 'w')
1036     process = subprocess.Popen(args,stdout = subprocess.PIPE, stderr = fnull)
1037     rawDirList,errCode =process.communicate()
1038 nino.borges 453 #print rawDirList
1039     #outputFile = open(r"c:\test.txt",'w')
1040     #outputFile.writelines(rawDirList)
1041     #outputFile.close()
1042    
1043     rawDirList = rawDirList.split("\n")[1]
1044     #print rawDirList
1045 nino.borges 232 rawFileSize = 0
1046     if rawDirList:
1047 nino.borges 455 #print "Debug:" + rawDirList
1048 nino.borges 232 size = rawDirList.split("\t")[1]
1049     rawFileSize = int(size,16)
1050     fnull.close()
1051     if rawFileSize:
1052     print "size is %s"%rawFileSize
1053     else:
1054     rawFileSize = False
1055 nino.borges 239 return rawFileSize
1056 nino.borges 232
1057 ninoborges 8 def TestPath(self,path):
1058     """Tests to see if path already exists"""
1059 nino.borges 453 #print "debug: Testing path"
1060 ninoborges 8 path = os.path.join(self.initialPath,path)
1061 nino.borges 453 args = [self.exeLocation,"-K","%s:%s%s:%s"%(self.userName,self.userPassword,self.hostName,path)]
1062 nino.borges 232 #print args
1063 ninoborges 8 fnull = open(os.devnull, 'w')
1064     errCode = subprocess.call(args,stdout = fnull, stderr = fnull)
1065     fnull.close()
1066     if errCode == 0:
1067     return True
1068     if errCode == 25:
1069     return False
1070     else:
1071     print "OTHER ERROR CODE %s. CALL MANNY!"%str(errCode)
1072 nino.borges 453 #print "debug: Testing path done."
1073 ninoborges 8
1074     def CreateNewPath(self,path):
1075     """Creates a new path on the LN system"""
1076     path = os.path.join(self.initialPath,path)
1077 nino.borges 453 #print "debug: creating new path %s"% path
1078     args = [self.exeLocation,"-n","-K","%s:%s%s:%s"%(self.userName,self.userPassword,self.hostName,path)]
1079 ninoborges 8 fnull = open(os.devnull, 'w')
1080     errCode = subprocess.call(args,stdout = fnull, stderr = fnull)
1081     fnull.close()
1082     #return errCode
1083     if errCode == 0:
1084     return True
1085     if errCode == 34:
1086     ## Path already exists
1087     return False
1088     else:
1089     print "OTHER ERROR CODE %s. CALL MANNY!"%str(errCode)
1090 nino.borges 453 #print "debug: new path created."
1091 nino.borges 203
1092     def MoveOnLN(self,absSourcePathAndFile,targetDirAndFile):
1093     """Performs a move from LN to LN"""
1094     targetDirAndFile = os.path.join(self.initialPath,targetDirAndFile)
1095 nino.borges 453 print targetDirAndFile
1096 nino.borges 203 absSourcePathAndFile = os.path.join(self.initialPath,absSourcePathAndFile)
1097 nino.borges 453 print absSourcePathAndFile
1098 nino.borges 203 #targetDir = targetDir + "\\"
1099 nino.borges 453 args = [self.exeLocation,"-m","-K","%s:%s%s:%s"%(self.userName,self.userPassword,self.hostName,absSourcePathAndFile),"%s"%targetDirAndFile]
1100 nino.borges 203 fnull = open(os.devnull, 'w')
1101     errCode = subprocess.call(args,stdout = fnull, stderr = fnull)
1102     fnull.close()
1103     #return errCode
1104     if errCode == 0:
1105     return True
1106     if errCode == 34:
1107     ## Path already exists
1108     return False
1109     else:
1110     print "OTHER ERROR CODE %s. CALL MANNY!"%str(errCode)
1111 ninoborges 8
1112     def CopyToLN(self,absSourcePathAndFile,targetDir):
1113     """copies absPath to LN. targetDir should be a dir not a file."""
1114     ## Expedat requires that if it's a target dir, you end it in a trailing slash
1115     targetDir = os.path.join(self.initialPath,targetDir)
1116     targetDir = targetDir + "\\"
1117 nino.borges 453 args = [self.exeLocation,"-K",absSourcePathAndFile,"%s:%s%s:%s"%(self.userName,self.userPassword,self.hostName,targetDir)]
1118 ninoborges 8 fnull = open(os.devnull, 'w')
1119     errCode = subprocess.call(args,stdout = fnull, stderr = fnull)
1120     fnull.close()
1121     #return errCode
1122     if errCode == 0:
1123     return True
1124     if errCode == 25:
1125     """The target path does not exist"""
1126     return False
1127     elif errCode == 29:
1128     """The source file or path does not exist"""
1129     return False
1130     else:
1131     print "OTHER ERROR CODE %s. CALL MANNY!"%str(errCode)
1132    
1133     class MweFtpConnection:
1134     def __init__(self):
1135     self.userName = "eborges"
1136     self.hostName = "disftp.mwe.com"
1137     self.userPassword = "rever78"
1138     self.connection = ftplib.FTP_TLS(self.hostName)
1139     self.connection.login(self.userName,self.userPassword)
1140     self.connection.prot_p()
1141    
1142     def TestPath(self,path):
1143     startDir = self.connection.pwd()
1144     try:
1145     self.connection.cwd(path)
1146     sucess = True
1147     except:
1148     sucess = False
1149     self.connection.cwd(startDir)
1150     return sucess
1151    
1152     def CreateNewPath(self,path):
1153     self.connection.mkd(path)
1154    
1155     def CopyToDis(self,absSourcePathAndFile,targetDir):
1156     startDir = self.connection.pwd()
1157     fileName = os.path.split(absSourcePathAndFile)[1]
1158     self.connection.cwd(targetDir)
1159     activePackage = open(absSourcePathAndFile,'rb')
1160     self.connection.storbinary("STOR %s"%fileName,activePackage)
1161     activePackage.close()
1162     self.connection.cwd(startDir)
1163    
1164     def CloseConnection(self):
1165     self.connection.close()