Skip to content

Commit ec51363

Browse files
authored
feat: REST API new select columns query param (#2242)
* feat: REST API new select columns * feat: REST API new select columns * fix lint
1 parent 83ad6e9 commit ec51363

File tree

4 files changed

+53
-5
lines changed

4 files changed

+53
-5
lines changed

flask_appbuilder/api/__init__.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
API_PERMISSIONS_RIS_KEY,
6666
API_RESULT_RES_KEY,
6767
API_SELECT_COLUMNS_RIS_KEY,
68+
API_SELECT_SEL_COLUMNS_RIS_KEY,
6869
API_SHOW_COLUMNS_RES_KEY,
6970
API_SHOW_COLUMNS_RIS_KEY,
7071
API_SHOW_TITLE_RES_KEY,
@@ -1572,8 +1573,23 @@ def get_list_headless(self, **kwargs: Any) -> Response:
15721573
response = dict()
15731574
args = kwargs.get("rison", {})
15741575
# handle select columns
1575-
select_cols = args.get(API_SELECT_COLUMNS_RIS_KEY, [])
1576-
pruned_select_cols = [col for col in select_cols if col in self.list_columns]
1576+
output_select_cols = args.get(API_SELECT_COLUMNS_RIS_KEY, [])
1577+
select_cols = args.get(API_SELECT_SEL_COLUMNS_RIS_KEY, [])
1578+
if select_cols and output_select_cols:
1579+
return self.response_400(message="Cannot use both select and sel columns")
1580+
list_select_columns = self.list_select_columns
1581+
pruned_select_cols = []
1582+
if output_select_cols:
1583+
pruned_select_cols = [
1584+
col for col in output_select_cols if col in self.list_columns
1585+
]
1586+
if select_cols:
1587+
pruned_select_cols = [
1588+
col for col in select_cols if col in self.list_columns
1589+
]
1590+
list_select_columns = [
1591+
col for col in select_cols if col in self.list_select_columns
1592+
]
15771593
# map decorated metadata
15781594
self.set_response_key_mappings(
15791595
response,
@@ -1606,7 +1622,7 @@ def get_list_headless(self, **kwargs: Any) -> Response:
16061622
order_direction,
16071623
page=page_index,
16081624
page_size=page_size,
1609-
select_columns=self.list_select_columns,
1625+
select_columns=list_select_columns,
16101626
outer_default_load=self.list_outer_default_load,
16111627
)
16121628
pks = self.datamodel.get_keys(lst)

flask_appbuilder/api/schemas.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
API_PERMISSIONS_RIS_KEY,
1919
API_SELECT_COLUMNS_RIS_KEY,
2020
API_SELECT_KEYS_RIS_KEY,
21+
API_SELECT_SEL_COLUMNS_RIS_KEY,
2122
API_SHOW_COLUMNS_RIS_KEY,
2223
API_SHOW_TITLE_RIS_KEY,
2324
)
@@ -70,6 +71,7 @@ def load(self, data, *, instance=None, **kwargs):
7071
},
7172
},
7273
API_SELECT_COLUMNS_RIS_KEY: {"type": "array", "items": {"type": "string"}},
74+
API_SELECT_SEL_COLUMNS_RIS_KEY: {"type": "array", "items": {"type": "string"}},
7375
API_ORDER_COLUMN_RIS_KEY: {"type": "string"},
7476
API_ORDER_DIRECTION_RIS_KEY: {"type": "string", "enum": ["asc", "desc"]},
7577
API_PAGE_INDEX_RIS_KEY: {"type": "integer"},

flask_appbuilder/const.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@
181181
API_FILTERS_RIS_KEY = "filters"
182182
API_PERMISSIONS_RIS_KEY = "permissions"
183183
API_SELECT_COLUMNS_RIS_KEY = "columns"
184+
API_SELECT_SEL_COLUMNS_RIS_KEY = "select_columns"
184185
API_SELECT_KEYS_RIS_KEY = "keys"
185186
API_ORDER_COLUMN_RIS_KEY = "order_column"
186187
API_ORDER_DIRECTION_RIS_KEY = "order_direction"

tests/test_api.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
API_SECURITY_REFRESH_TOKEN_KEY,
2727
API_SELECT_COLUMNS_RIS_KEY,
2828
API_SELECT_KEYS_RIS_KEY,
29+
API_SELECT_SEL_COLUMNS_RIS_KEY,
2930
API_SHOW_COLUMNS_RIS_KEY,
3031
API_SHOW_TITLE_RIS_KEY,
3132
API_URI_RIS_KEY,
@@ -870,7 +871,7 @@ def assert_get_item(self, rv, data, value):
870871
)
871872
self.assertEqual(rv.status_code, 200)
872873

873-
def test_get_item_select_cols(self):
874+
def test_get_item_choose_cols(self):
874875
"""
875876
REST Api: Test get item with select columns
876877
"""
@@ -1854,7 +1855,7 @@ def test_get_info_custom_search_filters(self):
18541855
{"name": "Custom Filter", "operator": "custom_filter"}, field_string_filters
18551856
)
18561857

1857-
def test_get_list_select_cols(self):
1858+
def test_get_list_choose_cols(self):
18581859
"""
18591860
REST Api: Test get list with select columns
18601861
"""
@@ -1882,6 +1883,34 @@ def test_get_list_select_cols(self):
18821883
self.assertEqual(data[API_LIST_COLUMNS_RES_KEY], ["field_integer"])
18831884
self.assertEqual(rv.status_code, 200)
18841885

1886+
def test_get_list_choose_select_cols(self):
1887+
"""
1888+
REST Api: Test get list with select columns
1889+
"""
1890+
client = self.app.test_client()
1891+
token = self.login(client, USERNAME_ADMIN, PASSWORD_ADMIN)
1892+
1893+
argument = {
1894+
API_SELECT_SEL_COLUMNS_RIS_KEY: ["field_integer"],
1895+
"order_column": "field_integer",
1896+
"order_direction": "asc",
1897+
}
1898+
1899+
uri = f"api/v1/model1api/?{API_URI_RIS_KEY}={prison.dumps(argument)}"
1900+
with model1_data(self.appbuilder.session, 5):
1901+
rv = self.auth_client_get(client, token, uri)
1902+
data = json.loads(rv.data.decode("utf-8"))
1903+
self.assertEqual(data[API_RESULT_RES_KEY][0], {"field_integer": 0})
1904+
self.assertEqual(
1905+
data[API_LABEL_COLUMNS_RES_KEY], {"field_integer": "Field Integer"}
1906+
)
1907+
self.assertEqual(
1908+
data[API_DESCRIPTION_COLUMNS_RES_KEY],
1909+
{"field_integer": "Field Integer"},
1910+
)
1911+
self.assertEqual(data[API_LIST_COLUMNS_RES_KEY], ["field_integer"])
1912+
self.assertEqual(rv.status_code, 200)
1913+
18851914
def test_get_list_select_meta_data(self):
18861915
"""
18871916
REST Api: Test get list select meta data

0 commit comments

Comments
 (0)