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 进行中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")



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

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

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

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值