From 0087ae722c8024931658786267c2abef609f47b3 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Oct 05 2020 15:28:42 +0000 Subject: Add a way to make the stats view on more than one year (if you know how to) Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/api/issue.py b/pagure/api/issue.py index 17987e3..898c12e 100644 --- a/pagure/api/issue.py +++ b/pagure/api/issue.py @@ -1590,11 +1590,17 @@ def api_view_issues_history_detailed_stats( } """ # noqa + weeks_range = flask.request.args.get("weeks_range") or 53 + try: + weeks_range = int(weeks_range) + except: + weeks_range = 53 + repo = _get_repo(repo, username, namespace) _check_issue_tracker(repo) stats = pagure.lib.query.issues_history_stats( - flask.g.session, repo, detailed=True + flask.g.session, repo, detailed=True, weeks_range=weeks_range, ) jsonout = flask.jsonify({"stats": stats}) return jsonout diff --git a/pagure/lib/query.py b/pagure/lib/query.py index 498148d..64612de 100644 --- a/pagure/lib/query.py +++ b/pagure/lib/query.py @@ -5695,7 +5695,7 @@ def update_read_only_mode(session, repo, read_only=True): session.add(repo) -def issues_history_stats(session, project, detailed=False): +def issues_history_stats(session, project, detailed=False, weeks_range=53): """ Returns the number of opened issues on the specified project over the last 365 days @@ -5721,7 +5721,7 @@ def issues_history_stats(session, project, detailed=False): .order_by(sqlalchemy.asc(model.Issue.closed_at)) .first() ) - a_year_ago = tomorrow - datetime.timedelta(days=(53 * 7)) + a_year_ago = tomorrow - datetime.timedelta(days=(weeks_range * 7)) if oldest_closed and oldest_closed.closed_at < a_year_ago: to_ignore = 0 else: @@ -5738,7 +5738,7 @@ def issues_history_stats(session, project, detailed=False): # For each week from tomorrow, get the number of open tickets output = {} - for week in range(53): + for week in range(weeks_range): end = tomorrow - datetime.timedelta(days=(week * 7)) start = end - datetime.timedelta(days=7) closed_ticket = ( diff --git a/pagure/templates/repo_stats.html b/pagure/templates/repo_stats.html index 1f67477..6d04661 100644 --- a/pagure/templates/repo_stats.html +++ b/pagure/templates/repo_stats.html @@ -60,6 +60,7 @@ var view_commits_url = "{{ url_for('ui_ns.view_commits', author='---') }}"; {% if g.issues_enabled %} +nweeks = 53; issues_history_stats_plot_call = function() { $("#commiter_list").hide(); $(".commit_trend").hide(); @@ -67,7 +68,7 @@ issues_history_stats_plot_call = function() { 'api_ns.api_view_issues_history_detailed_stats', repo=g.repo.name, username=username, - namespace=g.repo.namespace) }}"; + namespace=g.repo.namespace) }}?weeks_range=" + nweeks; var _s = $("#data_stats_spinner"); _s.html( "" diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index 5b04265..cf24810 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -4358,6 +4358,52 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): {"closed_ticket": 0, "count": 0, "open_ticket": 0}, ) + def test_api_view_issues_history_stats_detailed_invalid_range(self): + """ Test the api_view_issues_history_stats method of the flask api. """ + self.test_api_new_issue() + + output = self.app.get( + "/api/0/test/issues/history/detailed_stats?weeks_range=abc" + ) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + + self.assertEqual(list(data.keys()), ["stats"]) + self.assertEqual(len(data["stats"]), 53) + last_key = sorted(data["stats"].keys())[-1] + self.assertEqual( + data["stats"][last_key], + {"closed_ticket": 0, "count": 0, "open_ticket": 1}, + ) + for k in sorted(data["stats"].keys())[:-1]: + self.assertEqual( + data["stats"][k], + {"closed_ticket": 0, "count": 0, "open_ticket": 0}, + ) + + def test_api_view_issues_history_stats_detailed_one_week(self): + """ Test the api_view_issues_history_stats method of the flask api. """ + self.test_api_new_issue() + + output = self.app.get( + "/api/0/test/issues/history/detailed_stats?weeks_range=1" + ) + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + + self.assertEqual(list(data.keys()), ["stats"]) + self.assertEqual(len(data["stats"]), 1) + last_key = sorted(data["stats"].keys())[-1] + self.assertEqual( + data["stats"][last_key], + {"closed_ticket": 0, "count": 0, "open_ticket": 1}, + ) + for k in sorted(data["stats"].keys())[:-1]: + self.assertEqual( + data["stats"][k], + {"closed_ticket": 0, "count": 0, "open_ticket": 0}, + ) + def test_api_view_user_issues_pingou(self): """ Test the api_view_user_issues method of the flask api for pingou. """