|
73 | 73 | API_URI_RIS_KEY,
|
74 | 74 | PERMISSION_PREFIX,
|
75 | 75 | )
|
76 |
| -from ..exceptions import FABException, InvalidOrderByColumnFABException |
| 76 | +from ..exceptions import ( |
| 77 | + FABException, |
| 78 | + InvalidColumnArgsFABException, |
| 79 | + InvalidOrderByColumnFABException, |
| 80 | +) |
77 | 81 | from ..hooks import get_before_request_hooks, wrap_route_handler_with_hooks
|
78 | 82 | from ..models.filters import Filters
|
79 | 83 | from ..security.decorators import permission_name, protect
|
@@ -1467,19 +1471,27 @@ def get_headless(self, pk: ModelKeyType, **kwargs: Any) -> Response:
|
1467 | 1471 | :param kwargs: Query string parameter arguments
|
1468 | 1472 | :return: HTTP Response
|
1469 | 1473 | """
|
| 1474 | + response = {} |
| 1475 | + args = kwargs.get("rison", {}) |
| 1476 | + # handle select columns |
| 1477 | + try: |
| 1478 | + select_columns, pruned_select_cols = self._handle_columns_args( |
| 1479 | + args, |
| 1480 | + self.show_select_columns, |
| 1481 | + self.show_columns, |
| 1482 | + ) |
| 1483 | + except InvalidColumnArgsFABException as e: |
| 1484 | + return self.response_400(message=str(e)) |
| 1485 | + |
1470 | 1486 | item = self.datamodel.get(
|
1471 | 1487 | pk,
|
1472 | 1488 | self._base_filters,
|
1473 |
| - self.show_select_columns, |
| 1489 | + select_columns, |
1474 | 1490 | self.show_outer_default_load,
|
1475 | 1491 | )
|
1476 | 1492 | if not item:
|
1477 | 1493 | return self.response_404()
|
1478 | 1494 |
|
1479 |
| - response = {} |
1480 |
| - args = kwargs.get("rison", {}) |
1481 |
| - select_cols = args.get(API_SELECT_COLUMNS_RIS_KEY, []) |
1482 |
| - pruned_select_cols = [col for col in select_cols if col in self.show_columns] |
1483 | 1495 | self.set_response_key_mappings(
|
1484 | 1496 | response, self.get, args, **{API_SELECT_COLUMNS_RIS_KEY: pruned_select_cols}
|
1485 | 1497 | )
|
@@ -1582,23 +1594,15 @@ def get_list_headless(self, **kwargs: Any) -> Response:
|
1582 | 1594 | response = dict()
|
1583 | 1595 | args = kwargs.get("rison", {})
|
1584 | 1596 | # handle select columns
|
1585 |
| - output_select_cols = args.get(API_SELECT_COLUMNS_RIS_KEY, []) |
1586 |
| - select_cols = args.get(API_SELECT_SEL_COLUMNS_RIS_KEY, []) |
1587 |
| - if select_cols and output_select_cols: |
1588 |
| - return self.response_400(message="Cannot use both select and sel columns") |
1589 |
| - list_select_columns = self.list_select_columns |
1590 |
| - pruned_select_cols = [] |
1591 |
| - if output_select_cols: |
1592 |
| - pruned_select_cols = [ |
1593 |
| - col for col in output_select_cols if col in self.list_columns |
1594 |
| - ] |
1595 |
| - if select_cols: |
1596 |
| - pruned_select_cols = [ |
1597 |
| - col for col in select_cols if col in self.list_columns |
1598 |
| - ] |
1599 |
| - list_select_columns = [ |
1600 |
| - col for col in select_cols if col in self.list_select_columns |
1601 |
| - ] |
| 1597 | + try: |
| 1598 | + select_columns, pruned_select_cols = self._handle_columns_args( |
| 1599 | + args, |
| 1600 | + self.list_select_columns, |
| 1601 | + self.list_columns, |
| 1602 | + ) |
| 1603 | + except InvalidColumnArgsFABException as e: |
| 1604 | + return self.response_400(message=str(e)) |
| 1605 | + |
1602 | 1606 | # map decorated metadata
|
1603 | 1607 | self.set_response_key_mappings(
|
1604 | 1608 | response,
|
@@ -1631,7 +1635,7 @@ def get_list_headless(self, **kwargs: Any) -> Response:
|
1631 | 1635 | order_direction,
|
1632 | 1636 | page=page_index,
|
1633 | 1637 | page_size=page_size,
|
1634 |
| - select_columns=list_select_columns, |
| 1638 | + select_columns=select_columns, |
1635 | 1639 | outer_default_load=self.list_outer_default_load,
|
1636 | 1640 | )
|
1637 | 1641 | pks = self.datamodel.get_keys(lst)
|
@@ -1977,6 +1981,37 @@ def _handle_filters_args(self, rison_args: Dict[str, Any]) -> Filters:
|
1977 | 1981 | self._filters.rest_add_filters(rison_args.get(API_FILTERS_RIS_KEY, []))
|
1978 | 1982 | return self._filters.get_joined_filters(self._base_filters)
|
1979 | 1983 |
|
| 1984 | + def _handle_columns_args( |
| 1985 | + self, |
| 1986 | + args: Dict[str, Any], |
| 1987 | + default_select_columns: List[str], |
| 1988 | + default_response_columns: List[str], |
| 1989 | + ) -> Tuple[List[str], List[str]]: |
| 1990 | + """ |
| 1991 | + Handle the column args from the request. |
| 1992 | + """ |
| 1993 | + select_columns_arg = args.get(API_SELECT_SEL_COLUMNS_RIS_KEY, []) |
| 1994 | + response_columns_arg = args.get(API_SELECT_COLUMNS_RIS_KEY, []) |
| 1995 | + if select_columns_arg and response_columns_arg: |
| 1996 | + raise InvalidColumnArgsFABException( |
| 1997 | + "Cannot use both select and sel columns" |
| 1998 | + ) |
| 1999 | + select_columns = default_select_columns |
| 2000 | + response_columns = [] |
| 2001 | + if select_columns_arg: |
| 2002 | + select_columns = [ |
| 2003 | + col for col in select_columns_arg if col in default_select_columns |
| 2004 | + ] |
| 2005 | + response_columns = [ |
| 2006 | + col for col in select_columns_arg if col in default_response_columns |
| 2007 | + ] |
| 2008 | + elif response_columns_arg: |
| 2009 | + response_columns = [ |
| 2010 | + col for col in response_columns_arg if col in default_response_columns |
| 2011 | + ] |
| 2012 | + |
| 2013 | + return select_columns, response_columns |
| 2014 | + |
1980 | 2015 | def _description_columns_json(
|
1981 | 2016 | self, cols: Optional[List[str]] = None
|
1982 | 2017 | ) -> Dict[str, Any]:
|
|
0 commit comments