久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    python-redmine 缺陷數據的分析——轉

     ala咪s 2019-11-01

    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://.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")

    最后得到的結果是這樣的:

    拿到表格你可以做一些圖標之類的信息,反饋得更加明顯一些

    努力去嘗試,相信你可以做得更好!

    搜索

    復制

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      主站蜘蛛池模板: 天天躁日日躁狠狠躁婷婷| 国产精品自在线拍国产电影| 12裸体自慰免费观看网站| 国产成人亚洲精品无码青APP| 久久国产免费观看精品3| 国产成人精彩在线视频| 精品乱码一区二区三区四区 | 又爽又黄无遮拦成人网站| 国产精品一区在线蜜臀| 国产激情无码一区二区APP| 亚洲精品宾馆在线精品酒店| 东京热TOKYO综合久久精品| 成人国产精品一区二区网站公司| 人妻少妇邻居少妇好多水在线 | 午夜在线观看免费观看 视频| 国产精品黑色丝袜在线观看| 唐人社视频呦一区二区| 中文字幕理伦午夜福利片| 无码A级毛片免费视频下载| 婷婷四房播播| 亚洲毛片不卡AV在线播放一区| 国产一区二区四区不卡| 一个人免费视频观看在线WWW| 亚洲精品无码久久一线| 夜夜爽妓女8888视频免费观看| 99久久国产成人免费网站| 亚洲国产天堂久久综合226114| 激情 自拍 另类 亚洲| 人妻中文字幕亚洲一区| 国产精品乱码久久久久久软件| 日本喷奶水中文字幕视频| 久热这里只有精品12| 成年女人18级毛片毛片免费| 人妻系列无码专区69影院| 夜夜未满十八勿进的爽爽影院| 国产AV无码专区亚洲AV漫画| 99国精品午夜福利视频不卡99| 男女性高爱潮是免费国产| 精品国产一区二区三区2021 | 亚洲 制服 丝袜 无码| 老师扒下内裤让我爽了一夜|