From e59c8ca4a2e2bc27f4b2a62d663425c7e4a3ec82 Mon Sep 17 00:00:00 2001 From: Mattia Verga Date: Apr 08 2020 08:51:35 +0000 Subject: Add reviewers list page Signed-off-by: Mattia Verga --- diff --git a/review_stats/scripts/review_stats.py b/review_stats/scripts/review_stats.py index 7e4437f..666b64e 100644 --- a/review_stats/scripts/review_stats.py +++ b/review_stats/scripts/review_stats.py @@ -37,8 +37,8 @@ from review_stats import log, __version__ as version from review_stats.logging import setup_logging from review_stats.utils import ( bug_time, bz_connect, copy_static_content, generate_page, get_bz_baseurl, - get_hidden, get_in_progress, get_reviewable, get_reviewable_epel, get_top_blockers, - get_top_submitters, order_by_month, run_query) + get_hidden, get_in_progress, get_reviewable, get_reviewable_epel, get_reviewers, + get_top_blockers, get_top_submitters, order_by_month, run_query) @click.command() @@ -157,11 +157,19 @@ def make_page(configfile, templdir, staticdir, dirname, systemd_log, loglevel): # Top submitters top_submitters = get_top_submitters(bz_tickets) counters['submitters'] = len(top_submitters) - generate_page(env, 'submitters.html', dirname, 'submitters.html', + generate_page(env, 'by_user.html', dirname, 'submitters.html', page_title='All review tickets sorted by submitter', - submitters=top_submitters, + users=top_submitters, count=counters['submitters']) + # Reviewers + reviewers = get_reviewers(bz_tickets) + counters['reviewers'] = len(reviewers) + generate_page(env, 'by_user.html', dirname, 'reviewers.html', + page_title='Review tickets sorted by assigned reviewer', + users=reviewers, + count=counters['reviewers']) + # Finally, generate the index page generate_page(env, 'index.html', dirname, 'index.html', counters=counters) diff --git a/review_stats/static/review_stats.css b/review_stats/static/review_stats.css index e66244d..f37a31f 100644 --- a/review_stats/static/review_stats.css +++ b/review_stats/static/review_stats.css @@ -25,7 +25,7 @@ background-color: #f2f2f2; } -#tklist .submitter{ +#tklist .user{ font-weight: bold; } diff --git a/review_stats/static/submitters_filter.js b/review_stats/static/submitters_filter.js deleted file mode 100644 index bcb1835..0000000 --- a/review_stats/static/submitters_filter.js +++ /dev/null @@ -1,31 +0,0 @@ -docReady(function() { - var ticketListContent = document.getElementById("tklist").innerHTML; - - document.getElementById("submitter_filter").classList.remove('hidden'); - - document.getElementById("submitter_filter").onsubmit = function(e) { - e.preventDefault(); - var query = document.getElementById("searchterm").value; - var submitters = document.querySelectorAll(".submitter_list"); - var ticketList = document.getElementById("tklist"); - var table_header = ticketList.querySelectorAll(".table_header")[0] - ticketList.innerHTML = ''; - ticketList.appendChild(table_header); - for (let i = 0; i < submitters.length; i++) { - var submitter = submitters[i].querySelectorAll(".submitter")[0].innerText; - if (submitter.includes(query)) { - ticketList.appendChild(submitters[i]); - } - } - document.getElementById("submit").classList.add('hidden'); - document.getElementById("reset").classList.remove('hidden'); - }; - - document.getElementById("submitter_filter").onreset = function(e) { - e.preventDefault(); - document.getElementById("tklist").innerHTML = ticketListContent; - document.getElementById("searchterm").value = ''; - document.getElementById("submit").classList.remove('hidden'); - document.getElementById("reset").classList.add('hidden'); - }; -}); diff --git a/review_stats/static/users_filter.js b/review_stats/static/users_filter.js new file mode 100644 index 0000000..55daed6 --- /dev/null +++ b/review_stats/static/users_filter.js @@ -0,0 +1,31 @@ +docReady(function() { + var ticketListContent = document.getElementById("tklist").innerHTML; + + document.getElementById("user_filter").classList.remove('hidden'); + + document.getElementById("user_filter").onsubmit = function(e) { + e.preventDefault(); + var query = document.getElementById("searchterm").value; + var users = document.querySelectorAll(".user_list"); + var ticketList = document.getElementById("tklist"); + var table_header = ticketList.querySelectorAll(".table_header")[0] + ticketList.innerHTML = ''; + ticketList.appendChild(table_header); + for (let i = 0; i < users.length; i++) { + var user = users[i].querySelectorAll(".user")[0].innerText; + if (user.includes(query)) { + ticketList.appendChild(users[i]); + } + } + document.getElementById("submit").classList.add('hidden'); + document.getElementById("reset").classList.remove('hidden'); + }; + + document.getElementById("user_filter").onreset = function(e) { + e.preventDefault(); + document.getElementById("tklist").innerHTML = ticketListContent; + document.getElementById("searchterm").value = ''; + document.getElementById("submit").classList.remove('hidden'); + document.getElementById("reset").classList.add('hidden'); + }; +}); diff --git a/review_stats/templates/by_user.html b/review_stats/templates/by_user.html new file mode 100644 index 0000000..4a03896 --- /dev/null +++ b/review_stats/templates/by_user.html @@ -0,0 +1,69 @@ +{% extends "base.html" %} + +{% block title %}{{ super() }} - {{ page_title }}{% endblock %} + +{% block bodycontent %} +

{{ page_title }}

+ + + + + + + + + + + + + + + + + + + + +
Table colors legend
 In progress
 Hidden
 Blocked
 Inconsistent state
+

Last Update: {{ now().strftime('%Y-%m-%d %H:%M:%S') }} UTC (v{{ version }}).
+There are {{ count }} unique users.

+ + +
+ + + + + + + + {% for user, tickets in users.items() %} + + + + + {% for ticket in tickets %} + + + + + + + {% endfor %} + + {% endfor %} +
IDAliasLast ChangeSummary
{{ user }} ({{ tickets|length }})
{{ ticket.bug.id }}{{ ticket.bug.alias|join(', ') }}{{ ticket.last_modified.strftime('%Y-%m-%d %H:%M:%S') }}{{ ticket.bug.summary }}
+
+ +{% endblock %} +{% block javascript %} + +{% endblock %} diff --git a/review_stats/templates/index.html b/review_stats/templates/index.html index bae1535..f91848f 100644 --- a/review_stats/templates/index.html +++ b/review_stats/templates/index.html @@ -43,6 +43,10 @@ available:

Top submitters ({{ counters['submitters'] }}) All review tickets sorted by submitter. + + Top reviewers ({{ counters['reviewers'] }}) + Review tickets sorted by assigned reviewer. +

Last updated: {{ now().strftime('%Y-%m-%d %H:%M:%S') }} UTC (v{{ version }}).

diff --git a/review_stats/templates/submitters.html b/review_stats/templates/submitters.html deleted file mode 100644 index b721d49..0000000 --- a/review_stats/templates/submitters.html +++ /dev/null @@ -1,69 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ super() }} - {{ page_title }}{% endblock %} - -{% block bodycontent %} -

{{ page_title }}

- - - - - - - - - - - - - - - - - - - - -
Table colors legend
 In progress
 Hidden
 Blocked
 Inconsistent state
-

Last Update: {{ now().strftime('%Y-%m-%d %H:%M:%S') }} UTC (v{{ version }}).
-There are {{ count }} unique submitters.

- - -
- - - - - - - - {% for submitter, tickets in submitters.items() %} - - - - - {% for ticket in tickets %} - - - - - - - {% endfor %} - - {% endfor %} -
IDAliasLast ChangeSummary
{{ submitter }} ({{ tickets|length }})
{{ ticket.bug.id }}{{ ticket.bug.alias|join(', ') }}{{ ticket.last_modified.strftime('%Y-%m-%d %H:%M:%S') }}{{ ticket.bug.summary }}
-
- -{% endblock %} -{% block javascript %} - -{% endblock %} diff --git a/review_stats/utils.py b/review_stats/utils.py index 5a56982..47358f5 100644 --- a/review_stats/utils.py +++ b/review_stats/utils.py @@ -169,6 +169,22 @@ def get_top_submitters(tklist): key=lambda item: len(item[1]), reverse=True)} +def get_reviewers(tklist): + """Return a dictionary with counters about reviewers.""" + + reviewers = dict() + for tk in tklist: + assignee = tk.bug.assigned_to + if assignee is None or assignee == 'nobody@fedoraproject.org': + continue + if assignee not in reviewers: + reviewers[assignee] = [tk] + else: + reviewers[assignee].append(tk) + return {k: v for k, v in sorted(reviewers.items(), + key=lambda item: len(item[1]), reverse=True)} + + def generate_page(env, tmplt_name, destdir, page_name, *args, **kwargs): """Generate HTML page.""" filename = os.path.join(destdir, page_name)