def list()

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)