Improvements to get_progress_shield (#19)

- Use passed in category_slug
- Default to {measure}/total when not specified
- Use colors with better contrast
This commit is contained in:
Luke 2022-11-21 01:33:54 -05:00 committed by GitHub
parent ba9bc093b0
commit e98cbf8159
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 21 additions and 12 deletions

View File

@ -1,6 +1,8 @@
from typing import Any
from django.db import models
from django.template.defaultfilters import title
from frog_api.exceptions import (
InvalidDataException,
NoEntriesException,
@ -96,7 +98,8 @@ class ProjectDataView(APIView):
def get_progress_shield(
request: Request, project_slug: str, version_slug: str, category_slug: str
) -> dict[str, Any]:
latest = get_latest_entry(project_slug, version_slug, "default")
latest = get_latest_entry(project_slug, version_slug, category_slug)
latest_measures = latest[0]["measures"]
project = get_project(project_slug)
version = get_version(version_slug, project)
@ -104,35 +107,41 @@ def get_progress_shield(
params = request.query_params
if not params:
raise InvalidDataException("No measure or total specified")
try:
measure = params["measure"]
numerator = latest[0]["measures"][measure]
except:
raise InvalidDataException("No measure specified")
if "measure" in params:
measure = params["measure"]
else:
raise InvalidDataException("No measure specified")
if measure not in latest_measures:
raise InvalidDataException(f"Measure '{measure}' not found")
numerator = latest_measures[measure]
label = params.get(
"label",
" ".join(
[
version.name,
category.name,
str(measure),
title(str(measure)),
]
),
)
try:
if "total" in params:
total = params["total"]
denominator = latest[0]["measures"][total]
except:
elif f"{measure}/total" in latest_measures:
total = f"{measure}/total"
else:
raise InvalidDataException("No total specified")
if total not in latest_measures:
raise InvalidDataException(f"Measure '{total}' not found")
denominator = latest_measures[total]
fraction = float(numerator) / float(denominator)
message = f"{fraction:.2%}"
color = params.get("color", "yellow" if fraction < 1.0 else "green")
color = params.get("color", "informational" if fraction < 1.0 else "success")
return {"schemaVersion": 1, "label": label, "message": message, "color": color}