整体代码比较冗长,但是很好读。写的方法全是按照BUG分类去写的。所以写死了,凑合看吧,画出饼图,树状图和生成对应的数据excel,希望大家举一反三能帮助自己分析BUG

  1. #__author__ = 'xu.duan'
  2. # -*- coding: utf-8 -*-
  3.  
  4. import cairo
  5. import pycha.pie
  6. import pycha.bar
  7. import pycha.scatter
  8. import pycha.stackedbar
  9. import pycha.line
  10. import time
  11. from redmine import Redmine
  12. import xlwt
  13.  
  14. # settings redmine,redmine's url :http://python-redmine.readthedocs.org/
  15. def set_Redmine():
  16. REDMINE_URL = 'http://100.69.177.159:3000' #redmine 的地址
  17. REDMINE_KEY = 'b549cac9132fb3ef8b2d3ed898dfb1f123e641b2f3'#这个是自己redmine的账号
  18. redmine = Redmine(REDMINE_URL,key=REDMINE_KEY)
  19. issues = redmine.issue.all(project_id = 'hybrid-navigation',status_id='*',tracker_id=23)
  20. return issues
  21.  
  22. #获取multimode的数据
  23. def hybrid_API_multimode():
  24. Low = []
  25. Normal = []
  26. High =[]
  27. Urgent =[]
  28. Immediate = []
  29. openlist=[]
  30. colselist =[]
  31. for i in set_Redmine():
  32. try:
  33. if str(i.category) =='hybrid-API-multimode' and str(i.priority) =="Low":
  34. Low.append(i)
  35. elif str(i.category) =='hybrid-API-multimode' and str(i.priority) =="Normal":
  36. Normal.append(i)
  37. elif str(i.category) =='hybrid-API-multimode' and str(i.priority) =="High":
  38. High.append(i)
  39. elif str(i.category) =='hybrid-API-multimode' and str(i.priority) =="Urgent":
  40. Urgent.append(i)
  41. elif str(i.category) =='hybrid-API-multimode' and str(i.priority) =="Immediate":
  42. Immediate.append(i)
  43. if str(i.category) =='hybrid-API-multimode' and str(i.status) == "New":
  44. openlist.append(i)
  45. if str(i.category) =='hybrid-API-multimode' and str(i.status) != "New":
  46. colselist.append(i)
  47. except Exception, e:
  48. print e
  49. return len(Low),len(Normal),len(High),len(Urgent),len(Immediate),len(openlist),len(colselist)
  50. #获取search的数据
  51. def hybrid_API_serach():
  52. Low = []
  53. Normal = []
  54. High =[]
  55. Urgent =[]
  56. Immediate = []
  57. openl=[]
  58. colsel =[]
  59. for i in set_Redmine():
  60. try:
  61. if str(i.category) =='hybrid-API-serach' and str(i.priority) =="Low":
  62. Low.append(i)
  63. elif str(i.category) =='hybrid-API-serach' and str(i.priority) =="Normal":
  64. Normal.append(i)
  65. elif str(i.category) =='hybrid-API-serach' and str(i.priority) =="High":
  66. High.append(i)
  67. elif str(i.category) =='hybrid-API-serach' and str(i.priority) =="Urgent":
  68. Urgent.append(i)
  69. elif str(i.category) =='hybrid-API-serach' and str(i.priority) =="Immediate":
  70. Immediate.append(i)
  71. if str(i.category) =='hybrid-API-serach' and str(i.status) =="New":
  72. openl.append(i)
  73. if str(i.category) =='hybrid-API-serach' and str(i.status) !="New":
  74. colsel.append(i)
  75. except Exception, e:
  76. print e
  77. return len(Low),len(Normal),len(High),len(Urgent),len(Immediate),len(openl),len(colsel)
  78. #获取route&traffic的数据
  79. def hybrid_API_route_traffic():
  80. Low = []
  81. Normal = []
  82. High =[]
  83. Urgent =[]
  84. Immediate = []
  85. openl=[]
  86. colsel =[]
  87. for i in set_Redmine():
  88. try:
  89. if str(i.category) =='hybrid-API-route&traffic' and str(i.priority) =="Low":
  90. Low.append(i)
  91. elif str(i.category) =='hybrid-API-route&traffic' and str(i.priority) =="Normal":
  92. Normal.append(i)
  93. elif str(i.category) =='hybrid-API-route&traffic' and str(i.priority) =="High":
  94. High.append(i)
  95. elif str(i.category) =='hybrid-API-route&traffic' and str(i.priority) =="Urgent":
  96. Urgent.append(i)
  97. elif str(i.category) =='hybrid-API-route&traffic' and str(i.priority) =="Immediate":
  98. Immediate.append(i)
  99. if str(i.category) =='hybrid-API-route&traffic' and str(i.status) =="New":
  100. openl.append(i)
  101. if str(i.category) =='hybrid-API-route&traffic' and str(i.status) !="New":
  102. colsel.append(i)
  103. except Exception, e:
  104. print e
  105. return len(Low),len(Normal),len(High),len(Urgent),len(Immediate),len(openl),len(colsel)
  106.  
  107. #设置画布
  108. def set_charvalue():
  109. width,height=600,600
  110. surface=cairo.ImageSurface(cairo.FORMAT_ARGB32,width,height)
  111. return surface
  112.  
  113. #画饼图
  114. def draw_pie(surface, options, dataSet):
  115. chart=pycha.pie.PieChart(surface,options)
  116. chart.addDataset(dataSet)
  117. chart.render()
  118. surface.write_to_png('Pie.png')
  119.  
  120. #垂直直方图
  121. def draw_vertical_bar(surface, options, dataSet):
  122. chart=pycha.bar.VerticalBarChart(surface,options)
  123. chart.addDataset(dataSet)
  124. chart.render()
  125. surface.write_to_png('vertical_bar.png')
  126.  
  127. #垂直水平直方图
  128. def draw_horizontal_bar(surface, options, dataSet):
  129. chart = pycha.bar.HorizontalBarChart(surface,options)
  130. chart.addDataset(dataSet)
  131. chart.render()
  132. surface.write_to_png('horizontal_bar.png')
  133.  
  134. #线图
  135. def draw_line(surface, options, dataSet):
  136. chart = pycha.line.LineChart(surface,options)
  137. chart.addDataset(dataSet)
  138. chart.render()
  139. surface.write_to_png('line.png')
  140.  
  141. #点图
  142. def draw_scatterplot(surface, options, dataSet):
  143. chart = pycha.scatter.ScatterplotChart(surface,options)
  144. chart.addDataset(dataSet)
  145. chart.render()
  146. surface.write_to_png('scatterplotChart.png')
  147.  
  148. #垂直块图
  149. def draw_stackedverticalbarChar(surface, options, dataSet):
  150. chart = pycha.stackedbar.StackedVerticalBarChart(surface,options)
  151. chart.addDataset(dataSet)
  152. chart.render()
  153. surface.write_to_png('stackedVerticalBarChart.png')
  154.  
  155. #垂直块图2
  156. def draw_stackweekChar(surface, options, dataSet):
  157. chart = pycha.stackedbar.StackedVerticalBarChart(surface,options)
  158. chart.addDataset(dataSet)
  159. chart.render()
  160. surface.write_to_png('stackweekChar.png')
  161.  
  162. #水平块图
  163. def draw_stackedhorizontalbarChart(surface, options, dataSet):
  164. chart = pycha.stackedbar.StackedHorizontalBarChart(surface,options)
  165. chart.addDataset(dataSet)
  166. chart.render()
  167. surface.write_to_png('stackedhorizontalbarChart.png')
  168.  
  169. def set_style(name,height,bold=False):
  170. style = xlwt.XFStyle() # 初始化样式
  171.  
  172. font = xlwt.Font() # 为样式创建字体
  173. font.name = name # 'Times New Roman'
  174. font.bold = bold
  175. font.color_index = 4
  176. font.height = height
  177.  
  178. # borders= xlwt.Borders()
  179. # borders.left= 6
  180. # borders.right= 6
  181. # borders.top= 6
  182. # borders.bottom= 6
  183.  
  184. style.font = font
  185. # style.borders = borders
  186.  
  187. return style
  188. if __name__ == '__main__':
  189. '''
  190. Function:Hybrid-BUG数据分析图
  191. Input:redmin
  192. Output: excel+PNG
  193. '''
  194. #分布图数据数据来源
  195.  
  196. mLow,mNormal,mHigh,mUrgent,mImmediate,mopen,mcolse= hybrid_API_multimode()
  197. sLow,sNormal,sHigh,sUrgent,sImmediate,sopen,scolse= hybrid_API_serach()
  198. rLow,rNormal,rHigh,rUrgent,rImmediate,ropen,rcolse= hybrid_API_route_traffic()
  199. #Hybrid-bug 整体严重情况分布图数据
  200. totaLow = mLow+sLow+rLow
  201. totalNormal = mNormal+sNormal+rNormal
  202. totalHigh = mHigh+sNormal+rHigh
  203. totalUrgent = mUrgent+sUrgent+rUrgent
  204. totalImmediate= mImmediate+sImmediate+rNormal
  205. #Hybrid bug 模块状态统计数据
  206. mtotal = mopen+mcolse
  207. stotal = sopen+scolse
  208. rtotal = ropen+rcolse
  209. #Hybrid bug weekly状态统计数据
  210. totalopen = mopen+sopen+ropen
  211. totalcolse = mcolse+scolse+rcolse
  212. totalC = totalopen+totalcolse
  213. print sopen,scolse
  214.  
  215. #画条形图
  216. dataSet1=(
  217. ('open',((0,int("%d"%mopen)),(1,int("%d"%ropen)),(2,int("%d"%sopen)))),
  218. ('close',((0,int("%d"%mcolse)),(1,int("%d"%rcolse)),(2,int("%d"%scolse)))),
  219.  
  220. )
  221.  
  222. #图像属性定义
  223. options1={
  224. 'legend':{'hide':False},
  225. 'title':'Hybrid bug 模块状态统计',
  226. 'titleColor':'#0000ff',
  227. 'titleFont':'字体',
  228. #'background':{'chartColor': '#ffffff'},
  229. 'axis':{
  230. 'x': {
  231. 'ticks': [dict(v=0, label='hybrid-API-multimode'),
  232. dict(v=1, label='hybrid-API-route&traffic'),
  233. dict(v=2, label='hybrid-API-serach'),],
  234. 'label': 'Items',
  235. 'labelColor':'#0000C6'
  236. },
  237. 'y': {
  238. 'tickCount':8,
  239. 'label': 'status',
  240. 'labelColor':'#0000C6'}
  241. },
  242. 'background': {
  243. 'chartColor': '#ffffff', #图表背景色
  244. 'baseColor': '#ffffff', #边框颜色
  245. 'lineColor': '#E0E0E0' #横线颜色
  246. },
  247. 'colorScheme': {
  248. 'name': 'fixed',
  249. 'args': {
  250. 'colors': ['#A42D00', '#227700'], #图表颜色
  251. },
  252. },
  253. }
  254.  
  255. #画饼图
  256. dataSet2=(
  257. ('Low',((0,int("%d"%totaLow)),(1,int("%d"%totaLow)))),
  258. ('Normal',((0,int("%d"%totalNormal)),(1,int("%d"%totalNormal)))),
  259. ('High',((0,int("%d"%totalHigh)),(1,int("%d"%totalHigh)))),
  260. ('Urgent',((0,int("%d"%totalUrgent)),(1,int("%d"%totalUrgent)))),
  261. ('Immediate',((0,int("%d"%totalImmediate)),(1,int("%d"%totalImmediate)))),
  262.  
  263. )
  264.  
  265. #图像属性定义
  266. options2={
  267. 'legend':{'hide':False},
  268. 'title':'Hybrid bug 模块状态统计',
  269. 'titleColor':'#0000ff',
  270. 'titleFont':'字体',
  271. #'background':{'chartColor': '#ffffff'},
  272. 'axis':{'labelColor':'#FF0088'},
  273. 'background': {
  274. 'chartColor': '#ffffff', #图表背景色
  275. 'baseColor': '#ffffff', #边框颜色
  276. 'lineColor': '#E0E0E0' #横线颜色
  277. },
  278. 'colorScheme': {
  279. 'name': 'fixed',
  280. 'args': {
  281. 'colors': ['#FF5511', '#A42D00','#227700','#0066FF','#99FF33'], #图表颜色
  282. },
  283. },
  284.  
  285. }
  286. #画week图
  287. dataSet3=(
  288. ('open',((0,int("%d"%totalopen)),(1,int("%d"%totalopen)),(2,0))),
  289. ('close',((0,int("%d"%totalcolse)),(1,int("%d"%totalcolse)),(2,0))),
  290.  
  291. )
  292.  
  293. #图像属性定义
  294. LastWeek = float(time.strftime("%W"+'.5'))-1
  295. ThisWeek = float(time.strftime("%W"+'.5'))
  296. NextWeek = float(time.strftime("%W"+'.5'))+1
  297.  
  298. options3={
  299. 'legend':{'hide':False},
  300. 'title':'Hybrid weekly状态统计',
  301. 'titleColor':'#0000ff',
  302. 'titleFont':'字体',
  303. #'background':{'chartColor': '#ffffff'},
  304. 'axis':{
  305. 'x': {
  306. 'ticks': [dict(v=0, label='%s'%LastWeek),
  307. dict(v=1, label='%s'%ThisWeek),
  308. dict(v=2, label='%s'%NextWeek),],
  309. 'label': 'Items',
  310. 'labelColor':'#0000C6'
  311. },
  312. 'y': {
  313. 'tickCount':8,
  314. 'label': 'status',
  315. 'labelColor':'#0000C6'}
  316. },
  317. 'background': {
  318. 'chartColor': '#ffffff', #图表背景色
  319. 'baseColor': '#ffffff', #边框颜色
  320. 'lineColor': '#E0E0E0' #横线颜色
  321. },
  322. 'colorScheme': {
  323. 'name': 'fixed',
  324. 'args': {
  325. 'colors': ['#A42D00', '#227700'], #图表颜色
  326. },
  327. },
  328.  
  329. }
  330. surface = set_charvalue()
  331.  
  332. #根据需要调用不同函数画不同形状的图
  333. draw_pie(surface, options2, dataSet2)
  334. #draw_vertical_bar(surface, options, dataSet)
  335. #draw_horizontal_bar(surface, options, dataSet)
  336. #draw_scatterplot(surface, options, dataSet)
  337. draw_stackedverticalbarChar(surface, options1, dataSet1)
  338. #draw_stackweekChar(surface, options3, dataSet3)
  339. draw_stackedhorizontalbarChart(surface, options3, dataSet3)
  340. #draw_pie(surface, options, dataSet)
  341. f = xlwt.Workbook() #创建工作簿
  342. #创建sheet1
  343. sheet1 = f.add_sheet(u'整体严重情况分布图',cell_overwrite_ok=True) #创建sheet2
  344. row0 = [u'优先级&模块','hybrid-API-multimode','hybrid-API-route&traffic',u'hybrid-API-serach',u'总计']
  345. column0 = ['Low','Normal','High','Urgent','Immediate',]
  346. #生成第一行
  347. for i in range(0,len(row0)):
  348. sheet1.write(0,i,row0[i],set_style('Times New Roman',220,True))
  349. #生成第一列
  350. for i in range(0,len(column0)):
  351. sheet1.write(i+1,0,column0[i],set_style('Times New Roman',220))
  352.  
  353. sheet1.write(1,1,mLow),sheet1.write(1,2,rLow),sheet1.write(1,3,sLow),sheet1.write(1,4,totaLow)
  354. sheet1.write(2,1,mNormal),sheet1.write(2,2,rNormal),sheet1.write(2,3,sNormal),sheet1.write(2,4,totalNormal)
  355. sheet1.write(3,1,mHigh),sheet1.write(3,2,rHigh),sheet1.write(3,3,sHigh),sheet1.write(3,4,totalHigh)
  356. sheet1.write(4,1,mUrgent),sheet1.write(4,2,rUrgent),sheet1.write(4,3,sUrgent),sheet1.write(4,4,totalUrgent)
  357. sheet1.write(5,1,mImmediate),sheet1.write(5,2,rImmediate),sheet1.write(5,3,sImmediate),sheet1.write(5,4,totalImmediate)
  358.  
  359. sheet2 = f.add_sheet(u'bug模块状态统计',cell_overwrite_ok=True) #创建sheet2
  360. row0 = [u'模块&状态','OPEN','CLOSE',u'总计']
  361. column0 = ['hybrid-API-multimode','hybrid-API-route&traffic','hybrid-API-serach']
  362. #生成第一行
  363. for i in range(0,len(row0)):
  364. sheet2.write(0,i,row0[i],set_style('Times New Roman',220,True))
  365. #生成第一列
  366. for i in range(0,len(column0)):
  367. sheet2.write(i+1,0,column0[i],set_style('Times New Roman',220))
  368. sheet2.write(1,1,mopen),sheet2.write(1,2,mcolse),sheet2.write(1,3,mtotal)
  369. sheet2.write(2,1,ropen),sheet2.write(2,2,rcolse),sheet2.write(2,3,rtotal)
  370. sheet2.write(3,1,sopen),sheet2.write(3,2,scolse),sheet2.write(3,3,stotal)
  371.  
  372. sheet3 = f.add_sheet(u'weekly状态统计',cell_overwrite_ok=True) #创建sheet2
  373. row0 = [u'总量\周','CW%s'%LastWeek,'CW%s'%ThisWeek,'CW%s'%NextWeek]
  374. column0 = ['OPEN','CLOSE',u'BUG总量']
  375. #生成第一行
  376. for i in range(0,len(row0)):
  377. sheet3.write(0,i,row0[i],set_style('Times New Roman',220,True))
  378. #生成第一列
  379. for i in range(0,len(column0)):
  380. sheet3.write(i+1,0,column0[i],set_style('Times New Roman',220,True))
  381. sheet3.write(1,1,totalopen),sheet3.write(1,2,totalopen),sheet3.write(1,3,'')
  382. sheet3.write(2,1,totalcolse),sheet3.write(2,2,totalcolse),sheet3.write(2,3,'')
  383. sheet3.write(3,1,totalC),sheet3.write(3,2,totalC),sheet3.write(3,3,'')
  384.  
  385. #sheet1.write_merge(7,7,2,4,) #合并列单元格
  386. #sheet1.write_merge(1,2,4,4,) #合并行单元格
  387. _data =time.strftime("%Y_%m_%d", time.localtime())
  388. LastWeek1 = float(time.strftime("%W"+'.5'))
  389. f.save(r'Ninja Project Bug Statistical Analysis Report_CW%s_%s.xls'%(LastWeek,_data))

从BUG工具redmine上获取数据后借助python模块pycha 画出BUG分析类报表的更多相关文章

  1. ajax异步获取数据后动态向表格中添加数据(行)

    因为某些原因,项目中突然需要做自己做个ajax异步获取数据后动态向表格中添加数据的页面,网上找了半天都没有 看到现成的,决定自己写个例子 1.HTML页面 <!doctype html> ...

  2. HTTP请求(GET与POST区别)和响应(get是从服务器上获取数据,post是向服务器传送数据,格式与举例都非常清楚)

    HTTP有两部分组成:请求与响应,下面分别整理. 一.HTTP请求 1.HTTP请求格式: <request line> <headers> <blank line> ...

  3. easyui-numberbox后台获取数据后,鼠标一点击就自动清空了

    <input type="text" name="txtMeterInitData" id="txtMeterInitData" cl ...

  4. IE浏览器上传文件后返回结果会自动弹出下载框

    服务器使用的是node,其它语言的后台没测试过. 在IE低版本浏览器下,当你上传一个文件后后台会返回一些数据,但是IE浏览器会弹出下载提示. 这个问题是之前处理的了,没有细究,今天有人问到这个问题,顺 ...

  5. ajax获取数据后怎么去渲染到页面?

    $.ajax({ url:"apiAttachmentAction_uploadAttachment.action", type:"post", data:fo ...

  6. bootstrap table 获取数据后的前台页面(后台怎么传就不必详细说明了吧)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ t ...

  7. ui-grid从后端获取数据后更改数据显示的格式

    从后端获取的数据时是这样的: { "TotalCount":14,"Items": [ { "ProfileId":14, "Na ...

  8. angular异步获取数据后在ngOnInit中无法获取,显示undefined解决办法

    两种方法 1 通过*ngif动态加载要数据渲染的dom 2 通过路由导航resolve 第一种感觉太麻烦了,要是一个页面请求多个接口,那就不得不写多个*ngif,本人还是更倾向与第二种发法 具体步骤: ...

  9. Nhibernet Get方法获取数据后,修改字段,未保存,但是数据库的数据却同步了

    首先,对象是在session中取得的,所以这个对象已经和数据库同步了,或者说相关联了如果你的session中的对象发生变法,提交事务后,数据库中的数据也会更新未保存更改,不要以为session就不会在 ...

随机推荐

  1. u-boot移植总结(四)u-boot-2010.09框架分析

    (一)本次移植是基于FL2440,板子的基本硬件: CPU 型号为S3C2440,基于ARM920T,指令集ARMV4,时钟主频400MHz SDRAM H57V2562GTR-75C 2片*32MB ...

  2. [小北De编程手记] : Lesson 08 - Selenium For C# 之 PageFactory & 团队构建

    本文想跟大家分享的是Selenium对PageObject模式的支持和自动化测试团队的构建.<Selenium For C#>系列的文章写到这里已经接近尾声了,如果之前的文章你是一篇篇的读 ...

  3. C# WM_NCMOUSELEAVE 消息触发

    public static extern bool TrackMouseEvent([In, Out] TRACKMOUSEEVENT lpEventTrack); [DllImport(" ...

  4. Android5.0新特性——Material Design简介

    Material Design Material Design简介 Material Design是谷歌新的设计语言,谷歌希望寄由此来统一各种平台上的用户体验,Material Design的特点是干 ...

  5. Gulp-前端进阶A-3---如何不刷新监控文件变化?

    npm install --save-dev gulp-connect npm install --save-dev gulp-livereload npm其他,前面已有 var gulp = req ...

  6. innerHtml and Jquery.html()

    1. innerHtml是Dom HTML的属性 是只读的,不能写入. 2. JQuery只能调用.html(),它可以加参数,改变原HTML内容. http://api.jquery.com/htm ...

  7. JavaScript焦点轮播图

    在慕课学习了JavaScript焦点轮播图特效,在此做一个整理. 首先是html结构,我用的是本地同文件夹下的三张图片,多出来的第一张(pic3副本)和最后一张图片(pic1副本)是为了实现无缝切换效 ...

  8. 优化ABAP性能(摘录)

    1.使用where语句不推荐Select * from zflight.Check : zflight-airln = ‘LF’ and zflight-fligh = ‘BW222’.Endsele ...

  9. [ html canvas createImageData 创建万花筒效果 ] canvas绘图属性 createImageData 属性讲解 及创建万花筒效果

    <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...

  10. Volley网络连接

    一.Volley a burst or emission of many things or a large amount at once Volley是Android平台上的网络通信库,能使网络通信 ...