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() %}
+
+
+ {{ user }} ({{ tickets|length }}) |
+
+ {% for ticket in tickets %}
+
+ {{ ticket.bug.id }} |
+ {{ ticket.bug.alias|join(', ') }} |
+ {{ ticket.last_modified.strftime('%Y-%m-%d %H:%M:%S') }} |
+ {{ ticket.bug.summary }} |
+
+ {% endfor %}
+
+ {% endfor %}
+
+
+
+{% 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:
All review tickets sorted by submitter. |
+
+
+ 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() %}
-
-
- {{ submitter }} ({{ tickets|length }}) |
-
- {% for ticket in tickets %}
-
- {{ ticket.bug.id }} |
- {{ ticket.bug.alias|join(', ') }} |
- {{ ticket.last_modified.strftime('%Y-%m-%d %H:%M:%S') }} |
- {{ ticket.bug.summary }} |
-
- {% endfor %}
-
- {% endfor %}
-
-
-
-{% 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)