打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python-redmine 缺陷数据的分析——转

python-redmine 缺陷数据的分析

想要一份关于缺陷ticket的反馈次数和缺陷来往情况,做一个简单的redmine缺陷分析报表

如何开始呢,思考历程写下来:

1.首先考虑是否可以从内部获取数据,听说redmine的数据库是Mysql,但是我没有账号和权限

2.在一个查看是否提供接口,可以直接获取,登陆啥的是个麻烦事儿,界面化太麻烦(能力有限,且耗时)

3.python的支持库

4.爬虫

优选1.3,其次是4,最差2了

下载python-redmine 在下载页有少许的入门介绍,我也做少许的介绍吧

一 . 首先是定位项目筛选信息

如图看到的箭头指向,便是你的项目

定位项目之后,可以拿到项目下的所有的ticket,如图中的第2点;其中某一条数据如3

再一个是filter函数,可以帮助我们去筛选我们想要的版本或者其他状态的ticket

issues = list(redmine.issue.filter(project_id=46, tracker_id=1, status_id='*', fixed_version_id=387))

通过list将所有筛选的ticket组装成列表,便是获得了我们要分析的数据

打开你的debug,采用Evaluate查看信息

 

你可以挨个打开看看里面都记录的是什么内容,从而提取你想要得到的信息

二. 数据处理

需求1:得到每个ticket的状态变化

redmine中的状态都是用123456去表示的状态,所以我们需要一个转换函数,对得到的状态进行装换

  1. # 新建1 进行中2 已解决3 不处理 4 反馈 5 阻塞6 已关闭7 已指派8 不处理9 重新打开10 已验证12

  2. def change_value(num):

  3. switch = {

  4. '1': "新建", #已确定

  5. '2': "进行中", #已确定

  6. '3': "已解决", #已确定

  7. '4': "反馈", # 已确定

  8. '5': "已关闭", #已确定

  9. '6': "已拒绝",

  10. '7': "推迟", #已确定

  11. '8': "已指派", #已确定

  12. '9': "不处理", #已确定

  13. '10': "重新打开", # 已确定

  14. '11':"阻塞", #已确定

  15. '12': "已验证", #已确定

  16. }

  17. return switch.get(num,'未知信息')

当时,为了获取这个信息,还专门去创建了一个所有状态交互的ticket

需求2:将人员之间的交互流程以箭头的方式进行体现,同时相邻的人员同名算作一个

  1. # details 从issue.journals获取,name是issue.journals.resources[x].user.name

  2. def get_history_message(details,name):

  3. values = []

  4. name_value = []

  5. for value in details:

  6. if value.get('name')== 'status_id':

  7. old_value = value.get('old_value',None)

  8. new_value = value.get('new_value',None)

  9. if old_value and new_value:

  10. if old_value.isdigit() == True and new_value.isdigit() == True:

  11. values.append([change_value(old_value),change_value(new_value)])

  12. name_value = [name,values]

  13. return name_value

  14. #传入所有的交互人员list进行相邻去重

  15. def de_weightlist(list):

  16. a = None

  17. list2 = []

  18. for i in list:

  19. if i != a:

  20. list2.append(i)

  21. a = i

  22. return list2

需求3:统计筛选过的人员的角色和反馈次数,并降序排

  1. def statics(list):

  2. name_feedback = []

  3. name_list = []

  4. for line in list:

  5. a = line[0][0]

  6. name_list.append(a)

  7. feedback=len([j for line in list for i in line[0][1] for j in i if j=="反馈"])

  8. result = Counter(name_list)

  9. sort_list = sorted(result.items(), key=lambda x: x[1], reverse=True)

  10. name_feedback = [sort_list,feedback]

  11. return name_feedback

具体的实现由具体的需求决定,这里只是我的一个实例,希望对大家有所帮助

贴上完整的代码:

  1. from redminelib import Redmine

  2. import csv

  3. from collections import Counter

  4. redmine = Redmine('http://xxx.xxx.xx:888', username='username', password='******')

  5. issues = list(redmine.issue.filter(project_id=123, tracker_id=1, status_id='*', fixed_version_id=123))

  6. # 新建1 进行中2 已解决3 不处理 4 反馈 5 阻塞6 已关闭7 已指派8 不处理9 重新打开10 已验证12

  7. def change_value(num):

  8. switch = {

  9. '1': "新建", #已确定

  10. '2': "进行中", #已确定

  11. '3': "已解决", #已确定

  12. '4': "反馈", # 已确定

  13. '5': "已关闭", #已确定

  14. '6': "已拒绝",

  15. '7': "推迟", #已确定

  16. '8': "已指派", #已确定

  17. '9': "不处理", #已确定

  18. '10': "重新打开", # 已确定

  19. '11':"阻塞", #已确定

  20. '12': "已验证", #已确定

  21. }

  22. return switch.get(num,'未知信息')

  23. def get_history_message(details,name):

  24. values = []

  25. name_value = []

  26. for value in details:

  27. if value.get('name')== 'status_id':

  28. old_value = value.get('old_value',None)

  29. new_value = value.get('new_value',None)

  30. if old_value and new_value:

  31. if old_value.isdigit() == True and new_value.isdigit() == True:

  32. # massage = ""

  33. # old_value1=change_value(old_value)

  34. # new_value1=change_value(new_value)

  35. #values.append(["将\""+change_value(old_value)+"\"改成\""+change_value(new_value)+"\""])

  36. values.append([change_value(old_value),change_value(new_value)])

  37. name_value = [name,values]

  38. return name_value

  39. def de_weightlist(list):

  40. a = None

  41. list2 = []

  42. for i in list:

  43. if i != a:

  44. list2.append(i)

  45. a = i

  46. return list2

  47. #统计list中user和状态的次数

  48. def statics(list):

  49. name_feedback = []

  50. name_list = []

  51. for line in list:

  52. a = line[0][0]

  53. name_list.append(a)

  54. feedback=len([j for line in list for i in line[0][1] for j in i if j=="反馈"])

  55. result = Counter(name_list)

  56. sort_list = sorted(result.items(), key=lambda x: x[1], reverse=True)

  57. name_feedback = [sort_list,feedback]

  58. return name_feedback

  59. file_csv = 'E:/redmine.csv'

  60. title = [ "ID", "主题","开始日期","功能模块","创建者","ticket往返次数","每人经手次数","缺陷反馈次数","经手人(历史记录)"]

  61. out = open(file_csv,'a',newline='')

  62. csv_write = csv.writer(out,dialect='excel')

  63. csv_write.writerow(title)

  64. for issue in issues:

  65. row_massage = [] #定义行列表

  66. details = [] #定义历史记录保存列表

  67. str_connect = "->" #连接符

  68. issue_id = issue.id # ticket_ID

  69. issue_author = issue.author # 作者

  70. issue_subject = issue.subject # 主题

  71. issue_history = list(issue.journals) # 历史记录列表

  72. issue_startdate = getattr(issue, 'start_date', None) # 开始日期

  73. for i,line in enumerate(issue_history):

  74. detail = line.details

  75. user= line.user.name

  76. new_detail = get_history_message(detail, user)

  77. if i+1 == 1:

  78. details.append([new_detail, str_connect])

  79. else:

  80. if details[-1][0][0] == new_detail[0]:

  81. details[-1][0].append(new_detail[-1])

  82. else:

  83. details.append([new_detail, str_connect])

  84. muldle_msg = list(issue.custom_fields) # 功能模块所在列表

  85. nametime_feedbacklist = statics(details) #每个人在该缺陷中出现的次数和反馈次数

  86. name_sort = nametime_feedbacklist[0] #名字排名

  87. feedbanck_time = nametime_feedbacklist[-1] #反馈次数

  88. muldle = muldle_msg[-1].value # 固定位置 功能模块信息

  89. row_massage=[issue_id,issue_subject,issue_startdate,muldle,issue_author,len(details),name_sort,feedbanck_time,details]

  90. csv_write.writerow(row_massage) #写入csv

  91. print("write over")

最后得到的结果是这样的:

拿到表格你可以做一些图标之类的信息,反馈得更加明显一些

努力去尝试,相信你可以做得更好!

搜索

复制

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python中基本的读文件和简单数据处理
13个好用到起飞的Python技巧!
Python 将数据写入文件(txt、csv、excel)
使用Python求解最小公倍数
Python实现 Linux tree命令:用树形结构显示目录结构
Backtrader胜率92%策略实盘七:自动化交易
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服