in treeherder/webapp/api/performance_data.py [0:0]
def list(self, request, project):
repository = models.Repository.objects.get(name=project)
signature_data = PerformanceSignature.objects.filter(repository=repository).select_related(
"parent_signature__signature_hash", "option_collection", "platform"
)
parent_signature_hashes = request.query_params.getlist("parent_signature")
if parent_signature_hashes:
parent_signatures = PerformanceSignature.objects.filter(
repository=repository, signature_hash__in=parent_signature_hashes
)
signature_data = signature_data.filter(parent_signature__in=parent_signatures)
if not int(request.query_params.get("subtests", True)):
signature_data = signature_data.filter(parent_signature__isnull=True)
signature_ids = request.query_params.getlist("id")
if signature_ids:
try:
signature_data = signature_data.filter(id__in=map(int, signature_ids))
except ValueError:
return Response(
{"message": "One or more id values invalid (must be integer)"},
status=HTTP_400_BAD_REQUEST,
)
signature_hashes = request.query_params.getlist("signature")
if signature_hashes:
signature_data = signature_data.filter(signature_hash__in=signature_hashes)
frameworks = request.query_params.getlist("framework")
if frameworks:
signature_data = signature_data.filter(framework__in=frameworks)
interval = request.query_params.get("interval")
start_date = request.query_params.get("start_date") # YYYY-MM-DDTHH:MM:SS
end_date = request.query_params.get("end_date") # YYYY-MM-DDTHH:MM:SS
if interval and (start_date or end_date):
return Response(
{"message": "Provide either interval only -or- start (and end) date"},
status=HTTP_400_BAD_REQUEST,
)
if interval:
signature_data = signature_data.filter(
last_updated__gte=datetime.datetime.utcfromtimestamp(
int(time.time() - int(interval))
)
)
if start_date:
signature_data = signature_data.filter(last_updated__gte=start_date)
if end_date:
signature_data = signature_data.filter(last_updated__lte=end_date)
platform = request.query_params.get("platform")
if platform:
platforms = models.MachinePlatform.objects.filter(platform=platform)
signature_data = signature_data.filter(platform__in=platforms)
signature_map = {}
for (
id,
signature_hash,
option_collection_hash,
platform,
framework,
suite,
test,
application,
lower_is_better,
extra_options,
measurement_unit,
has_subtests,
tags,
parent_signature_hash,
should_alert,
) in signature_data.values_list(
"id",
"signature_hash",
"option_collection__option_collection_hash",
"platform__platform",
"framework",
"suite",
"test",
"application",
"lower_is_better",
"extra_options",
"measurement_unit",
"has_subtests",
"tags",
"parent_signature__signature_hash",
"should_alert",
).distinct():
signature_map[id] = signature_props = {
"id": id,
"signature_hash": signature_hash,
"framework_id": framework,
"option_collection_hash": option_collection_hash,
"machine_platform": platform,
"suite": suite,
"should_alert": should_alert,
}
if not lower_is_better:
# almost always true, save some bandwidth by assuming that by
# default
signature_props["lower_is_better"] = False
if test:
# test may be empty in case of a summary test, leave it empty
# then
signature_props["test"] = test
if application:
signature_props["application"] = application
if has_subtests:
signature_props["has_subtests"] = True
if tags:
# tags stored as charField but api returns as list
signature_props["tags"] = tags.split(" ")
if parent_signature_hash:
# this value is often null, save some bandwidth by excluding
# it if not present
signature_props["parent_signature"] = parent_signature_hash
if extra_options:
# extra_options stored as charField but api returns as list
signature_props["extra_options"] = extra_options.split(" ")
if measurement_unit:
signature_props["measurement_unit"] = measurement_unit
return Response(signature_map)