ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/ns_dev/Python/NinoCode/Active_prgs/MCP/Trunk/MCP_Console.py
Revision: 531
Committed: Thu Mar 13 19:08:47 2014 UTC (12 years ago) by nino.borges
Content type: text/x-python
File size: 39992 byte(s)
Log Message:
Finished adding the manager reporting and the expanded cost updating.

File Contents

# User Rev Content
1 ninoborges 8 """
2    
3     MCP_Console
4    
5     Created by
6     Emanuel Borges
7     08.28.2010
8    
9     This will be the interface to add, edit and archive cases.
10    
11     Should this work as one large GUI and you pick the below or read from argv and let you
12     just call it with what you want, making these three look like separate apps.
13    
14    
15     """
16    
17 nino.borges 531 import MCP_Lib,os,shutil,ConcordanceHelperTools, time,directorySize2,MCP_Reporting
18 ninoborges 8
19     class MainConsole:
20     def __init__(self):
21     ## Gather the case list
22    
23     print "connecting to matter tracking access db..."
24     ## Production version
25     self.accessDB = MCP_Lib.AccessDBConnection(r"\\chiads01\app\DS_CaseTrack\TPM_CaseTracking.mdb")
26 nino.borges 459 self.fullTPMMatrix = self.accessDB.RetrieveAllTPMMatrix()
27 ninoborges 8 self.tPMName, self.tPMID, self.tPMOffice = MCP_Lib.GetTPMInfo()
28 nino.borges 189 #responsibleCases,casesDir = MCP_Lib.GetCaseList('',self.accessDB)
29 nino.borges 462 myCases, myActiveCases,officeCases, allCases,casesDir, casePathStyleMatrix= MCP_Lib.GetCaseList('',self.accessDB)
30 ninoborges 8
31     ## Testing version
32     #self.accessDB = MCP_Lib.AccessDBConnection(r"W:\Manny\testing\TPM_CaseTracking.mdb")
33     #responsibleCases,casesDir = MCP_Lib.GetCaseList(r"C:\Documents and Settings\eborges\My Documents\My Dropbox\Dev\Python\NinoCode\Active_prgs\Concordance\MCP",self.accessDB)
34     #self.tPMName, self.tPMID, self.tPMOffice = MCP_Lib.GetTPMInfo(r"C:\Documents and Settings\eborges\My Documents\My Dropbox\Dev\Python\NinoCode\Active_prgs\Concordance\MCP")
35    
36     print "connected to DB."
37    
38 nino.borges 189 self.responsibleCasesList = myCases
39 ninoborges 8 self.casesDir = casesDir
40    
41    
42     def AddNewCase(self, caseName, clientMatter, chargable = False, reviewPlatform = "", responsibleProcessingVendor = "",
43     responsibleScanningVendor = "",responsibleHostingVendor = ""):
44 nino.borges 343 ## TODO: add a verification somehwere where it verify that the proposed name does not include characters that cant be used in a folder name.
45 ninoborges 8 ## Add the local folders The GUI should test that the clm is 10 digits and has hyphen.
46     template = os.path.join(self.casesDir,'_Template_')
47     new = os.path.join(self.casesDir, caseName + '_(%s)'%clientMatter)
48     if os.path.exists(new):
49     print "ERROR: This case already exists!!"
50     else:
51     #print template
52     #print new
53     os.mkdir(new)
54     for file in os.listdir(template):
55     shutil.copy2(os.path.join(template,file),new)
56     ## Check the H drive for the supplemental folders and the matter folder, only if they select Concordance.
57     self.SetCaseNameAndCLM(caseName,clientMatter)
58 nino.borges 468 #print "DEBUG: %s"% caseName
59     #print "DEBUG: %s"% clientMatter
60 ninoborges 8 self.AddCaseToAccessDB(caseName,clientMatter)
61    
62 nino.borges 343 def ChangeCaseName(self,caseName,newCaseName,newClientMatter):
63     """This method will allow for editing the case name and number. This is different than settign the casename"""
64     ## Test that there is only one entry for this clm in access.
65     clientMatter = caseName.split("_(")[1]
66     clientMatter = clientMatter[:-1]
67     clientMatter = clientMatter.replace('-','.')
68     accessCaseName = self.accessDB.GetCaseName(clientMatter)
69     localCasesPath = self.casesDir
70     if os.path.exists(os.path.join(localCasesPath,caseName)):
71     if clientMatter != newClientMatter:
72     if newCaseName != caseName.split("_("):
73     ## change both
74     self.accessDB.UpdateCaseName(clientMatter,newCaseName)
75     self.accessDB.UpdateClientMatterNum(clientMatter,newClientMatter)
76     os.rename(os.path.join(localCasesPath,caseName),os.path.join(localCasesPath,newCaseName + '_(%s)'%newClientMatter.replace(".","-")))
77     else:
78     ## change just client matter
79     self.accessDB.UpdateClientMatterNum(clientMatter,newClientMatter)
80     os.rename(os.path.join(localCasesPath,caseName),os.path.join(localCasesPath,caseName + '_(%s)'%newClientMatter.replace(".","-")))
81     elif newCaseName != caseName.split("_("):
82     ## change just the casename
83     self.accessDB.UpdateCaseName(clientMatter,newCaseName)
84     os.rename(os.path.join(localCasesPath,caseName),os.path.join(localCasesPath,newCaseName + '_(%s)'%clientMatter.replace(".","-")))
85    
86     ## verify that the proposed name does not include characters that cant be used in a folder name.
87     ## Change the name and or clm in access
88    
89     ## Test that it was changed in access
90     ## change the folder name in cases.
91     else:
92     ## That case dir cant be found. They can't change other's casenames.
93     err = 1
94    
95    
96 nino.borges 476 def AddCaseToAccessDB(self, caseName,clientMatter):
97 ninoborges 8 ## First test to see if it's already in the DB.
98     fullClientMatterList = self.accessDB.RetrieveAllCaseList()
99     clientMatter = clientMatter.replace("-",".")
100     if clientMatter in fullClientMatterList:
101     print "This client matter already exists in the database. Skipping."
102     else:
103     print "New client matter. Adding."
104     self.accessDB.AddNewCase(caseName, clientMatter, self.tPMName,self.tPMID,responsibleOffice = self.tPMOffice)
105     print "Added!"
106    
107 nino.borges 464 def EditCaseData(self,caseName,chargeableBool,respAttorney,respParalegal,respVendorTpl,revPlatform,respTPM,respOffice, caseStatus, casePathStyle):
108 ninoborges 8 clientMatter = caseName.split("_(")[1]
109     clientMatter = clientMatter[:-1]
110     clientMatter = clientMatter.replace('-','.')
111 nino.borges 459 empID = self.fullTPMMatrix[respTPM][0]
112 ninoborges 8 self.accessDB.UpdateChargable(clientMatter,chargeableBool)
113     self.accessDB.UpdateResponsibleAttorney(clientMatter,respAttorney)
114     self.accessDB.UpdateResponsibleParalegal(clientMatter,respParalegal)
115     self.accessDB.UpdateReviewPlatform(clientMatter,revPlatform)
116 nino.borges 459 self.accessDB.UpdateResponsibleTPM(clientMatter,respTPM,empID)
117 ninoborges 8 self.accessDB.UpdatePrimaryOffice(clientMatter,respOffice)
118     self.accessDB.UpdateResponsibleVendors(clientMatter,respVendorTpl)
119     self.accessDB.UpdateCaseStatus(clientMatter, caseStatus)
120 nino.borges 464 self.accessDB.UpdateCasePathStyle(clientMatter,casePathStyle)
121 ninoborges 8 def GetCaseData(self, caseName):
122     #use this to get the data on the selected case, to populate your GUI
123     clientMatter = caseName.split("_(")[1]
124     clientMatter = clientMatter[:-1]
125     clientMatter = clientMatter.replace('-','.')
126     chargeableBool = self.accessDB.GetChargable(clientMatter)
127     respAttorney = self.accessDB.GetResponsibleAttorney(clientMatter)
128     respParalegal = self.accessDB.GetResponsibleParalegal(clientMatter)
129     respVendorTpl = self.accessDB.GetResponsibleVendorTpl(clientMatter)
130     revPlatform = self.accessDB.GetReviewPlatform(clientMatter)
131     respTPM = self.accessDB.GetResponsibleTPM(clientMatter)
132     respOffice = self.accessDB.GetPrimaryOffice(clientMatter)
133     caseStatus = self.accessDB.GetCaseStatus(clientMatter)
134 nino.borges 303 uploadCost = self.accessDB.GetUploadCostRate(clientMatter)
135     storageCost = self.accessDB.GetStorageCostRate(clientMatter)
136 nino.borges 321 disclosureLetterBool,disclosureLetterPath = self.accessDB.GetDisclosureLetter(clientMatter)
137 nino.borges 464 casePathStyle = self.accessDB.GetCasePathStyle(clientMatter)
138     return (chargeableBool,respAttorney,respParalegal,respVendorTpl,revPlatform,respTPM,respOffice,caseStatus,uploadCost,storageCost,disclosureLetterBool,casePathStyle)
139 nino.borges 321
140 nino.borges 489 def GetFullCLMList(self):
141     """Returns the full list of client matters for every case in Access"""
142     fullList = self.accessDB.RetrieveAllCaseList()
143     return fullList
144    
145 nino.borges 321 def GetPossibleProducedToEntities(self,caseName):
146     """Returns the possible produced to entities for a case"""
147     clientMatter = caseName.split("_(")[1]
148     clientMatter = clientMatter[:-1]
149     clientMatter = clientMatter.replace('-','.')
150     possibleProducedToEntities = self.accessDB.GetProducedToEntities(clientMatter)
151     return possibleProducedToEntities
152    
153     def GetPossibleProdReqByNames(self,caseName):
154     """Returns the possible requested by names for a case"""
155     clientMatter = caseName.split("_(")[1]
156     clientMatter = clientMatter[:-1]
157     clientMatter = clientMatter.replace('-','.')
158     possibleProdReqByNames = self.accessDB.GetProductionRequestedByNames(clientMatter)
159     return possibleProdReqByNames
160 ninoborges 8
161 nino.borges 321
162     def AddProductionEntry(self, CLM,prodID,prodProcessedDate,begBates,endBates,prodDocCount, prodPageCount, prodNotes, prodTo, prodMedia,prodSource,prodReqBy,prodSentDate,prodMediaPassword):
163 ninoborges 8 """This method adds one production entry to the case."""
164     errRpt = True
165     if CLM:
166     if prodID:
167 nino.borges 321 if prodProcessedDate:
168 ninoborges 8 if begBates:
169     if endBates:
170     if prodDocCount:
171     if prodPageCount:
172     if prodNotes:
173 nino.borges 321 self.accessDB.UpdateProductionDetail(CLM,prodID,prodProcessedDate,begBates,endBates,prodDocCount, prodPageCount, prodNotes, prodTo, prodMedia,prodSource,prodReqBy,prodSentDate,prodMediaPassword)
174 ninoborges 8 errRpt = False
175     return errRpt
176    
177     def AddDataUpload(self,CLM, reviewPlatform, reportSize):
178     """This method will add one case upload."""
179     ## TODO: one day change it so that copy up requst calls this instead
180     ## of it being internal to that prog.
181     epoch = str(int(time.time()))
182     self.accessDB.UpdateCaseUpload(CLM,reviewPlatform,{epoch:(time.strftime('%m/%d/%Y'),reportSize)})
183    
184     def RemoveDataUpload(self,CLM,UEPOCH):
185     """This method calls DeleteCaseUpload and removes just one case upload. """
186     err = self.accessDB.DeleteCaseUpload(CLM,UEPOCH)
187     if err:
188     print "ERROR: An Error occured and this value was not removed!"
189     else:
190     print "%s Removed"% UEPOCH
191    
192     def GetUploadData(self, caseName):
193     # Used to get upload data, on the selected case, to populate the upload dialog
194     clientMatter = caseName.split("_(")[1]
195     clientMatter = clientMatter[:-1]
196     clientMatter = clientMatter.replace('-','.')
197     uploadList = self.accessDB.RetrieveUploadsByCLM(clientMatter)
198     return uploadList
199    
200     def GetProductionData(self,caseName):
201     clientMatter = caseName.split("_(")[1]
202     clientMatter = clientMatter[:-1]
203     clientMatter = clientMatter.replace('-','.')
204 nino.borges 321 productionMatrix = self.accessDB.RetrieveProductionsByCLM(clientMatter)
205     return productionMatrix
206 ninoborges 8
207     def GetProductionTotal(self,productionList):
208     """Using the above productionList, this returns the total docs and pages produced"""
209     pgCountTotal = 0
210     docCountTotal = 0
211     for i in productionList:
212 nino.borges 321 pageCount = i[-7]
213     docCount = i[-8]
214 ninoborges 8 if 'None' in pageCount:
215     pass
216     else:
217     #print pageCount
218     pgCountTotal = pgCountTotal+int(pageCount)
219     if 'None' in pageCount:
220     pass
221     else:
222     #print docCount
223     docCountTotal = docCountTotal+int(docCount)
224     return pgCountTotal,docCountTotal
225    
226     def ExportProductionDataToExcel(self,CaseName,pathToCSV):
227     """Exports the production data to a csv file"""
228     productionList = self.GetProductionData(CaseName)
229     #print productionList
230     outputFile = open(pathToCSV,'w')
231 nino.borges 321 outputFile.write('Production ID,Production Completed Date,Production Sent Date,Start Bates,End Bates,Document Count,Page Count,Produced To,Requested By,Production Media,ProductionMediaPassword,Production Sources,Notes\n')
232 ninoborges 8 for i in productionList:
233     for x in i:
234     outputFile.write(x+",")
235     outputFile.write("\n")
236     outputFile.close()
237    
238     def GetUploadTotal(self,uploadList):
239     """ Using the above uploadList, this will return the total uploaded """
240     count = 0.
241     for i in uploadList:
242     size = i[-1]
243    
244     if 'None' in size:
245     pass
246     else:
247     rawSize = directorySize2.prettyToUnpretty_Filesize(size)
248     count = count + rawSize
249     prettySizeFinal = directorySize2.pretty_filesize2(count)
250     return prettySizeFinal
251    
252 nino.borges 459
253     def TransferCase(self, caseName, sourceTpm, targetTpm):
254     """Transfers case to another TPM"""
255     sourceTPMOffice = self.fullTPMMatrix[sourceTpm][1]
256     targetTPMOffice = self.fullTPMMatrix[targetTpm][1]
257     ## Confirm that folder exists
258     print "Confirming folder exists..."
259     caseFolderLocation = MCP_Lib.GetOtherCaseFolder(sourceTPMOffice)
260     targetCaseFolderLocation = MCP_Lib.GetOtherCaseFolder(targetTPMOffice)
261    
262     clientMatter = caseName.split("_(")[1]
263     clientMatter = clientMatter[:-1]
264     if "." in clientMatter:
265     clientMatter = clientMatter.replace('.','-')
266     folderMatrix = {}
267     #caseFolderLocation = os.path.join(caseFolderLocation,case)
268     err = False
269     if caseFolderLocation:
270     if os.path.exists(caseFolderLocation):
271     for f in os.listdir(caseFolderLocation):
272     if "_(" in f:
273     folderClientMatter = f.split("_(")[1]
274     folderClientMatter = folderClientMatter[:-1]
275     folderMatrix[folderClientMatter] = f
276     try:
277     folderName = folderMatrix[clientMatter]
278     fullCasePath = os.path.join(caseFolderLocation, folderName)
279     except:
280     err = True
281     else:
282     err = True
283     else:
284     print "A case folder for this case was not found."
285     err = True
286     if err:
287     print "Transfer aborted"
288     else:
289     if os.path.exists(fullCasePath):
290     print "Folder exists."
291     ## Check that target folder does not exist, support same office transfer.
292     print "Testing target directory..."
293     fullTargetCasePath = os.path.join(targetCaseFolderLocation, folderName)
294     if sourceTPMOffice == targetTPMOffice:
295     ## This is an inter office transfer, which is okay but dont move folders
296     pass
297     else:
298     if os.path.exists(fullTargetCasePath):
299     err = True
300     print "This case folder already exists."
301     else:
302     ## First move the folder to the new location
303     try:
304     print "moving %s to %s"%(fullCasePath,fullTargetCasePath)
305     shutil.move(fullCasePath,fullTargetCasePath)
306     except:
307     err = True
308     print "The move failed!"
309     if os.path.exists(fullTargetCasePath):
310     print "Case folder moved."
311     if err:
312     print "Transfer aborted"
313     else:
314     ## Change the info in Access
315     #print targetTPMOffice
316     self.accessDB.UpdatePrimaryOffice(clientMatter.replace('-','.'),targetTPMOffice)
317     self.accessDB.UpdateResponsibleTPM(clientMatter.replace('-','.'),targetTpm,self.fullTPMMatrix[targetTpm][0])
318     print "Case Transfer Completed."
319     return err
320    
321 ninoborges 8 def MakeCaseDormant(self, caseAndCLM):
322     """Moves the case to the Dormant folder"""
323 nino.borges 456 ## Dont do this, just hide from your view. Once archived, move off share.
324 ninoborges 8 print "Making %s case dormant..."
325     os.rename(os.path.join(self.casesDir,caseAndCLM),os.path.join(self.casesDir,os.path.join('zzzz_dormant_', caseAndCLM)))
326     print "Case has been archived."
327    
328    
329 nino.borges 158 def ViewCaseNotes(self,caseName,office):
330     """Trys to open the case notes file,in the case folder, for the active case, regardless who owns it."""
331     caseFolderLocation = MCP_Lib.GetOtherCaseFolder(office)
332     clientMatter = caseName.split("_(")[1]
333     clientMatter = clientMatter[:-1]
334     if "." in clientMatter:
335     clientMatter = clientMatter.replace('.','-')
336     folderMatrix = {}
337     #caseFolderLocation = os.path.join(caseFolderLocation,case)
338     err = False
339     if caseFolderLocation:
340     if os.path.exists(caseFolderLocation):
341     for f in os.listdir(caseFolderLocation):
342     if "_(" in f:
343     folderClientMatter = f.split("_(")[1]
344     folderClientMatter = folderClientMatter[:-1]
345     folderMatrix[folderClientMatter] = f
346     try:
347     folderName = folderMatrix[clientMatter]
348     os.startfile(os.path.join(caseFolderLocation, folderName)+"/Gen_Notes.txt")
349     except:
350     err = True
351     else:
352     err = True
353     else:
354     print "A case folder for this case was not found."
355     err = True
356     return err
357    
358     def ViewProdSpec(self,caseName,office):
359     """Trys to open the prod spec file,in the case folder, for the active case, regardless who owns it."""
360     caseFolderLocation = MCP_Lib.GetOtherCaseFolder(office)
361     clientMatter = caseName.split("_(")[1]
362     clientMatter = clientMatter[:-1]
363     if "." in clientMatter:
364     clientMatter = clientMatter.replace('.','-')
365     folderMatrix = {}
366     #caseFolderLocation = os.path.join(caseFolderLocation,case)
367     err = False
368     if caseFolderLocation:
369     if os.path.exists(caseFolderLocation):
370     for f in os.listdir(caseFolderLocation):
371     if "_(" in f:
372     folderClientMatter = f.split("_(")[1]
373     folderClientMatter = folderClientMatter[:-1]
374     folderMatrix[folderClientMatter] = f
375     try:
376     folderName = folderMatrix[clientMatter]
377     os.startfile(os.path.join(caseFolderLocation, folderName+"/Production_Spec.txt"))
378     except:
379     err = True
380     else:
381     err = True
382     else:
383     print "A case folder for this case was not found."
384     err = True
385     return err
386    
387 nino.borges 464 #def CreateCasePathStyleFolders(self,platform,clientMatter):
388     # """This method will create the "new style" case folder paths for a case on IDS"""
389     # ## make sure that the CLMFolderPath exists, else make the folders needed to make it exist.
390     # CLMFolderPath = ConcordanceHelperTools.ParseClientMatterRemote(clientMatter)
391     #
392     # expeObj = MCP_Lib.ExpeDatConnection(platform)
393     #
394     # ## Test each folder, and subfolder, on the new style spec to see if they are there, if not create them.
395     # newStyleFolderPathList = [
396     # "Productions\\MWE_Client\\Backloads",
397     # "Productions\\MWE_Client\\Exports",
398     # "Productions\\Other_Party",
399     # "Review_Docs\\Hard_Copy",
400     # "Review_Docs\\Loose",
401     # "Review_Docs\\Processed_Data",
402     # "Review_Docs\\TIFs",
403     # "Working"
404     # ]
405     # for pathPart in newStyleFolderPathList:
406     # newLocation = os.path.join(CLMFolderPath,pathPart)
407     # pathExists = expeObj.TestPath(newLocation)
408     # tempPath = newLocation
409     # pathRemainingList = []
410     # while pathExists == False:
411     # tempPath, tempPart = os.path.split(tempPath)
412     # pathRemainingList.append(tempPart)
413     # pathExists = expeObj.TestPath(tempPath)
414     # if pathRemainingList:
415     # pathRemainingList.reverse()
416     # #print pathRemainingList
417     # for pathPiece in pathRemainingList:
418     # tempPath = os.path.join(tempPath,pathPiece)
419     # expeObj.CreateNewPath(tempPath)
420     # print "DEBUG: testing password file"
421     # pathExists = expeObj.TestPath(os.path.join(CLMFolderPath,"Productions\\MWE_Client\\Exports\\_passwords.txt"))
422     # if pathExists:
423     # print "DEBUG: file already exists"
424     # else:
425     # pw_file = open(os.path.join(os.getenv('TEMP'),"_passwords.txt"),'w')
426     # pw_file.close()
427     # expeObj.CopyToLN(os.path.join(os.getenv('TEMP'),"_passwords.txt",),os.path.join(CLMFolderPath,"Productions\\MWE_Client\\Exports"))
428     #
429 nino.borges 462
430 nino.borges 321 def CreateProductionReport(self,caseName,office):
431     """Creates a html production report in the altMediaPath folder"""
432     err = False
433 nino.borges 261 clientMatter = caseName.split("_(")[1]
434     clientMatter = clientMatter[:-1]
435     clientMatter = clientMatter.replace('-','.')
436     altMediaPath = self.accessDB.GetAlternateMediaPath(clientMatter)
437 nino.borges 321 productionMatrix = self.GetProductionData(caseName)
438     if os.path.exists(os.path.join(altMediaPath,'__MCP_Data')):
439     pass
440     else:
441     os.mkdir(os.path.join(altMediaPath,'__MCP_Data'))
442     reportFile = open(os.path.join(os.path.join(altMediaPath,'__MCP_Data'),'MCP_Production_Report.html'),'w')
443     reportFile.write('''<html>\n<head>\n <title>MCP: %s Production Report</title>\n <style type="text/css" media="screen">\n\n'''%caseName)
444     reportFile.write(r'''div#Rsidebar {
445     float: right;
446     width: 20%;
447     }
448     div#Lsidebar {
449     float: left;
450     width:20%;
451     height:380px;
452     }
453    
454     </style>''')
455     reportFile.write('''
456     <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
457     <meta name="author" content="Emanuel Borges">
458     </head>
459     <body>
460    
461     <h3><br>
462     </h3>
463     <center><h2>%s Production Report</h2></center>'''%caseName)
464     reportFile.write(r'''<center><hr width="40%"></center>''')
465     for k in productionMatrix.keys():
466     productionList = productionMatrix[k]
467     reportFile.write("<h4>%s Productions</h3>" % k)
468     reportFile.write('''<center><table border=1 cellspacing=0 cellpadding=5 width=1800>\n<tr><th>Production ID</th><th>Processed Date</th><th>Sent Date</th><th>Start Bates</th><th>End Bates</th><th>Document Count</th><th>Page Count</th><th>Requested By</th><th>Production Media</th><th>Media Password</th><th>Production Sources</th><th>Notes</th></tr>''')
469     for i in productionList:
470     reportFile.write("<tr>")
471     count = 1
472     for x in i:
473     if count == 8:
474     count = count + 1
475     else:
476     reportFile.write("<td>%s</td>"%x)
477     count = count +1
478     reportFile.write("</tr>")
479    
480     reportFile.write('</table></center>\n\n')
481     reportFile.write('''<div id="footer">
482     <p><span>&copy; 2012 <a href="#">Emanuel Borges</a></span><br />
483     Website automatically generated by the MCP program.</p></div>''')
484     reportFile.write('</body></html>\n')
485     reportFile.close()
486     return err
487 nino.borges 531 def CreateManagerReport(self,report,tpm):
488     """Creates and launches a manager report"""
489     reportObj = MCP_Reporting.Reports(self.accessDB)
490     if report == 'Active Cases':
491     try:
492     activeCases,reportFile = reportObj.CreateTpmActiveCaseReport(tpm)
493     os.startfile(reportFile)
494     err = False
495     except:
496     err = True
497     elif report == 'All Cases':
498     try:
499     activeCases,reportFile = reportObj.CreateTpmAllCaseReport(tpm)
500     os.startfile(reportFile)
501     err = False
502     except:
503     err = True
504     else:
505     try:
506     activeCases,reportFile = reportObj.CreateUnassignedCaseReport()
507     os.startfile(reportFile)
508     err = False
509     except:
510     err = True
511     return err
512    
513 nino.borges 321 def OpenAlternateMediaFolder(self,caseName,office,testOnly=False):
514     """Trys to open the Alternate media folder, for the active case, regardless who owns it.
515     If testOnly is set to True, it will only test that it exists and not open the folder."""
516     clientMatter = caseName.split("_(")[1]
517     clientMatter = clientMatter[:-1]
518     clientMatter = clientMatter.replace('-','.')
519     altMediaPath = self.accessDB.GetAlternateMediaPath(clientMatter)
520 nino.borges 261 err = False
521     if altMediaPath:
522     if os.path.exists(altMediaPath):
523 nino.borges 321 if testOnly:
524     pass
525     else:
526     os.startfile(altMediaPath)
527 nino.borges 261 else:
528     print "An alternate media folder for this case was not found."
529     err = True
530     else:
531     err = True
532     return err
533 nino.borges 265
534     def SetAlternateMediaFolder(self,caseName,altMediaPath):
535     """Sets the alternate Media Path"""
536     clientMatter = caseName.split("_(")[1]
537     clientMatter = clientMatter[:-1]
538     clientMatter = clientMatter.replace('-','.')
539     self.accessDB.UpdateAlternateMediaPath(clientMatter,altMediaPath)
540 nino.borges 261
541 nino.borges 269 def GetVendorFolders(self,caseName):
542 nino.borges 271 """Returns the current list of vendor folders, for one case"""
543 nino.borges 269 clientMatter = caseName.split("_(")[1]
544     clientMatter = clientMatter[:-1]
545     clientMatter = clientMatter.replace('-','.')
546     vendorFolders = self.accessDB.GetVendorFolderPath(clientMatter)
547 nino.borges 271 #print "V%s "%vendorFolders
548 nino.borges 269 return vendorFolders
549 nino.borges 271
550     def SetVendorFolders(self,caseName, vendorFolders):
551     """Sets the Vendor Folder"""
552     clientMatter = caseName.split("_(")[1]
553     clientMatter = clientMatter[:-1]
554     clientMatter = clientMatter.replace('-','.')
555     self.accessDB.UpdateVendorFolderPath(clientMatter,vendorFolders)
556    
557     def GetVendorFoldersList(self):
558     """Returns a list of all vendorFolders"""
559     ## Change this so that it actually grabs the current ones from ln. Dont know if I should grab from a table in access.
560     vendorFolderList = ["None"]
561     for n in range(1,61):
562     vendorFolderList.append("mwevendor%0*d"%(2,n))
563     return vendorFolderList
564 nino.borges 321
565     def GetDisclosureLetterData(self,caseName):
566     """Returns the the bool of if a case has a disclosure letter and if so the path."""
567     clientMatter = caseName.split("_(")[1]
568     clientMatter = clientMatter[:-1]
569     clientMatter = clientMatter.replace('-','.')
570     disclosureLetterSet, disclosureLetterPath = self.accessDB.GetDisclosureLetter(clientMatter)
571     return disclosureLetterSet, disclosureLetterPath
572    
573     def SetDisclosureLetterData(self,caseName,disclosureLetterPath):
574     """Sets the disclosure letter path and checks it as true in the database"""
575     clientMatter = caseName.split("_(")[1]
576     clientMatter = clientMatter[:-1]
577     clientMatter = clientMatter.replace('-','.')
578     self.accessDB.UpdateDisclosureLetter(clientMatter,True,disclosureLetterPath)
579    
580 nino.borges 262 def GetCasePathsData(self,caseName, office):
581     clientMatter = caseName.split("_(")[1]
582     clientMatter = clientMatter[:-1]
583     clientMatter = clientMatter.replace('-','.')
584     altMediaPath = self.accessDB.GetAlternateMediaPath(clientMatter)
585     caseFolderLocation = MCP_Lib.GetOtherCaseFolder(office)
586     caseFolderLocation = os.path.join(caseFolderLocation,caseName)
587     return altMediaPath, caseFolderLocation
588 nino.borges 303
589 nino.borges 531 def GetDefaultPricingData(self):
590     """Returns a tuple with current defaults for all chargebale items"""
591     defaultStorageCosts = self.accessDB.GetDefaultStorageCostRate()
592     defaultUploadCost = self.accessDB.GetDefaultUploadCostRate()
593     defaultOcrCost = self.accessDB.GetDefaultOcrCostRate()
594     defaultAnalyticsCost = self.accessDB.GetDefaultAnalyticsCostRate()
595     defaultMweProcessingCost = self.accessDB.GetDefaultMweProcessingCostRate()
596     defaultTiffingCost = self.accessDB.GetDefaultTiffingCostRate()
597     return defaultStorageCosts,defaultUploadCost,defaultOcrCost,defaultAnalyticsCost,defaultMweProcessingCost,defaultTiffingCost
598    
599     def GetCurrentPrices(self,caseName):
600     clientMatter = caseName.split("_(")[1]
601     clientMatter = clientMatter[:-1]
602     clientMatter = clientMatter.replace('-','.')
603     ocrCost = self.accessDB.GetOcrCostRate(clientMatter)
604     analyticsCost = self.accessDB.GetAnalyticsCostRate(clientMatter)
605     mweProcessingCost = self.accessDB.GetMweProcessingCostRate(clientMatter)
606     tiffingCost = self.accessDB.GetTiffingCostRate(clientMatter)
607     return ocrCost,analyticsCost,mweProcessingCost,tiffingCost
608    
609     def SetOtherCosts(self,caseName,ocrCost,analyticsCost,mweProcessingCost,tiffingCost):
610     """Sets the other costs."""
611     clientMatter = caseName.split("_(")[1]
612     clientMatter = clientMatter[:-1]
613     clientMatter = clientMatter.replace('-','.')
614     if ocrCost:
615     self.accessDB.UpdateOcrCostRate(clientMatter,ocrCost)
616     if analyticsCost:
617     self.accessDB.UpdateAnalyticsCostRate(clientMatter,analyticsCost)
618     if mweProcessingCost:
619     self.accessDB.UpdateMweProcessingCostRate(clientMatter,mweProcessingCost)
620     if tiffingCost:
621     self.accessDB.UpdateTiffingCostRate(clientMatter,tiffingCost)
622    
623 nino.borges 303 def SetUploadAndStorageCosts(self, caseName,uploadCost,storageCost):
624     clientMatter = caseName.split("_(")[1]
625     clientMatter = clientMatter[:-1]
626     clientMatter = clientMatter.replace('-','.')
627 nino.borges 321 if uploadCost:
628     self.accessDB.UpdateUploadCostRate(clientMatter,uploadCost)
629     if storageCost:
630     self.accessDB.UpdateStorageCostRate(clientMatter,storageCost)
631 nino.borges 262
632 ninoborges 8 def OpenCaseFolder(self,caseName,office):
633     """Trys to open the case folder for the active case, regardless who owns it."""
634     caseFolderLocation = MCP_Lib.GetOtherCaseFolder(office)
635     clientMatter = caseName.split("_(")[1]
636     clientMatter = clientMatter[:-1]
637     if "." in clientMatter:
638     clientMatter = clientMatter.replace('.','-')
639     folderMatrix = {}
640     #caseFolderLocation = os.path.join(caseFolderLocation,case)
641     err = False
642     if caseFolderLocation:
643     if os.path.exists(caseFolderLocation):
644     for f in os.listdir(caseFolderLocation):
645     if "_(" in f:
646     folderClientMatter = f.split("_(")[1]
647     folderClientMatter = folderClientMatter[:-1]
648     folderMatrix[folderClientMatter] = f
649     try:
650     folderName = folderMatrix[clientMatter]
651     os.startfile(os.path.join(caseFolderLocation, folderName))
652     except:
653     err = True
654     else:
655     err = True
656     else:
657     print "A case folder for this case was not found."
658     err = True
659     return err
660    
661    
662     def SetCaseNameAndCLM(self, newCaseName, newClientMatterNumber):
663     """Used when setting up a new case. Should have both or nothing"""
664     self.caseName = newCaseName
665     self.clientMatter = newClientMatterNumber
666     #print self.clientMatter
667    
668     def SetChargableCase(self, chargBool):
669     """sets or clears the chargable case settings"""
670     pass
671     def SetResponsibleVendor(self, vendorInfo):
672     """Sets the vendor name that is responsible for the case"""
673     pass
674     def SetReviewPlatform(self, reviewPlatform):
675     """Sets the review platform chosen for this case"""
676     if reviewPlatform == "Concordance":
677     print "Concordance selected. Creating DIS directories..."
678     hDrivePath = ConcordanceHelperTools.ParseClientMatter(self.clientMatter)
679     os.mkdir(hDrivePath)
680     print "Matter folder created."
681     os.mkdir(os.path.join(hDrivePath,'Match'))
682     os.mkdir(os.path.join(hDrivePath,'Tag_Databases'))
683     print "Supplemental folders created."
684     print "DIS directories done!"
685    
686 nino.borges 321 def GetDatabaseList(self,caseName):
687     """Returns the list of databases in the database list file."""
688     return ['datbase1','database2','database3']
689 ninoborges 8
690     def SyncWithAccessDB(self,case = 'ALL'):
691     """Syncs your cases with the access database. This might only get run once when you first install
692     the program though..."""
693     ## So this syncs 'your' databases only. even though you are looking at a list of eeryone's databases
694     ## it will only sync yours. even if you did an upload for another tpm, that wouldnt get synced unles
695     ## the owner did a sync all. for 2 way sync to work, you should check, in access, that they have the case name
696     ## (with no funky characters) populated, before they run this for the first time.
697     if case == 'ALL':
698     ## verify that all your cases are up there, if not add it. but have support for cases where is should be
699     ## yours but is assigned to someone else...
700     fullClientMatterList = self.accessDB.RetrieveAllCaseList()
701     myAccessClientMatterList = self.accessDB.RetrieveMyCaseList(self.tPMID)
702     myLocalClientMatterList = []
703    
704     ## Sync cases from my local to access
705     for case in self.responsibleCasesList:
706     localCaseName,clientMatter = case.split("_(")
707     clientMatter = clientMatter.replace(")","")
708     clientMatter = clientMatter.replace("-",".")
709     myLocalClientMatterList.append(clientMatter)
710     for clm in myLocalClientMatterList:
711     if clm in myAccessClientMatterList:
712     print "%s exists"% clm
713     elif clm in fullClientMatterList:
714     print "%s cant be added to your cases because it's owned by someone else..."% clm
715     else:
716     print "%s does not exist in the database. Adding it..."% clm
717     self.AddCaseToAccessDB(localCaseName,clientMatter)
718    
719     ## Sync cases from Access to my local
720    
721    
722     uploadReportMatrix = {}
723     for caseName in self.responsibleCasesList:
724     print "now processing %s"% caseName
725     casePath = os.path.join(self.casesDir,caseName)
726     if os.path.exists(os.path.join(casePath,"UploadReport.txt")):
727     print "yup"
728     caseUploadContents = open(os.path.join(casePath,"UploadReport.txt")).readlines()
729     clientMatter = caseName.split("_(")[1]
730     clientMatter = clientMatter.replace(")","")
731     clientMatter = clientMatter.replace("-",".")
732     for i in caseUploadContents:
733     i = i.replace("\n","")
734     i = i.replace(" | ","|")
735     try:
736     uploadReportMatrix[clientMatter].append(("%s"%i.split("|")[0],"%s"%i.split("|")[1],"%s"%i.split("|")[2],"%s"%i.split("|")[3]))
737     except:
738     uploadReportMatrix[clientMatter] = [("%s"%i.split("|")[0],"%s"%i.split("|")[1],"%s"%i.split("|")[2],"%s"%i.split("|")[3])]
739     #print uploadReportMatrix
740    
741     accessMyCaseUploads = self.accessDB.RetrieveMyCaseUploads('09756')
742     for x in uploadReportMatrix.keys():
743     localCaseUploadList = uploadReportMatrix[x]
744     tempMatrix = {}
745     try:
746     accessCaseUploadList = accessMyCaseUploads[x]
747     #print accessCaseUploadList
748     for y in localCaseUploadList:
749     epoch = y[0]
750     if int(epoch) > 1298462400:
751     #print epoch
752     reviewPlatform = y[1]
753     reportSize = y[3]
754     #print "."
755     #print accessCaseUploadList
756     if epoch in accessCaseUploadList:
757     print "%s, in the %s case, is already in there, skipping."%(y,x)
758     else:
759     print "%s, in the %s case, is missing. Will be added..."%(y,x)
760     date = y[2]
761     date = "%s/%s/%s"%(date[4:6],date[6:],date[:4])
762    
763     self.accessDB.UpdateCaseUpload(x,reviewPlatform,{epoch:(date,reportSize)})
764     #tempMatrix[epoch] = [platform,(date,size)]
765     else:
766     #print "This entry is pre cutover"
767     pass
768     except KeyError:
769     print "nothing for this one"
770     for z in localCaseUploadList:
771     print "%s, in the %s case, is missing. Will be added..."%(z,x)
772     date = z[0]
773     date = "%s/%s/%s"%(date[4:6],date[6:],date[:4])
774     #try:
775     # tempMatrix[date].append(z[1])
776     #except:
777     # tempMatrix[date] = [z[1]]
778     #print tempMatrix
779     #if tempMatrix:
780     # #print tempMatrix
781     # self.accessDB.UpdateCaseUpload(x,'Concordance DIS', tempMatrix)
782     #pass
783    
784    
785     #print myLocalClientMatterList
786     ## verify that all of your uploads are up there, if not, add it.
787     self.accessDB.CloseAccessConnection()
788    
789     else:
790     fullClientMatterList = self.accessDB.RetrieveAllCaseList()
791     myAccessClientMatterList = self.accessDB.RetrieveMyCaseList(self.tPMID)
792    
793