|
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