From 29b26ed793696a11a04444985837df1224e7dab7 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Wed, 20 Jan 2016 22:23:15 +0100 Subject: [PATCH] Add report showing author/reviewer stats Grouped by each contriubtor, show which patches this person is the author and reviewer of, to compare how many of each people have. --- pgcommitfest/commitfest/reports.py | 45 +++++++++++++++++++ .../commitfest/templates/commitfest.html | 7 +++ .../commitfest/templates/report_authors.html | 37 +++++++++++++++ pgcommitfest/urls.py | 1 + 4 files changed, 90 insertions(+) create mode 100644 pgcommitfest/commitfest/reports.py create mode 100644 pgcommitfest/commitfest/templates/report_authors.html diff --git a/pgcommitfest/commitfest/reports.py b/pgcommitfest/commitfest/reports.py new file mode 100644 index 0000000..20be18f --- /dev/null +++ b/pgcommitfest/commitfest/reports.py @@ -0,0 +1,45 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import Http404 +from django.contrib.auth.decorators import login_required +from django.db import connection + +from models import CommitFest + +@login_required +def authorstats(request, cfid): + cf = get_object_or_404(CommitFest, pk=cfid) + if not request.user.is_staff: + raise Http404("Only CF Managers can do that.") + + cursor = connection.cursor() + cursor.execute("""WITH patches(id,name) AS ( + SELECT p.id, name + FROM commitfest_patch p + INNER JOIN commitfest_patchoncommitfest poc ON poc.patch_id=p.id AND poc.commitfest_id=%(cid)s +), +authors(userid, authorpatches) AS ( + SELECT pa.user_id, array_agg(array_to_json(ARRAY[p.id::text, p.name])) + FROM commitfest_patch_authors pa + INNER JOIN patches p ON p.id=pa.patch_id + GROUP BY pa.user_id +), +reviewers(userid, reviewerpatches) AS ( + SELECT pr.user_id, array_agg(array_to_json(ARRAY[p.id::text, p.name])) + FROM commitfest_patch_reviewers pr + INNER JOIN patches p ON p.id=pr.patch_id + GROUP BY pr.user_id +) +SELECT first_name || ' ' || last_name || ' (' || username ||')', authorpatches, reviewerpatches +FROM (authors FULL OUTER JOIN reviewers ON authors.userid=reviewers.userid) +INNER JOIN auth_user u ON u.id=COALESCE(authors.userid, reviewers.userid) +ORDER BY last_name, first_name +""", { + 'cid': cf.id, +}) + + return render_to_response('report_authors.html', { + 'cf': cf, + 'report': cursor.fetchall(), + 'title': 'Author stats', + 'breadcrumbs': [{'title': cf.title, 'href': '/%s/' % cf.pk},], + }) diff --git a/pgcommitfest/commitfest/templates/commitfest.html b/pgcommitfest/commitfest/templates/commitfest.html index 93fb180..09b82ac 100644 --- a/pgcommitfest/commitfest/templates/commitfest.html +++ b/pgcommitfest/commitfest/templates/commitfest.html @@ -102,6 +102,13 @@
  • All authors and reviewers (open patches)
  • + +
    + + +
    {%endif%} {%endblock%} diff --git a/pgcommitfest/commitfest/templates/report_authors.html b/pgcommitfest/commitfest/templates/report_authors.html new file mode 100644 index 0000000..624e822 --- /dev/null +++ b/pgcommitfest/commitfest/templates/report_authors.html @@ -0,0 +1,37 @@ +{%extends "base.html"%} +{%load commitfest %} +{%block contents%} + + + + + + + + + + + {%for user, authorlist, reviewlist in report %} + + + + + + {%endfor%} + +
    UserAuthor ofReviewer of
    {{user}} +
      + {%for a in authorlist%} +
    • {{a.1}}
    • + {%endfor%} +
    +
    +
      + {%for r in reviewlist%} +
    • {{r.1}}
    • + {%endfor%} +
    +
    + +{%endblock%} + diff --git a/pgcommitfest/urls.py b/pgcommitfest/urls.py index 11153a1..952d8fe 100644 --- a/pgcommitfest/urls.py +++ b/pgcommitfest/urls.py @@ -21,6 +21,7 @@ urlpatterns = patterns('', url(r'^(\d+)/(\d+)/(comment|review)/', 'pgcommitfest.commitfest.views.comment'), url(r'^(\d+)/send_email/$', 'pgcommitfest.commitfest.views.send_email'), url(r'^(\d+)/\d+/send_email/$', 'pgcommitfest.commitfest.views.send_email'), + url(r'^(\d+)/reports/authorstats/$', 'pgcommitfest.commitfest.reports.authorstats'), url(r'^search/$', 'pgcommitfest.commitfest.views.global_search'), url(r'^ajax/(\w+)/$', 'pgcommitfest.commitfest.ajax.main'), -- 2.39.5