ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/ns_dev/Python/NinoCode/Active_prgs/MCP/MCP_Console.py
Revision: 158
Committed: Thu Oct 11 18:54:28 2012 UTC (13 years, 5 months ago) by nino.borges
Content type: text/x-python
File size: 19913 byte(s)
Log Message:
Added 'View My Case Notes' and 'View Production Spec' to the View Edit Module.

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     import MCP_Lib,os,shutil,ConcordanceHelperTools, time,directorySize2
18    
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     self.tPMName, self.tPMID, self.tPMOffice = MCP_Lib.GetTPMInfo()
27     responsibleCases,casesDir = MCP_Lib.GetCaseList('',self.accessDB)
28    
29     ## Testing version
30     #self.accessDB = MCP_Lib.AccessDBConnection(r"W:\Manny\testing\TPM_CaseTracking.mdb")
31     #responsibleCases,casesDir = MCP_Lib.GetCaseList(r"C:\Documents and Settings\eborges\My Documents\My Dropbox\Dev\Python\NinoCode\Active_prgs\Concordance\MCP",self.accessDB)
32     #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")
33    
34     print "connected to DB."
35    
36     self.responsibleCasesList = responsibleCases
37     self.casesDir = casesDir
38    
39    
40     def AddNewCase(self, caseName, clientMatter, chargable = False, reviewPlatform = "", responsibleProcessingVendor = "",
41     responsibleScanningVendor = "",responsibleHostingVendor = ""):
42     ## Add the local folders The GUI should test that the clm is 10 digits and has hyphen.
43     template = os.path.join(self.casesDir,'_Template_')
44     new = os.path.join(self.casesDir, caseName + '_(%s)'%clientMatter)
45     if os.path.exists(new):
46     print "ERROR: This case already exists!!"
47     else:
48     #print template
49     #print new
50     os.mkdir(new)
51     for file in os.listdir(template):
52     shutil.copy2(os.path.join(template,file),new)
53     ## Check the H drive for the supplemental folders and the matter folder, only if they select Concordance.
54     self.SetCaseNameAndCLM(caseName,clientMatter)
55     self.AddCaseToAccessDB(caseName,clientMatter)
56    
57     def AddCaseToAccessDB(self, caseName, clientMatter):
58     ## First test to see if it's already in the DB.
59     fullClientMatterList = self.accessDB.RetrieveAllCaseList()
60     clientMatter = clientMatter.replace("-",".")
61     if clientMatter in fullClientMatterList:
62     print "This client matter already exists in the database. Skipping."
63     else:
64     print "New client matter. Adding."
65     self.accessDB.AddNewCase(caseName, clientMatter, self.tPMName,self.tPMID,responsibleOffice = self.tPMOffice)
66     print "Added!"
67    
68     def EditCaseData(self,caseName,chargeableBool,respAttorney,respParalegal,respVendorTpl,revPlatform,respTPM,respOffice, caseStatus):
69     clientMatter = caseName.split("_(")[1]
70     clientMatter = clientMatter[:-1]
71     clientMatter = clientMatter.replace('-','.')
72     self.accessDB.UpdateChargable(clientMatter,chargeableBool)
73     self.accessDB.UpdateResponsibleAttorney(clientMatter,respAttorney)
74     self.accessDB.UpdateResponsibleParalegal(clientMatter,respParalegal)
75     self.accessDB.UpdateReviewPlatform(clientMatter,revPlatform)
76     self.accessDB.UpdateResponsibleTPM(clientMatter,respTPM)
77     self.accessDB.UpdatePrimaryOffice(clientMatter,respOffice)
78     self.accessDB.UpdateResponsibleVendors(clientMatter,respVendorTpl)
79     self.accessDB.UpdateCaseStatus(clientMatter, caseStatus)
80    
81     def GetCaseData(self, caseName):
82     #use this to get the data on the selected case, to populate your GUI
83     clientMatter = caseName.split("_(")[1]
84     clientMatter = clientMatter[:-1]
85     clientMatter = clientMatter.replace('-','.')
86     chargeableBool = self.accessDB.GetChargable(clientMatter)
87     respAttorney = self.accessDB.GetResponsibleAttorney(clientMatter)
88     respParalegal = self.accessDB.GetResponsibleParalegal(clientMatter)
89     respVendorTpl = self.accessDB.GetResponsibleVendorTpl(clientMatter)
90     revPlatform = self.accessDB.GetReviewPlatform(clientMatter)
91     respTPM = self.accessDB.GetResponsibleTPM(clientMatter)
92     respOffice = self.accessDB.GetPrimaryOffice(clientMatter)
93     caseStatus = self.accessDB.GetCaseStatus(clientMatter)
94     return (chargeableBool,respAttorney,respParalegal,respVendorTpl,revPlatform,respTPM,respOffice,caseStatus)
95    
96     def AddProductionEntry(self, CLM,prodID,prodDate,begBates,endBates,prodDocCount, prodPageCount, prodNotes):
97     """This method adds one production entry to the case."""
98     errRpt = True
99     if CLM:
100     if prodID:
101     if prodDate:
102     if begBates:
103     if endBates:
104     if prodDocCount:
105     if prodPageCount:
106     if prodNotes:
107     self.accessDB.UpdateProductionDetail(CLM,prodID,prodDate,begBates,endBates,prodDocCount, prodPageCount, prodNotes)
108     errRpt = False
109     return errRpt
110    
111     def AddDataUpload(self,CLM, reviewPlatform, reportSize):
112     """This method will add one case upload."""
113     ## TODO: one day change it so that copy up requst calls this instead
114     ## of it being internal to that prog.
115     epoch = str(int(time.time()))
116     self.accessDB.UpdateCaseUpload(CLM,reviewPlatform,{epoch:(time.strftime('%m/%d/%Y'),reportSize)})
117    
118     def RemoveDataUpload(self,CLM,UEPOCH):
119     """This method calls DeleteCaseUpload and removes just one case upload. """
120     err = self.accessDB.DeleteCaseUpload(CLM,UEPOCH)
121     if err:
122     print "ERROR: An Error occured and this value was not removed!"
123     else:
124     print "%s Removed"% UEPOCH
125    
126     def GetUploadData(self, caseName):
127     # Used to get upload data, on the selected case, to populate the upload dialog
128     clientMatter = caseName.split("_(")[1]
129     clientMatter = clientMatter[:-1]
130     clientMatter = clientMatter.replace('-','.')
131     uploadList = self.accessDB.RetrieveUploadsByCLM(clientMatter)
132     return uploadList
133    
134     def GetProductionData(self,caseName):
135     clientMatter = caseName.split("_(")[1]
136     clientMatter = clientMatter[:-1]
137     clientMatter = clientMatter.replace('-','.')
138     productionList = self.accessDB.RetrieveProductionsByCLM(clientMatter)
139     return productionList
140    
141     def GetProductionTotal(self,productionList):
142     """Using the above productionList, this returns the total docs and pages produced"""
143     pgCountTotal = 0
144     docCountTotal = 0
145     for i in productionList:
146     pageCount = i[-2]
147     docCount = i[-3]
148     if 'None' in pageCount:
149     pass
150     else:
151     #print pageCount
152     pgCountTotal = pgCountTotal+int(pageCount)
153     if 'None' in pageCount:
154     pass
155     else:
156     #print docCount
157     docCountTotal = docCountTotal+int(docCount)
158     return pgCountTotal,docCountTotal
159    
160     def ExportProductionDataToExcel(self,CaseName,pathToCSV):
161     """Exports the production data to a csv file"""
162     productionList = self.GetProductionData(CaseName)
163     #print productionList
164     outputFile = open(pathToCSV,'w')
165     outputFile.write('Production ID,Production Date,Start Bates,End Bates,Document Count,Page Count,Notes\n')
166     for i in productionList:
167     for x in i:
168     outputFile.write(x+",")
169     outputFile.write("\n")
170     outputFile.close()
171    
172     def GetUploadTotal(self,uploadList):
173     """ Using the above uploadList, this will return the total uploaded """
174     count = 0.
175     for i in uploadList:
176     size = i[-1]
177    
178     if 'None' in size:
179     pass
180     else:
181     rawSize = directorySize2.prettyToUnpretty_Filesize(size)
182     count = count + rawSize
183     prettySizeFinal = directorySize2.pretty_filesize2(count)
184     return prettySizeFinal
185    
186     def MakeCaseDormant(self, caseAndCLM):
187     """Moves the case to the Dormant folder"""
188     print "Making %s case dormant..."
189     os.rename(os.path.join(self.casesDir,caseAndCLM),os.path.join(self.casesDir,os.path.join('zzzz_dormant_', caseAndCLM)))
190     print "Case has been archived."
191    
192    
193 nino.borges 158 def ViewCaseNotes(self,caseName,office):
194     """Trys to open the case notes file,in the case folder, for the active case, regardless who owns it."""
195     caseFolderLocation = MCP_Lib.GetOtherCaseFolder(office)
196     clientMatter = caseName.split("_(")[1]
197     clientMatter = clientMatter[:-1]
198     if "." in clientMatter:
199     clientMatter = clientMatter.replace('.','-')
200     folderMatrix = {}
201     #caseFolderLocation = os.path.join(caseFolderLocation,case)
202     err = False
203     if caseFolderLocation:
204     if os.path.exists(caseFolderLocation):
205     for f in os.listdir(caseFolderLocation):
206     if "_(" in f:
207     folderClientMatter = f.split("_(")[1]
208     folderClientMatter = folderClientMatter[:-1]
209     folderMatrix[folderClientMatter] = f
210     try:
211     folderName = folderMatrix[clientMatter]
212     os.startfile(os.path.join(caseFolderLocation, folderName)+"/Gen_Notes.txt")
213     except:
214     err = True
215     else:
216     err = True
217     else:
218     print "A case folder for this case was not found."
219     err = True
220     return err
221    
222     def ViewProdSpec(self,caseName,office):
223     """Trys to open the prod spec file,in the case folder, for the active case, regardless who owns it."""
224     caseFolderLocation = MCP_Lib.GetOtherCaseFolder(office)
225     clientMatter = caseName.split("_(")[1]
226     clientMatter = clientMatter[:-1]
227     if "." in clientMatter:
228     clientMatter = clientMatter.replace('.','-')
229     folderMatrix = {}
230     #caseFolderLocation = os.path.join(caseFolderLocation,case)
231     err = False
232     if caseFolderLocation:
233     if os.path.exists(caseFolderLocation):
234     for f in os.listdir(caseFolderLocation):
235     if "_(" in f:
236     folderClientMatter = f.split("_(")[1]
237     folderClientMatter = folderClientMatter[:-1]
238     folderMatrix[folderClientMatter] = f
239     try:
240     folderName = folderMatrix[clientMatter]
241     os.startfile(os.path.join(caseFolderLocation, folderName+"/Production_Spec.txt"))
242     except:
243     err = True
244     else:
245     err = True
246     else:
247     print "A case folder for this case was not found."
248     err = True
249     return err
250    
251 ninoborges 8 def OpenCaseFolder(self,caseName,office):
252     """Trys to open the case folder for the active case, regardless who owns it."""
253     caseFolderLocation = MCP_Lib.GetOtherCaseFolder(office)
254     clientMatter = caseName.split("_(")[1]
255     clientMatter = clientMatter[:-1]
256     if "." in clientMatter:
257     clientMatter = clientMatter.replace('.','-')
258     folderMatrix = {}
259     #caseFolderLocation = os.path.join(caseFolderLocation,case)
260     err = False
261     if caseFolderLocation:
262     if os.path.exists(caseFolderLocation):
263     for f in os.listdir(caseFolderLocation):
264     if "_(" in f:
265     folderClientMatter = f.split("_(")[1]
266     folderClientMatter = folderClientMatter[:-1]
267     folderMatrix[folderClientMatter] = f
268     try:
269     folderName = folderMatrix[clientMatter]
270     os.startfile(os.path.join(caseFolderLocation, folderName))
271     except:
272     err = True
273     else:
274     err = True
275     else:
276     print "A case folder for this case was not found."
277     err = True
278     return err
279    
280    
281     def SetCaseNameAndCLM(self, newCaseName, newClientMatterNumber):
282     """Used when setting up a new case. Should have both or nothing"""
283     self.caseName = newCaseName
284     self.clientMatter = newClientMatterNumber
285     #print self.clientMatter
286    
287     def SetChargableCase(self, chargBool):
288     """sets or clears the chargable case settings"""
289     pass
290     def SetResponsibleVendor(self, vendorInfo):
291     """Sets the vendor name that is responsible for the case"""
292     pass
293     def SetReviewPlatform(self, reviewPlatform):
294     """Sets the review platform chosen for this case"""
295     if reviewPlatform == "Concordance":
296     print "Concordance selected. Creating DIS directories..."
297     hDrivePath = ConcordanceHelperTools.ParseClientMatter(self.clientMatter)
298     os.mkdir(hDrivePath)
299     print "Matter folder created."
300     os.mkdir(os.path.join(hDrivePath,'Match'))
301     os.mkdir(os.path.join(hDrivePath,'Tag_Databases'))
302     print "Supplemental folders created."
303     print "DIS directories done!"
304    
305    
306    
307     def SyncWithAccessDB(self,case = 'ALL'):
308     """Syncs your cases with the access database. This might only get run once when you first install
309     the program though..."""
310     ## So this syncs 'your' databases only. even though you are looking at a list of eeryone's databases
311     ## it will only sync yours. even if you did an upload for another tpm, that wouldnt get synced unles
312     ## the owner did a sync all. for 2 way sync to work, you should check, in access, that they have the case name
313     ## (with no funky characters) populated, before they run this for the first time.
314     if case == 'ALL':
315     ## verify that all your cases are up there, if not add it. but have support for cases where is should be
316     ## yours but is assigned to someone else...
317     fullClientMatterList = self.accessDB.RetrieveAllCaseList()
318     myAccessClientMatterList = self.accessDB.RetrieveMyCaseList(self.tPMID)
319     myLocalClientMatterList = []
320    
321     ## Sync cases from my local to access
322     for case in self.responsibleCasesList:
323     localCaseName,clientMatter = case.split("_(")
324     clientMatter = clientMatter.replace(")","")
325     clientMatter = clientMatter.replace("-",".")
326     myLocalClientMatterList.append(clientMatter)
327     for clm in myLocalClientMatterList:
328     if clm in myAccessClientMatterList:
329     print "%s exists"% clm
330     elif clm in fullClientMatterList:
331     print "%s cant be added to your cases because it's owned by someone else..."% clm
332     else:
333     print "%s does not exist in the database. Adding it..."% clm
334     self.AddCaseToAccessDB(localCaseName,clientMatter)
335    
336     ## Sync cases from Access to my local
337    
338    
339     uploadReportMatrix = {}
340     for caseName in self.responsibleCasesList:
341     print "now processing %s"% caseName
342     casePath = os.path.join(self.casesDir,caseName)
343     if os.path.exists(os.path.join(casePath,"UploadReport.txt")):
344     print "yup"
345     caseUploadContents = open(os.path.join(casePath,"UploadReport.txt")).readlines()
346     clientMatter = caseName.split("_(")[1]
347     clientMatter = clientMatter.replace(")","")
348     clientMatter = clientMatter.replace("-",".")
349     for i in caseUploadContents:
350     i = i.replace("\n","")
351     i = i.replace(" | ","|")
352     try:
353     uploadReportMatrix[clientMatter].append(("%s"%i.split("|")[0],"%s"%i.split("|")[1],"%s"%i.split("|")[2],"%s"%i.split("|")[3]))
354     except:
355     uploadReportMatrix[clientMatter] = [("%s"%i.split("|")[0],"%s"%i.split("|")[1],"%s"%i.split("|")[2],"%s"%i.split("|")[3])]
356     #print uploadReportMatrix
357    
358     accessMyCaseUploads = self.accessDB.RetrieveMyCaseUploads('09756')
359     for x in uploadReportMatrix.keys():
360     localCaseUploadList = uploadReportMatrix[x]
361     tempMatrix = {}
362     try:
363     accessCaseUploadList = accessMyCaseUploads[x]
364     #print accessCaseUploadList
365     for y in localCaseUploadList:
366     epoch = y[0]
367     if int(epoch) > 1298462400:
368     #print epoch
369     reviewPlatform = y[1]
370     reportSize = y[3]
371     #print "."
372     #print accessCaseUploadList
373     if epoch in accessCaseUploadList:
374     print "%s, in the %s case, is already in there, skipping."%(y,x)
375     else:
376     print "%s, in the %s case, is missing. Will be added..."%(y,x)
377     date = y[2]
378     date = "%s/%s/%s"%(date[4:6],date[6:],date[:4])
379    
380     self.accessDB.UpdateCaseUpload(x,reviewPlatform,{epoch:(date,reportSize)})
381     #tempMatrix[epoch] = [platform,(date,size)]
382     else:
383     #print "This entry is pre cutover"
384     pass
385     except KeyError:
386     print "nothing for this one"
387     for z in localCaseUploadList:
388     print "%s, in the %s case, is missing. Will be added..."%(z,x)
389     date = z[0]
390     date = "%s/%s/%s"%(date[4:6],date[6:],date[:4])
391     #try:
392     # tempMatrix[date].append(z[1])
393     #except:
394     # tempMatrix[date] = [z[1]]
395     #print tempMatrix
396     #if tempMatrix:
397     # #print tempMatrix
398     # self.accessDB.UpdateCaseUpload(x,'Concordance DIS', tempMatrix)
399     #pass
400    
401    
402     #print myLocalClientMatterList
403     ## verify that all of your uploads are up there, if not, add it.
404     self.accessDB.CloseAccessConnection()
405    
406     else:
407     fullClientMatterList = self.accessDB.RetrieveAllCaseList()
408     myAccessClientMatterList = self.accessDB.RetrieveMyCaseList(self.tPMID)
409    
410