Mercurial > p > roundup > code
annotate scripts/weekly-report @ 8408:e882a5d52ae5
refactor: move RateLimitExceeded to roundup.cgi.exceptions
RateLimitExceeded is an HTTP exception that raises code 429. Move it
to roundup.cgi.exceptions where all the other exceptions that result
in http status codes are located. Also make it inherit from
HTTPException since it is one.
Also add docstrings for all HTTP exceptions and order HTTPExceptions
by status code.
BREAKING CHANGE: if somebody is importing RateLimitExceeded they will
need to change their import. I consider it unlikely anybody is using
RateLimitExceeded. Detectors and extensions are unlikely to raise
RateLimitExceeded. So I am leaving it out of the upgrading doc. Just
doc in change log.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Sun, 10 Aug 2025 21:27:06 -0400 |
| parents | 20ab9a4b76e9 |
| children | 9c3ec0a5c7fc |
| rev | line source |
|---|---|
| 4041 | 1 #! /usr/bin/env python |
| 3764 | 2 |
| 3 # This script generates a simple report outlining the activity in one | |
| 4 # tracker for the most recent week. | |
| 5 | |
|
7785
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
6 # A second argument is the negative interval to change period |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
7 # of time. |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
8 |
| 3764 | 9 # This script is free software, you may redistribute it |
| 10 # and/or modify under the same terms as Python. | |
| 11 | |
|
7785
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
12 #Example output |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
13 #CREATED: |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
14 #2702: new item |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
15 # |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
16 #RESOLVED: |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
17 #1995: Where is my Power plugs |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
18 #2501: Can you help me with Sanity |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
19 #459: I need Sanity |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
20 # |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
21 #TOP TEN MOST DISCUSSED: |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
22 #2 - 491: Can you help me with Sanity |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
23 #1 - 1995: Where is my Power plugs |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
24 |
|
5412
c75defc1c2f0
Python 3 preparation: miscellaneous Python scripts not named *.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
4041
diff
changeset
|
25 from __future__ import print_function |
|
7785
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
26 |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
27 import sys |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
28 |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
29 from roundup import date, instance |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
30 |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
31 # position for arguments |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
32 tracker_home_pos = 1 |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
33 optional_interval_pos = 2 |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
34 |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
35 # gather args |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
36 arg_len = len(sys.argv) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
37 # map pos to length by adding 1. |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
38 if arg_len not in [tracker_home_pos + 1, optional_interval_pos + 1]: |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
39 print('Usage: %s tracker-home [interval -1w]' % sys.argv[0]) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
40 if (arg_len < tracker_home_pos + 1 ): |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
41 print(' You need to specify a tracker home directory') |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
42 sys.exit(1) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
43 instance_home = sys.argv[tracker_home_pos] |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
44 lookback_interval = sys.argv[optional_interval_pos] if \ |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
45 len(sys.argv) == optional_interval_pos + 1 else '-1w' |
| 3764 | 46 |
| 47 # open the instance | |
| 48 instance = instance.open(instance_home) | |
| 49 db = instance.open('admin') | |
| 50 | |
|
7785
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
51 old = date.Date(lookback_interval) |
| 3764 | 52 |
|
7785
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
53 created = [] # [issue_id_created_issue] |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
54 summary = {} # {status_id: [issue_ids in that status]} |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
55 messages = [] # [(number_of_messages, issue_id)] |
| 3764 | 56 |
| 57 # loop through all the recently-active issues | |
| 58 for issue_id in db.issue.filter(None, {'activity': '-1w;'}): | |
|
7785
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
59 message_count = 0 |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
60 for _x,ts,_userid,action,data in db.issue.history(issue_id): |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
61 if ts < old: # history occurred before our current window |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
62 continue |
| 3764 | 63 if action == 'create': |
| 64 created.append(issue_id) | |
|
5412
c75defc1c2f0
Python 3 preparation: miscellaneous Python scripts not named *.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
4041
diff
changeset
|
65 elif action == 'set' and 'messages' in data: |
|
7785
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
66 message_count += 1 |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
67 summary.setdefault(db.issue.get(issue_id, 'status'), |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
68 []).append(issue_id) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
69 messages.append((message_count, issue_id)) |
| 3764 | 70 |
|
7785
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
71 #print('STATUS SUMMARY:') |
| 3764 | 72 #for k,v in summary.items(): |
|
7785
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
73 # print(k, len(v)) |
| 3764 | 74 |
|
5412
c75defc1c2f0
Python 3 preparation: miscellaneous Python scripts not named *.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
4041
diff
changeset
|
75 print('\nCREATED:') |
|
7785
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
76 if created: |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
77 print('\n'.join(['%s: %s'%(itemid, db.issue.get(itemid, 'title')) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
78 for itemid in created])) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
79 else: |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
80 print("No issue created in interval %s" % lookback_interval) |
| 3764 | 81 |
|
5412
c75defc1c2f0
Python 3 preparation: miscellaneous Python scripts not named *.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
4041
diff
changeset
|
82 print('\nRESOLVED:') |
| 3764 | 83 resolved_id = db.status.lookup('resolved') |
|
7785
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
84 if summary: |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
85 # deduplicate - duplicates happen when issue with resolved status |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
86 # has multiple history items (e.g. message or other |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
87 # change after resolution) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
88 resolved_ids = sorted(set(summary.get(resolved_id, [])), key=int) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
89 print('\n'.join(['%s: %s' % (itemid, db.issue.get(itemid, 'title')) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
90 for itemid in resolved_ids ])) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
91 else: |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
92 print("No issue resolved in interval %s" % lookback_interval) |
| 3764 | 93 |
|
5412
c75defc1c2f0
Python 3 preparation: miscellaneous Python scripts not named *.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
4041
diff
changeset
|
94 print('\nTOP TEN MOST DISCUSSED:') |
|
7785
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
95 |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
96 # filter out issues with no messages |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
97 messages = [ message for message in messages if message[0] > 0 ] |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
98 if messages: |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
99 messages.sort() |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
100 messages.reverse() |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
101 nmax = messages[0][0] or 1 |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
102 fmt = '%%%dd - %%s: %%s'%(len(str(nmax))) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
103 print('\n'.join([fmt%(num, itemid, db.issue.get(itemid, 'title')) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
104 for num, itemid in messages[:10]])) |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
105 else: |
|
20ab9a4b76e9
fix: multiple fixes, lint cleanup
John Rouillard <rouilj@ieee.org>
parents:
5412
diff
changeset
|
106 print("No issues discussed in interval %s" % lookback_interval) |
| 3764 | 107 |
| 108 # vim: set filetype=python ts=4 sw=4 et si |
