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: 343
Committed: Thu Apr 25 12:54:55 2013 UTC (12 years, 11 months ago) by nino.borges
Content type: text/x-python
Original Path: Python/NinoCode/Active_prgs/MCP/MCP_Lib.py
File size: 45051 byte(s)
Log Message:
Adding case name editing ability

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