Skip to content

Commit

Permalink
[api] New, titles meta data keys
Browse files Browse the repository at this point in the history
  • Loading branch information
dpgaspar committed Mar 29, 2019
1 parent 92144f8 commit fd34aed
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 31 deletions.
6 changes: 6 additions & 0 deletions docs/rest_api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,7 @@ Now let's query our newly created Group::

{
"description_columns": {},
"show_title": "Show Contact Group",
"show_columns": [
"name"
],
Expand Down Expand Up @@ -544,6 +545,8 @@ First a birds eye view from the output of the **_info** endpoint::
{
"add_columns": [...],
"edit_columns": [...],
"add_title": "...",
"edit_title": "...",
"filters": {...},
"permissions": [...]
}
Expand Down Expand Up @@ -719,6 +722,7 @@ The response data structure is::
"description_columnns": {},
"label_columns": {},
"show_columns": [],
"show_title": "",
"result": {}
}

Expand Down Expand Up @@ -746,6 +750,7 @@ Our *curl* command will look like::
"name",
"address"
],
"show_title": "Show Contact",
"label_columns": {
"address": "Address",
"name": "Name"
Expand Down Expand Up @@ -832,6 +837,7 @@ The response data structure is::
"label_columns": {},
"list_columns": [ ... An ordered list of columns ...],
"order_columns": [ ... List of columns that can be ordered ... ],
"list_title": "",
"result": {}
}

Expand Down
2 changes: 2 additions & 0 deletions examples/crud_rest_api/app/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ def fill_gender():
class ContactModelApi(ModelRestApi):
resource_name = 'contact'
datamodel = SQLAInterface(Contact)
allow_browser_login = True


appbuilder.add_api(ContactModelApi)
Expand All @@ -28,6 +29,7 @@ class ContactModelApi(ModelRestApi):
class GroupModelApi(ModelRestApi):
resource_name = 'group'
datamodel = SQLAInterface(ContactGroup)
allow_browser_login = True


appbuilder.add_api(GroupModelApi)
40 changes: 34 additions & 6 deletions flask_appbuilder/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,19 @@
API_EDIT_COLUMNS_RIS_KEY,
API_SELECT_COLUMNS_RIS_KEY,
API_FILTERS_RIS_KEY,
API_PERMISSIONS_RIS_KEY
API_PERMISSIONS_RIS_KEY,
API_ORDER_COLUMN_RIS_KEY,
API_ORDER_DIRECTION_RIS_KEY,
API_PAGE_INDEX_RIS_KEY,
API_PAGE_SIZE_RIS_KEY,
API_LIST_TITLE_RES_KEY,
API_ADD_TITLE_RES_KEY,
API_EDIT_TITLE_RES_KEY,
API_SHOW_TITLE_RES_KEY,
API_LIST_TITLE_RIS_KEY,
API_ADD_TITLE_RIS_KEY,
API_EDIT_TITLE_RIS_KEY,
API_SHOW_TITLE_RIS_KEY
)

log = logging.getLogger(__name__)
Expand Down Expand Up @@ -745,6 +757,12 @@ def merge_search_filters(self, response, **kwargs):
]
response[API_FILTERS_RES_KEY] = search_filters

def merge_add_title(self, response, **kwargs):
response[API_ADD_TITLE_RES_KEY] = self.add_title

def merge_edit_title(self, response, **kwargs):
response[API_EDIT_TITLE_RES_KEY] = self.edit_title

@expose('/_info', methods=['GET'])
@protect()
@safe
Expand All @@ -754,6 +772,8 @@ def merge_search_filters(self, response, **kwargs):
@merge_response_func(merge_add_field_info, API_ADD_COLUMNS_RIS_KEY)
@merge_response_func(merge_edit_field_info, API_EDIT_COLUMNS_RIS_KEY)
@merge_response_func(merge_search_filters, API_FILTERS_RIS_KEY)
@merge_response_func(merge_add_title, API_ADD_TITLE_RIS_KEY)
@merge_response_func(merge_edit_title, API_EDIT_TITLE_RIS_KEY)
def info(self, **kwargs):
"""
Endpoint that renders a response for CRUD REST meta data
Expand Down Expand Up @@ -892,10 +912,17 @@ def merge_order_columns(self, response, **kwargs):
else:
response[API_ORDER_COLUMNS_RES_KEY] = self.order_columns

def merge_list_title(self, response, **kwargs):
response[API_LIST_TITLE_RES_KEY] = self.list_title

def merge_show_title(self, response, **kwargs):
response[API_SHOW_TITLE_RES_KEY] = self.show_title

@rison(get_item_schema)
@merge_response_func(merge_label_columns, API_LABEL_COLUMNS_RIS_KEY)
@merge_response_func(merge_show_columns, API_SHOW_COLUMNS_RIS_KEY)
@merge_response_func(merge_description_columns, API_DESCRIPTION_COLUMNS_RIS_KEY)
@merge_response_func(merge_show_title, API_SHOW_TITLE_RIS_KEY)
def _get_item(self, pk, **kwargs):
item = self.datamodel.get(pk, self._base_filters)
if not item:
Expand Down Expand Up @@ -927,6 +954,7 @@ def _get_item(self, pk, **kwargs):
@merge_response_func(merge_label_columns, API_LABEL_COLUMNS_RIS_KEY)
@merge_response_func(merge_description_columns, API_DESCRIPTION_COLUMNS_RIS_KEY)
@merge_response_func(merge_list_columns, API_LIST_COLUMNS_RIS_KEY)
@merge_response_func(merge_list_title, API_LIST_TITLE_RIS_KEY)
def _get_list(self, **kwargs):
_response = dict()
_args = kwargs.get('rison', {})
Expand Down Expand Up @@ -980,10 +1008,10 @@ def _handle_page_args(self, rison_args):
:param args:
:return: (tuple) page, page_size
"""
page_index = rison_args.get('page', 0)
page_size = rison_args.get('page_size', self.page_size)
page_index = rison_args.get(API_PAGE_INDEX_RIS_KEY, 0)
page_size = rison_args.get(API_PAGE_SIZE_RIS_KEY, self.page_size)
max_page_size = current_app.config.get('FAB_API_MAX_PAGE_SIZE')
if page_size > max_page_size:
if page_size > max_page_size or page_size < 1:
page_size = max_page_size
return page_index, page_size

Expand All @@ -995,8 +1023,8 @@ def _handle_order_args(self, rison_args):
:param rison_args:
:return:
"""
order_column = rison_args.get('order_column', '')
order_direction = rison_args.get('order_direction', '')
order_column = rison_args.get(API_ORDER_COLUMN_RIS_KEY, '')
order_direction = rison_args.get(API_ORDER_DIRECTION_RIS_KEY, '')
if not order_column and self.base_order:
order_column, order_direction = self.base_order
if order_column not in self.order_columns:
Expand Down
67 changes: 46 additions & 21 deletions flask_appbuilder/api/schemas.py
Original file line number Diff line number Diff line change
@@ -1,40 +1,62 @@
from ..const import (
API_ORDER_COLUMNS_RIS_KEY,
API_LABEL_COLUMNS_RIS_KEY,
API_LIST_COLUMNS_RIS_KEY,
API_DESCRIPTION_COLUMNS_RIS_KEY,
API_SHOW_COLUMNS_RIS_KEY,
API_ADD_COLUMNS_RIS_KEY,
API_EDIT_COLUMNS_RIS_KEY,
API_SELECT_COLUMNS_RIS_KEY,
API_FILTERS_RIS_KEY,
API_PERMISSIONS_RIS_KEY,
API_SELECT_KEYS_RIS_KEY,
API_ORDER_COLUMN_RIS_KEY,
API_ORDER_DIRECTION_RIS_KEY,
API_PAGE_INDEX_RIS_KEY,
API_PAGE_SIZE_RIS_KEY,
API_LIST_TITLE_RIS_KEY,
API_ADD_TITLE_RIS_KEY,
API_EDIT_TITLE_RIS_KEY,
API_SHOW_TITLE_RIS_KEY
)

get_list_schema = {
"type": "object",
"properties": {
"keys": {
API_SELECT_KEYS_RIS_KEY: {
"type": "array",
"items": {
"type": "string",
"enum": [
"list_columns",
"order_columns",
"label_columns",
"description_columns",
API_LIST_COLUMNS_RIS_KEY,
API_ORDER_COLUMNS_RIS_KEY,
API_LABEL_COLUMNS_RIS_KEY,
API_DESCRIPTION_COLUMNS_RIS_KEY,
API_LIST_TITLE_RIS_KEY,
"none"
]
}
},
"columns": {
API_SELECT_COLUMNS_RIS_KEY: {
"type": "array",
"items": {
"type": "string"
}
},
"order_column": {
API_ORDER_COLUMN_RIS_KEY: {
"type": "string"
},
"order_direction": {
API_ORDER_DIRECTION_RIS_KEY: {
"type": "string",
"enum": ["asc", "desc"]
},
"page": {
API_PAGE_INDEX_RIS_KEY: {
"type": "integer"
},
"page_size": {
API_PAGE_SIZE_RIS_KEY: {
"type": "integer"
},
"filters": {
API_FILTERS_RIS_KEY: {
"type": "array",
"items": {
"type": "object",
Expand All @@ -57,19 +79,20 @@
get_item_schema = {
"type": "object",
"properties": {
"keys": {
API_SELECT_KEYS_RIS_KEY: {
"type": "array",
"items": {
"type": "string",
"enum": [
"show_columns",
"description_columns",
"label_columns",
API_SHOW_COLUMNS_RIS_KEY,
API_DESCRIPTION_COLUMNS_RIS_KEY,
API_LABEL_COLUMNS_RIS_KEY,
API_SHOW_TITLE_RIS_KEY,
"none"
]
}
},
"columns": {
API_SELECT_COLUMNS_RIS_KEY: {
"type": "array",
"items": {
"type": "string"
Expand All @@ -81,15 +104,17 @@
get_info_schema = {
"type": "object",
"properties": {
"keys": {
API_SELECT_KEYS_RIS_KEY: {
"type": "array",
"items": {
"type": "string",
"enum": [
"add_columns",
"edit_columns",
"filters",
"permissions",
API_ADD_COLUMNS_RIS_KEY,
API_EDIT_COLUMNS_RIS_KEY,
API_FILTERS_RIS_KEY,
API_PERMISSIONS_RIS_KEY,
API_ADD_TITLE_RIS_KEY,
API_EDIT_TITLE_RIS_KEY,
"none"
]
}
Expand Down
14 changes: 14 additions & 0 deletions flask_appbuilder/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,11 @@
API_FILTERS_RES_KEY = 'filters'
API_PERMISSIONS_RES_KEY = 'permissions'

API_LIST_TITLE_RES_KEY = 'list_title'
API_ADD_TITLE_RES_KEY = 'add_title'
API_EDIT_TITLE_RES_KEY = 'edit_title'
API_SHOW_TITLE_RES_KEY = 'show_title'

# Request Rison keys

API_URI_RIS_KEY = 'q'
Expand All @@ -161,3 +166,12 @@
API_PERMISSIONS_RIS_KEY = 'permissions'
API_SELECT_COLUMNS_RIS_KEY = 'columns'
API_SELECT_KEYS_RIS_KEY = 'keys'
API_ORDER_COLUMN_RIS_KEY = 'order_column'
API_ORDER_DIRECTION_RIS_KEY = 'order_direction'
API_PAGE_INDEX_RIS_KEY = 'page'
API_PAGE_SIZE_RIS_KEY = 'page_size'

API_LIST_TITLE_RIS_KEY = 'list_title'
API_ADD_TITLE_RIS_KEY = 'add_title'
API_EDIT_TITLE_RIS_KEY = 'edit_title'
API_SHOW_TITLE_RIS_KEY = 'show_title'
20 changes: 16 additions & 4 deletions flask_appbuilder/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,15 @@
API_SECURITY_PROVIDER_KEY,
API_SECURITY_ACCESS_TOKEN_KEY,
API_SECURITY_REFRESH_TOKEN_KEY,
API_SECURITY_VERSION
API_SECURITY_VERSION,
API_LIST_TITLE_RIS_KEY,
API_LIST_TITLE_RES_KEY,
API_SHOW_TITLE_RIS_KEY,
API_SHOW_TITLE_RES_KEY,
API_ADD_TITLE_RIS_KEY,
API_ADD_TITLE_RES_KEY,
API_EDIT_TITLE_RIS_KEY,
API_EDIT_TITLE_RES_KEY
)


Expand Down Expand Up @@ -469,7 +477,8 @@ def test_get_item_select_meta_data(self):
selectable_keys = [
API_DESCRIPTION_COLUMNS_RIS_KEY,
API_LABEL_COLUMNS_RIS_KEY,
API_SHOW_COLUMNS_RIS_KEY
API_SHOW_COLUMNS_RIS_KEY,
API_SHOW_TITLE_RIS_KEY
]
for selectable_key in selectable_keys:
argument = {
Expand Down Expand Up @@ -901,7 +910,8 @@ def test_get_list_select_meta_data(self):
API_DESCRIPTION_COLUMNS_RIS_KEY,
API_LABEL_COLUMNS_RIS_KEY,
API_ORDER_COLUMNS_RIS_KEY,
API_LIST_COLUMNS_RIS_KEY
API_LIST_COLUMNS_RIS_KEY,
API_LIST_TITLE_RIS_KEY
]
for selectable_key in selectable_keys:
argument = {
Expand Down Expand Up @@ -1189,7 +1199,9 @@ def test_info_select_meta_data(self):
API_ADD_COLUMNS_RIS_KEY,
API_EDIT_COLUMNS_RIS_KEY,
API_PERMISSIONS_RIS_KEY,
API_FILTERS_RIS_KEY
API_FILTERS_RIS_KEY,
API_ADD_TITLE_RIS_KEY,
API_EDIT_TITLE_RIS_KEY
]
for selectable_key in selectable_keys:
arguments = {
Expand Down

0 comments on commit fd34aed

Please sign in to comment.