想要一份关于缺陷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 进行中2 已解决3 不处理 4 反馈 5 阻塞6 已关闭7 已指派8 不处理9 重新打开10 已验证12
def change_value(num):
switch = {
'1': "新建", #已确定
'2': "进行中", #已确定
'3': "已解决", #已确定
'4': "反馈", # 已确定
'5': "已关闭", #已确定
'6': "已拒绝",
'7': "推迟", #已确定
'8': "已指派", #已确定
'9': "不处理", #已确定
'10': "重新打开", # 已确定
'11':"阻塞", #已确定
'12': "已验证", #已确定
}
return switch.get(num,'未知信息')
当时,为了获取这个信息,还专门去创建了一个所有状态交互的ticket
需求2:将人员之间的交互流程以箭头的方式进行体现,同时相邻的人员同名算作一个
# details 从issue.journals获取,name是issue.journals.resources[x].user.name
def get_history_message(details,name):
values = []
name_value = []
for value in details:
if value.get('name')== 'status_id':
old_value = value.get('old_value',None)
new_value = value.get('new_value',None)
if old_value and new_value:
if old_value.isdigit() == True and new_value.isdigit() == True:
values.append([change_value(old_value),change_value(new_value)])
name_value = [name,values]
return name_value
#传入所有的交互人员list进行相邻去重
def de_weightlist(list):
a = None
list2 = []
for i in list:
if i != a:
list2.append(i)
a = i
return list2
需求3:统计筛选过的人员的角色和反馈次数,并降序排
def statics(list):
name_feedback = []
name_list = []
for line in list:
a = line[0][0]
name_list.append(a)
feedback=len([j for line in list for i in line[0][1] for j in i if j=="反馈"])
result = Counter(name_list)
sort_list = sorted(result.items(), key=lambda x: x[1], reverse=True)
name_feedback = [sort_list,feedback]
return name_feedback
具体的实现由具体的需求决定,这里只是我的一个实例,希望对大家有所帮助
贴上完整的代码:
from redminelib import Redmine
import csv
from collections import Counter
redmine = Redmine('http://xxx.xxx.xx:888', username='username', password='******')
issues = list(redmine.issue.filter(project_id=123, tracker_id=1, status_id='*', fixed_version_id=123))
# 新建1 进行中2 已解决3 不处理 4 反馈 5 阻塞6 已关闭7 已指派8 不处理9 重新打开10 已验证12
def change_value(num):
switch = {
'1': "新建", #已确定
'2': "进行中", #已确定
'3': "已解决", #已确定
'4': "反馈", # 已确定
'5': "已关闭", #已确定
'6': "已拒绝",
'7': "推迟", #已确定
'8': "已指派", #已确定
'9': "不处理", #已确定
'10': "重新打开", # 已确定
'11':"阻塞", #已确定
'12': "已验证", #已确定
}
return switch.get(num,'未知信息')
def get_history_message(details,name):
values = []
name_value = []
for value in details:
if value.get('name')== 'status_id':
old_value = value.get('old_value',None)
new_value = value.get('new_value',None)
if old_value and new_value:
if old_value.isdigit() == True and new_value.isdigit() == True:
# massage = ""
# old_value1=change_value(old_value)
# new_value1=change_value(new_value)
#values.append(["将\""+change_value(old_value)+"\"改成\""+change_value(new_value)+"\""])
values.append([change_value(old_value),change_value(new_value)])
name_value = [name,values]
return name_value
def de_weightlist(list):
a = None
list2 = []
for i in list:
if i != a:
list2.append(i)
a = i
return list2
#统计list中user和状态的次数
def statics(list):
name_feedback = []
name_list = []
for line in list:
a = line[0][0]
name_list.append(a)
feedback=len([j for line in list for i in line[0][1] for j in i if j=="反馈"])
result = Counter(name_list)
sort_list = sorted(result.items(), key=lambda x: x[1], reverse=True)
name_feedback = [sort_list,feedback]
return name_feedback
file_csv = 'E:/redmine.csv'
title = [ "ID", "主题","开始日期","功能模块","创建者","ticket往返次数","每人经手次数","缺陷反馈次数","经手人(历史记录)"]
out = open(file_csv,'a',newline='')
csv_write = csv.writer(out,dialect='excel')
csv_write.writerow(title)
for issue in issues:
row_massage = [] #定义行列表
details = [] #定义历史记录保存列表
str_connect = "->" #连接符
issue_id = issue.id # ticket_ID
issue_author = issue.author # 作者
issue_subject = issue.subject # 主题
issue_history = list(issue.journals) # 历史记录列表
issue_startdate = getattr(issue, 'start_date', None) # 开始日期
for i,line in enumerate(issue_history):
detail = line.details
user= line.user.name
new_detail = get_history_message(detail, user)
if i+1 == 1:
details.append([new_detail, str_connect])
else:
if details[-1][0][0] == new_detail[0]:
details[-1][0].append(new_detail[-1])
else:
details.append([new_detail, str_connect])
muldle_msg = list(issue.custom_fields) # 功能模块所在列表
nametime_feedbacklist = statics(details) #每个人在该缺陷中出现的次数和反馈次数
name_sort = nametime_feedbacklist[0] #名字排名
feedbanck_time = nametime_feedbacklist[-1] #反馈次数
muldle = muldle_msg[-1].value # 固定位置 功能模块信息
row_massage=[issue_id,issue_subject,issue_startdate,muldle,issue_author,len(details),name_sort,feedbanck_time,details]
csv_write.writerow(row_massage) #写入csv
print("write over")
最后得到的结果是这样的:
拿到表格你可以做一些图标之类的信息,反馈得更加明显一些
努力去尝试,相信你可以做得更好!