|
| 1 | +from http import HTTPStatus |
| 2 | +from django.http import HttpRequest |
| 3 | +from drf_spectacular.utils import extend_schema |
| 4 | +from pydantic import ValidationError |
| 5 | +from rest_framework.response import Response |
| 6 | +from rest_framework.views import APIView |
| 7 | +from kernelCI_app.queries.tree import get_tree_listing_data_denormalized |
| 8 | +from kernelCI_app.typeModels.commonListing import ListingQueryParameters, StatusCountV2 |
| 9 | +from kernelCI_app.typeModels.treeListing import TreeListingItem, TreeListingResponseV2 |
| 10 | +from kernelCI_app.helpers.errorHandling import create_api_error_response |
| 11 | +from kernelCI_app.constants.localization import ClientStrings |
| 12 | + |
| 13 | + |
| 14 | +class TreeViewV2(APIView): |
| 15 | + def _sanitize_records(self, trees_raw: list[tuple]) -> list[TreeListingItem]: |
| 16 | + trees = [] |
| 17 | + for tree in trees_raw: |
| 18 | + trees.append( |
| 19 | + TreeListingItem( |
| 20 | + id=tree[0], |
| 21 | + origin=tree[1], |
| 22 | + tree_name=tree[2], |
| 23 | + git_repository_url=tree[3], |
| 24 | + git_repository_branch=tree[4], |
| 25 | + git_commit_hash=tree[5], |
| 26 | + git_commit_name=tree[6], |
| 27 | + git_commit_tags=tree[7], |
| 28 | + start_time=tree[8], |
| 29 | + build_status=StatusCountV2( |
| 30 | + PASS=tree[9], |
| 31 | + FAIL=tree[10], |
| 32 | + INCONCLUSIVE=tree[11], |
| 33 | + ), |
| 34 | + boot_status=StatusCountV2( |
| 35 | + PASS=tree[12], |
| 36 | + FAIL=tree[13], |
| 37 | + INCONCLUSIVE=tree[14], |
| 38 | + ), |
| 39 | + test_status=StatusCountV2( |
| 40 | + PASS=tree[15], |
| 41 | + FAIL=tree[16], |
| 42 | + INCONCLUSIVE=tree[17], |
| 43 | + ), |
| 44 | + ) |
| 45 | + ) |
| 46 | + |
| 47 | + return trees |
| 48 | + |
| 49 | + @extend_schema( |
| 50 | + parameters=[ListingQueryParameters], |
| 51 | + responses=TreeListingResponseV2, |
| 52 | + ) |
| 53 | + def get(self, request: HttpRequest): |
| 54 | + try: |
| 55 | + query_params = ListingQueryParameters( |
| 56 | + origin=request.GET.get("origin"), |
| 57 | + interval_in_days=request.GET.get("interval_in_days"), |
| 58 | + ) |
| 59 | + except ValidationError as e: |
| 60 | + return Response(data=e.json(), status=HTTPStatus.BAD_REQUEST) |
| 61 | + |
| 62 | + trees_raw = get_tree_listing_data_denormalized( |
| 63 | + origin=query_params.origin, |
| 64 | + interval_in_days=query_params.interval_in_days, |
| 65 | + ) |
| 66 | + |
| 67 | + if not trees_raw: |
| 68 | + return create_api_error_response( |
| 69 | + error_message=ClientStrings.NO_TREES_FOUND, |
| 70 | + status_code=HTTPStatus.OK, |
| 71 | + ) |
| 72 | + |
| 73 | + try: |
| 74 | + sanitized_records = self._sanitize_records(trees_raw=trees_raw) |
| 75 | + result = TreeListingResponseV2(sanitized_records) |
| 76 | + except ValidationError as e: |
| 77 | + return Response(data=e.json(), status=HTTPStatus.INTERNAL_SERVER_ERROR) |
| 78 | + |
| 79 | + return Response(data=result.model_dump(), status=HTTPStatus.OK) |
0 commit comments