mirror of
https://github.com/peeringdb/peeringdb.git
synced 2024-05-11 05:55:09 +00:00
* Do not show objects in status "pending" on the UI #784 * Fix peeringdb.js bug introduced in #784 * 500 Error during login for 2FA enabled accounts with unverified email address #996 * Django-Admin: adding a network with existing asn fails with internal error #1035 * Some command-line-tool executions are not logged #1119 * Ops: API throttling of repeated requests #1126 * Ops: response header X-Auth-ID to augment logging #1120 * Allow rate-limiting of melissa enabled api functionality. #1124 * State / Province normalization #1079 * Log melissa requests #1122 * remove debug messages * bump django-handleref to 1.0.2 * Need consolidated app logs #845 * pin django peeringdb to 2.13 and relock poetry * pin django-restframework-apikey to 2.1.0 * linting * migrations * docs regenerate * docs * linting Co-authored-by: David Poarch <dpoarch@20c.com> Co-authored-by: Stefan Pratter <stefan@20c.com>
35 lines
937 B
Python
35 lines
937 B
Python
from rest_framework.exceptions import Throttled
|
|
from rest_framework.views import exception_handler
|
|
|
|
|
|
def format_wait_time(wait_time):
|
|
"""
|
|
Format wait time in seconds to human readable format
|
|
"""
|
|
if wait_time < 60:
|
|
return f"{wait_time} seconds"
|
|
elif wait_time < 3600 and wait_time > 60:
|
|
return f"{wait_time // 60} minutes"
|
|
else:
|
|
return f"{wait_time // 3600} hours"
|
|
|
|
|
|
def rest_exception_handler(exc, context):
|
|
|
|
response = exception_handler(exc, context)
|
|
request = context.get("request")
|
|
|
|
if isinstance(exc, Throttled):
|
|
message = getattr(
|
|
request,
|
|
"throttle_response_message",
|
|
"Request was throttled. Expected available in {time}.",
|
|
)
|
|
custom_response_data = {
|
|
"message": f"{message}".replace("{time}", format_wait_time(exc.wait)),
|
|
}
|
|
|
|
response.data = custom_response_data
|
|
|
|
return response
|