| 1 |
"""
|
| 2 |
IssueTrackerReporter
|
| 3 |
|
| 4 |
Created by
|
| 5 |
Emanuel Borges
|
| 6 |
01.06.2014
|
| 7 |
|
| 8 |
Creates an easy to read report from the issue tracker export of "all issues".
|
| 9 |
|
| 10 |
"""
|
| 11 |
|
| 12 |
|
| 13 |
def CreateBaseReport(outputFile):
|
| 14 |
"""Creates the top of the HTML file"""
|
| 15 |
outputFile.write("""
|
| 16 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.5 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
| 17 |
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
| 18 |
<head>
|
| 19 |
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
| 20 |
<meta name="description" content="Your description goes here" />
|
| 21 |
<meta name="keywords" content="your,keywords,goes,here" />
|
| 22 |
<meta name="author" content="Emanuel Borges">
|
| 23 |
<link rel="stylesheet" type="text/css" href="main.css" title="ITO Report" media="all" />
|
| 24 |
<title>ITO Report</title>
|
| 25 |
</head>
|
| 26 |
|
| 27 |
<body>
|
| 28 |
<div id="containerfull"><!-- Use"containerfull" for 100% width. For fixed width, use "container980", "container760" or "container600" (the number is the layout width in pixels). -->
|
| 29 |
<div id="header">
|
| 30 |
<h1><a href="index.html">ITO Report</a></h1>
|
| 31 |
<h2>Report gathered from Issue Tracking Object.</h2>
|
| 32 |
</div>
|
| 33 |
""")
|
| 34 |
outputFile.close()
|
| 35 |
def FinishReport(outputFile):
|
| 36 |
"""Creates the bottom of the HTML file"""
|
| 37 |
outputFile.write("""
|
| 38 |
|
| 39 |
<div class="clear"> </div>
|
| 40 |
</div>
|
| 41 |
<div class="clear"> </div>
|
| 42 |
</div>
|
| 43 |
<div id="footer">
|
| 44 |
<div id="footersections">
|
| 45 |
<div class="half">
|
| 46 |
<h2>Footer area #1</h2>
|
| 47 |
<p>manny test.</p>
|
| 48 |
</div>
|
| 49 |
<div class="quarter">
|
| 50 |
<h2>Footer area #2</h2>
|
| 51 |
<p>manny test 2.</p>
|
| 52 |
<p>Paragraphs and <a href="#">links</a> work here too.</p>
|
| 53 |
</div>
|
| 54 |
<div class="lastquarter">
|
| 55 |
<h2>Footer menu</h2>
|
| 56 |
<ul>
|
| 57 |
<li><a href="#">Link #1</a></li>
|
| 58 |
<li><a href="#">Link #2</a></li>
|
| 59 |
</ul>
|
| 60 |
</div>
|
| 61 |
<div class="clear"> </div>
|
| 62 |
</div>
|
| 63 |
</div>
|
| 64 |
<div id="credits">
|
| 65 |
<p>© 2014 Emanuel Borges<br />
|
| 66 |
</div>
|
| 67 |
</div>
|
| 68 |
</body>
|
| 69 |
</html>
|
| 70 |
""")
|
| 71 |
outputFile.close()
|
| 72 |
|
| 73 |
def GetProjectList(mwePlate,kpmgPlate,closedPlate,outputFile,headdingList):
|
| 74 |
"""Combines the plates (not lists) into the project list, so that you can populate the project view"""
|
| 75 |
## cycle through the 2 open lists and only pull from the closed list, if the proj exists in the first two.
|
| 76 |
## Everything should already be in a matrix by catagory.
|
| 77 |
projectMatrix = {}
|
| 78 |
for i in mwePlate.keys():
|
| 79 |
for p in mwePlate[i]:
|
| 80 |
project = p[3]
|
| 81 |
if project == '""':
|
| 82 |
project = "Tasks"
|
| 83 |
if project in projectMatrix.keys():
|
| 84 |
projectMatrix[project].append(["MWE",p])
|
| 85 |
else:
|
| 86 |
projectMatrix[project] = [["MWE",p],]
|
| 87 |
for i in kpmgPlate.keys():
|
| 88 |
for p in kpmgPlate[i]:
|
| 89 |
project = p[3]
|
| 90 |
if project=='""':
|
| 91 |
project = "Tasks"
|
| 92 |
if project in projectMatrix.keys():
|
| 93 |
projectMatrix[project].append(["KPMG",p])
|
| 94 |
else:
|
| 95 |
projectMatrix[project] = [["KPMG",p],]
|
| 96 |
for i in closedPlate.keys():
|
| 97 |
for p in closedPlate[i]:
|
| 98 |
project = p[3]
|
| 99 |
if project in projectMatrix.keys():
|
| 100 |
projectMatrix[project].append(["Closed",p])
|
| 101 |
outputFile.write("""
|
| 102 |
<div id="menu">
|
| 103 |
<ul>
|
| 104 |
""")
|
| 105 |
outputFile.write('<li><a href="index2.html">%s</a></li>\n'% headdingList[0])
|
| 106 |
outputFile.write('<li><a href="KPMGs_Plate.html">%s</a></li>\n'% headdingList[1])
|
| 107 |
outputFile.write('<li><a href="Closed_Items.html">%s</a></li>\n'% headdingList[2])
|
| 108 |
outputFile.write("""
|
| 109 |
<li><a class="current" href="Project_View.html">Project View</a></li>
|
| 110 |
</ul>
|
| 111 |
</div>
|
| 112 |
|
| 113 |
<div id="feature">
|
| 114 |
<div class="left">
|
| 115 |
<h2>About the Project View</h2>
|
| 116 |
<p>The project view takes the open items and formats them as a "project".</p>
|
| 117 |
</div>
|
| 118 |
<div class="clear"> </div>
|
| 119 |
</div>
|
| 120 |
<div id="main">
|
| 121 |
<div id="sidebar">
|
| 122 |
<div class="sidebarbox">
|
| 123 |
<h2>Project Menu</h2>
|
| 124 |
<ul class="sidemenu">\n""")
|
| 125 |
for p in projectMatrix.keys():
|
| 126 |
prj = p.replace('"','')
|
| 127 |
outputFile.write(' <li><a href="#%s">%s</a></li>\n'%(prj,prj))
|
| 128 |
outputFile.write(""" </ul>
|
| 129 |
</div>
|
| 130 |
|
| 131 |
<div class="sidebarbox">
|
| 132 |
<h2>Text box</h2>
|
| 133 |
<p>Important links:</p>
|
| 134 |
<ul>
|
| 135 |
<li><a href="https://fts.shs.us.kpmg.com/vpn/index.html">KPMG Relativity</a></li>
|
| 136 |
<li><a href="#">Another</a></li>
|
| 137 |
</ul>
|
| 138 |
</div>
|
| 139 |
</div>
|
| 140 |
|
| 141 |
<div id="content">""")
|
| 142 |
for p in projectMatrix.keys():
|
| 143 |
prj = p.replace('"','')
|
| 144 |
outputFile.write('<ul><li id="%s">%s<ul>'%(prj,prj))
|
| 145 |
for i in projectMatrix[p]:
|
| 146 |
if i[0] == "Closed":
|
| 147 |
outputFile.write('<li><table border="1"><tr><td><strike>%s</strike></td><td><strike>%s</strike></td><td><strike>%s</strike></td></tr></table> --- %s</li>'% (i[1][0],i[1][1],i[1][4],i[0]))
|
| 148 |
else:
|
| 149 |
outputFile.write('<li> %s<table border="1"><tr><td>%s</td><td>%s</td><td>%s</td></tr></table></li>'% (i[0],i[1][0],i[1][1],i[1][4]))
|
| 150 |
outputFile.write("</ul></li></ul><hr 40%>")
|
| 151 |
outputFile.write("""</div></div>""")
|
| 152 |
outputFile.close()
|
| 153 |
|
| 154 |
|
| 155 |
def SplitIntoPlates(exportFile):
|
| 156 |
openMWEList = []
|
| 157 |
openKPMGList = []
|
| 158 |
closedList = []
|
| 159 |
|
| 160 |
contents = open(exportFile).readlines()
|
| 161 |
contents = contents[1:]
|
| 162 |
|
| 163 |
for line in contents:
|
| 164 |
line = line.replace("\n","")
|
| 165 |
ID = line.split(",")[0]
|
| 166 |
ID = ID.replace('"',"")
|
| 167 |
if ID.isalpha():
|
| 168 |
pass
|
| 169 |
else:
|
| 170 |
KPMGStatus = line.split(",")[2]
|
| 171 |
MWEStatus = line.split(",")[3]
|
| 172 |
if KPMGStatus in ['"Resolved"', '"Sent to MWE"','"Closed"','"Transmit to Counsel"'] :
|
| 173 |
if MWEStatus in ['"Resolved"','"Closed"']:
|
| 174 |
closedList.append(line)
|
| 175 |
else:
|
| 176 |
openMWEList.append(line)
|
| 177 |
else:
|
| 178 |
openKPMGList.append(line)
|
| 179 |
return openMWEList,openKPMGList, closedList
|
| 180 |
|
| 181 |
def SplitIntoSections(currentList):
|
| 182 |
"""Splits into sections and returns matrix"""
|
| 183 |
matrix = {}
|
| 184 |
for i in currentList:
|
| 185 |
i = i.split(",")
|
| 186 |
writeList = [i[0],i[2],i[3],i[4],i[5],i[6],i[7],i[8],i[9]]
|
| 187 |
issueType = i[1]
|
| 188 |
issueType = issueType.replace('"',"")
|
| 189 |
if issueType in matrix.keys():
|
| 190 |
matrix[issueType].append(writeList)
|
| 191 |
else:
|
| 192 |
matrix[issueType] = [writeList,]
|
| 193 |
return matrix
|
| 194 |
|
| 195 |
def ProcessToHTML(currentMatrix,outputFile,headdingList,part):
|
| 196 |
"""Converts the lists into HTML tables"""
|
| 197 |
outputFile.write("""
|
| 198 |
<div id="menu">
|
| 199 |
<ul>
|
| 200 |
""")
|
| 201 |
if part[:3] == "MWE":
|
| 202 |
outputFile.write('<li><a class="current" href="index2.html">%s</a></li>\n'% headdingList[0])
|
| 203 |
outputFile.write('<li><a href="KPMGs_Plate.html">%s</a></li>\n'% headdingList[1])
|
| 204 |
outputFile.write('<li><a href="Closed_Items.html">%s</a></li>\n'% headdingList[2])
|
| 205 |
outputFile.write("""
|
| 206 |
<li><a href="Project_View.html">Project View</a></li>
|
| 207 |
</ul>
|
| 208 |
</div>
|
| 209 |
|
| 210 |
<div id="feature">
|
| 211 |
<div class="left">
|
| 212 |
<h2>About the MWE Plate</h2>
|
| 213 |
<p>These are all of the tasks and projects, broken out by Issue type, that are currently assigned to the MWE team.</p>
|
| 214 |
</div>
|
| 215 |
<div class="clear"> </div>
|
| 216 |
</div>
|
| 217 |
<div id="main">
|
| 218 |
<div id="sidebar">
|
| 219 |
<div class="sidebarbox">
|
| 220 |
<h2>Issue menu</h2>
|
| 221 |
<ul class="sidemenu">\n""")
|
| 222 |
for section in currentMatrix.keys():
|
| 223 |
outputFile.write(' <li><a href="#%s">%s</a></li>\n'%(section,section))
|
| 224 |
outputFile.write(""" </ul>
|
| 225 |
</div>
|
| 226 |
|
| 227 |
<div class="sidebarbox">
|
| 228 |
<h2>Text box</h2>
|
| 229 |
<p>Important links:</p>
|
| 230 |
<ul>
|
| 231 |
<li><a href="https://fts.shs.us.kpmg.com/vpn/index.html">KPMG Relativity</a></li>
|
| 232 |
<li><a href="#">Another</a></li>
|
| 233 |
</ul>
|
| 234 |
</div>
|
| 235 |
</div>
|
| 236 |
|
| 237 |
<div id="content">
|
| 238 |
""")
|
| 239 |
for section in currentMatrix.keys():
|
| 240 |
outputFile.write('<h3 id="%s">%s</h3>\n'%(section,section))
|
| 241 |
outputFile.write("<center><table border=1 cellspacing=0 cellpadding=5 width=95%>\n")
|
| 242 |
outputFile.write("<tr><th>ID</th><th>KPMG Status</th><th>MWE Status</th><th>TE Prefix</th><th>TE Description</th><th>Reporter</th><th>Assignee</th><th>Created On</th><th>Modified On</th></tr>")
|
| 243 |
for x in currentMatrix[section]:
|
| 244 |
outputFile.write("<tr>\n")
|
| 245 |
for y in x:
|
| 246 |
outputFile.write("<td>%s</td>"%y)
|
| 247 |
outputFile.write("</tr>\n")
|
| 248 |
outputFile.write("</table></center><br><br>\n")
|
| 249 |
|
| 250 |
elif part[:3] == "KPM":
|
| 251 |
outputFile.write('<li><a href="index2.html">%s</a></li>\n'% headdingList[0])
|
| 252 |
outputFile.write('<li><a class="current" href="KPMGs_Plate.html">%s</a></li>\n'% headdingList[1])
|
| 253 |
outputFile.write('<li><a href="Closed_Items.html">%s</a></li>\n'% headdingList[2])
|
| 254 |
outputFile.write("""
|
| 255 |
<li><a href="Project_View.html">Project View</a></li>
|
| 256 |
</ul>
|
| 257 |
</div>
|
| 258 |
|
| 259 |
<div id="feature">
|
| 260 |
<div class="left">
|
| 261 |
<h2>About the KPMG Plate</h2>
|
| 262 |
<p>These are all of the tasks and projects, broken out by Issue type, that are currently assigned to the KPMG team.</p>
|
| 263 |
</div>
|
| 264 |
<div class="clear"> </div>
|
| 265 |
</div>
|
| 266 |
<div id="main">
|
| 267 |
<div id="sidebar">
|
| 268 |
<div class="sidebarbox">
|
| 269 |
<h2>Issue menu</h2>
|
| 270 |
<ul class="sidemenu">\n""")
|
| 271 |
for section in currentMatrix.keys():
|
| 272 |
outputFile.write(' <li><a href="#%s">%s</a></li>\n'%(section,section))
|
| 273 |
outputFile.write(""" </ul>
|
| 274 |
</div>
|
| 275 |
|
| 276 |
<div class="sidebarbox">
|
| 277 |
<h2>Text box</h2>
|
| 278 |
<p>Important links:</p>
|
| 279 |
<ul>
|
| 280 |
<li><a href="https://fts.shs.us.kpmg.com/vpn/index.html">KPMG Relativity</a></li>
|
| 281 |
<li><a href="#">Another</a></li>
|
| 282 |
</ul>
|
| 283 |
</div>
|
| 284 |
</div>
|
| 285 |
|
| 286 |
<div id="content">
|
| 287 |
""")
|
| 288 |
for section in currentMatrix.keys():
|
| 289 |
outputFile.write('<h3 id="%s">%s</h3>\n'%(section,section))
|
| 290 |
outputFile.write("<center><table border=1 cellspacing=0 cellpadding=5 width=95%>\n")
|
| 291 |
outputFile.write("<tr><th>ID</th><th>KPMG Status</th><th>MWE Status</th><th>TE Prefix</th><th>TE Description</th><th>Reporter</th><th>Assignee</th><th>Created On</th><th>Modified On</th></tr>")
|
| 292 |
for x in currentMatrix[section]:
|
| 293 |
outputFile.write("<tr>\n")
|
| 294 |
for y in x:
|
| 295 |
outputFile.write("<td>%s</td>"%y)
|
| 296 |
outputFile.write("</tr>\n")
|
| 297 |
outputFile.write("</table></center><br><br>\n")
|
| 298 |
elif part[:3] == "Clo":
|
| 299 |
outputFile.write('<li><a href="index2.html">%s</a></li>\n'% headdingList[0])
|
| 300 |
outputFile.write('<li><a href="KPMGs_Plate.html">%s</a></li>\n'% headdingList[1])
|
| 301 |
outputFile.write('<li><a class="current" href="Closed_Items.html">%s</a></li>\n'% headdingList[2])
|
| 302 |
outputFile.write("""
|
| 303 |
<li><a href="Project_View.html">Project View</a></li>
|
| 304 |
</ul>
|
| 305 |
</div>
|
| 306 |
|
| 307 |
<div id="feature">
|
| 308 |
<div class="left">
|
| 309 |
<h2>About the Closed Items page</h2>
|
| 310 |
<p>These are all of the tasks and projects, broken out by Issue type, that are currently closed and marked complete.</p>
|
| 311 |
</div>
|
| 312 |
<div class="clear"> </div>
|
| 313 |
</div>
|
| 314 |
<div id="main">
|
| 315 |
<div id="sidebar">
|
| 316 |
<div class="sidebarbox">
|
| 317 |
<h2>Issue menu</h2>
|
| 318 |
<ul class="sidemenu">\n""")
|
| 319 |
for section in currentMatrix.keys():
|
| 320 |
outputFile.write(' <li><a href="#%s">%s</a></li>\n'%(section,section))
|
| 321 |
outputFile.write(""" </ul>
|
| 322 |
</div>
|
| 323 |
|
| 324 |
<div class="sidebarbox">
|
| 325 |
<h2>Text box</h2>
|
| 326 |
<p>Important links:</p>
|
| 327 |
<ul>
|
| 328 |
<li><a href="https://fts.shs.us.kpmg.com/vpn/index.html">KPMG Relativity</a></li>
|
| 329 |
<li><a href="#">Another</a></li>
|
| 330 |
</ul>
|
| 331 |
</div>
|
| 332 |
</div>
|
| 333 |
|
| 334 |
<div id="content">
|
| 335 |
""")
|
| 336 |
for section in currentMatrix.keys():
|
| 337 |
outputFile.write('<h3 id="%s">%s</h3>\n'%(section,section))
|
| 338 |
outputFile.write("<center><table border=1 cellspacing=0 cellpadding=5 width=95%>\n")
|
| 339 |
outputFile.write("<tr><th>ID</th><th>KPMG Status</th><th>MWE Status</th><th>TE Prefix</th><th>TE Description</th><th>Reporter</th><th>Assignee</th><th>Created On</th><th>Modified On</th></tr>")
|
| 340 |
for x in currentMatrix[section]:
|
| 341 |
outputFile.write("<tr>\n")
|
| 342 |
for y in x:
|
| 343 |
outputFile.write("<td>%s</td>"%y)
|
| 344 |
outputFile.write("</tr>\n")
|
| 345 |
outputFile.write("</table></center><br><br>\n")
|
| 346 |
else:
|
| 347 |
pass
|
| 348 |
##
|
| 349 |
## outputFile.write('<h2>%s</h2>\n'% headdingList[0])
|
| 350 |
## outputFile.write('''<hr width="40%">''')
|
| 351 |
## for section in currentMatrix.keys():
|
| 352 |
## outputFile.write("<h3>%s</h3>\n"%section)
|
| 353 |
## outputFile.write("<center><table border=1 cellspacing=0 cellpadding=5 width=90%>\n")
|
| 354 |
## outputFile.write("<tr><th>ID</th><th>KPMG Status</th><th>MWE Status</th><th>TE Prefix</th><th>TE Description</th><th>Reporter</th><th>Assignee</th><th>Created On</th><th>Modified On</th></tr>")
|
| 355 |
## for x in currentMatrix[section]:
|
| 356 |
## outputFile.write("<tr>\n")
|
| 357 |
## for y in x:
|
| 358 |
## outputFile.write("<td>%s</td>"%y)
|
| 359 |
## outputFile.write("</tr>\n")
|
| 360 |
## outputFile.write("</table></center>\n")
|
| 361 |
outputFile.close()
|
| 362 |
|
| 363 |
if __name__ == '__main__':
|
| 364 |
#exportFile = "/Users/ninoborges/Dropbox/Misc/export_20140109_011143.csv"
|
| 365 |
#indexFile = "/Users/ninoborges/Documents/ITO_Report/index2.html"
|
| 366 |
#kpmgFile = "/Users/ninoborges/Documents/ITO_Report/KPMGs_Plate.html"
|
| 367 |
#closedFile = "/Users/ninoborges/Documents/ITO_Report/Closed_Items.html"
|
| 368 |
#projectViewFile = "/Users/ninoborges/Documents/ITO_Report/Project_View.html"
|
| 369 |
exportFile = "T:\honeywell\ITO_Report\Export\export.csv"
|
| 370 |
indexFile= "T:\honeywell\ITO_Report\index2.html"
|
| 371 |
kpmgFile = "T:\honeywell\ITO_Report\KPMGs_Plate.html"
|
| 372 |
closedFile = "T:\honeywell\ITO_Report\Closed_Items.html"
|
| 373 |
projectViewFile = "T:\honeywell\ITO_Report\Project_View.html"
|
| 374 |
openMWEList,openKPMGList, closedList = SplitIntoPlates(exportFile)
|
| 375 |
print "mwe list %s"%len(openMWEList)
|
| 376 |
print "kpmg list %s"%len(openKPMGList)
|
| 377 |
print "closed list %s"%len(closedList)
|
| 378 |
mwePlate = SplitIntoSections(openMWEList)
|
| 379 |
kpmgPlate = SplitIntoSections(openKPMGList)
|
| 380 |
closedPlate = SplitIntoSections(closedList)
|
| 381 |
|
| 382 |
headdingList = ["MWE's Plate (%s items)"%len(openMWEList),"KPMG's Plate (%s items)"%len(openKPMGList),"Closed Requests (%s items)"%len(closedList)]
|
| 383 |
|
| 384 |
CreateBaseReport(open(indexFile,'w'))
|
| 385 |
CreateBaseReport(open(kpmgFile,'w'))
|
| 386 |
CreateBaseReport(open(closedFile,'w'))
|
| 387 |
CreateBaseReport(open(projectViewFile,'w'))
|
| 388 |
|
| 389 |
ProcessToHTML(mwePlate,open(indexFile,'a'),headdingList,"MWE's List")
|
| 390 |
ProcessToHTML(kpmgPlate,open(kpmgFile,'a'),headdingList,"KPMG's List")
|
| 391 |
ProcessToHTML(closedPlate,open(closedFile,'a'),headdingList,"Closed List")
|
| 392 |
GetProjectList(mwePlate,kpmgPlate,closedPlate,open(projectViewFile,'a'),headdingList)
|
| 393 |
|
| 394 |
FinishReport(open(indexFile,'a'))
|
| 395 |
FinishReport(open(kpmgFile,'a'))
|
| 396 |
FinishReport(open(closedFile,'a'))
|
| 397 |
FinishReport(open(projectViewFile,'a'))
|
| 398 |
|