ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/ns_dev/Python/NinoCode/Active_prgs/MCP/MCP_Console.py
Revision: 262
Committed: Fri Feb 1 23:56:28 2013 UTC (13 years, 1 month ago) by nino.borges
Content type: text/x-python
File size: 21150 byte(s)
Log Message:
Added the case directories settings

File Contents

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