from fineract.objects.fineract_object import FineractObject
[docs]class DataTable(FineractObject):
"""
This class represents a datatable
"""
CLIENT = 'm_client'
GROUP = 'm_group'
LOAN = 'm_loan'
OFFICE = 'm_office'
SAVING_ACCOUNT = 'm_saving_account'
PRODUCT_LOAN = 'm_product_loan'
SAVINGS_PRODUCT = 'm_savings_product'
def _init_attributes(self):
self.application_table_name = None
self.registered_table_name = None
self.column_header_data = None
def _use_attributes(self, attributes):
self.application_table_name = attributes.get('applicationTableName', None)
self.registered_table_name = attributes.get('registeredTableName', None)
self.column_header_data = self._make_fineract_objects_list(DataTableColumn,
attributes.get('columnHeaderData', None))
[docs] @classmethod
def create(cls, request_handler, name, apptable_name, columns, is_multirow=False):
"""Create a datatable and return a DataTable object
:param request_handler:
:param name:
:param apptable_name:
:param columns:
:param is_multirow:
:rtype: :class:`fineract.objects.datatable.DataTable`
"""
params = {
'datatableName': name,
'apptableName': apptable_name,
'multiRow': is_multirow,
'columns': columns,
}
data = request_handler.make_request(
'POST',
'/datatables',
json=params
)
return cls(request_handler,
request_handler.make_request(
'GET',
'/datatables/{}'.format(data['resourceIdentifier']),
), False)
[docs] @classmethod
def get(cls, request_handler, name):
"""Get a DataTable object based ``name``
:param request_handler:
:param name:
:rtype: :class:`fineract.objects.datatable.DataTable`
"""
data = request_handler.make_request(
'GET',
'/datatables/{}'.format(name),
)
if not data:
return None
return cls(request_handler, data, False)
[docs] def update(self, apptable_name=None, drop_columns=None, add_columns=None, change_columns=None):
"""Update the columns of datatable
See: https://demo.openmf.org/api-docs/apiLive.htm#datatables_updateTable
:param apptable_name:
:param drop_columns:
:param add_columns:
:param change_columns:
"""
params = {}
if apptable_name:
params['apptableName'] = apptable_name
if drop_columns:
params['dropColumns'] = drop_columns
if add_columns:
params['addColumns'] = add_columns
if change_columns:
params['changeColumns'] = change_columns
data = self._request_handler.make_request(
'PUT',
'/datatables/{}'.format(self.registered_table_name),
json=params
)
if 'resourceIdentifier' in data:
data = self._request_handler.make_request(
'GET',
'/datatables/{}'.format(self.registered_table_name))
self._use_attributes(data)
[docs] def delete(self):
"""Delete the datatable
:return: bool
"""
data = self._request_handler.make_request(
'DELETE',
'/datatables/{}'.format(self.registered_table_name)
)
return data['resourceIdentifier'] == self.registered_table_name
[docs] @classmethod
def register(cls, request_handler, name, apptable_name):
"""Register a datatable with an app table
:param request_handler:
:param name:
:param apptable_name:
:return: bool
"""
data = request_handler.make_request(
'POST',
'/datatables/register/{}/{}'.format(name, apptable_name)
)
return data['resourceIdentifier'] == name
[docs] @classmethod
def deregister(cls, request_handler, name):
"""Deregister a datatable. After this action, the datatable won't be visible
from the API
:param request_handler:
:param name:
:return: bool
"""
data = request_handler.make_request(
'POST',
'/datatables/deregister/{}'.format(name)
)
return data['resourceIdentifier'] == name
[docs] def insert(self, app_table_id, data):
"""Insert data into a datatable
:param app_table_id:
:param data: dict
:return: bool
"""
data = self._request_handler.make_request(
'POST',
'/datatables/{}/{}'.format(self.registered_table_name, app_table_id),
json=data
)
return data['resourceId'] == app_table_id
[docs] def get_data(self, app_table_id, order=None, desc=False):
"""Get all the data for for a specific app_table id
:param app_table_id:
:param order:
:param desc:
:return: list of dict
"""
params = {
'genericResultSet': False
}
if order:
params['order'] = '`{}`'.format(order) if not desc else '`{}` desc'.format(order)
return self._request_handler.make_request(
'GET',
'/datatables/{}/{}'.format(self.registered_table_name, app_table_id),
params=params
)
[docs] def update_data(self, app_table_id, data, datatable_id=None):
"""Update the data of a specific app_table_id.
In multirow datatables ``datatable_id`` references the row id
:param app_table_id:
:param data:
:param datatable_id:
:return: bool
"""
endpoint = '/datatables/{}/{}'.format(self.registered_table_name, app_table_id)
if datatable_id:
endpoint = '/datatables/{}/{}/{}'.format(self.registered_table_name, app_table_id, datatable_id)
data = self._request_handler.make_request(
'PUT',
endpoint,
json=data
)
return data['resourceId'] == app_table_id
[docs] def delete_data(self, app_table_id, datatable_id=None):
"""Delete the data of a specific app_table_id.
In multirow datatables ``datatable_id`` references the row id
:param app_table_id:
:param datatable_id:
:return: bool
"""
endpoint = '/datatables/{}/{}'.format(self.registered_table_name, app_table_id)
if datatable_id:
endpoint = '/datatables/{}/{}/{}'.format(self.registered_table_name, app_table_id, datatable_id)
data = self._request_handler.make_request(
'delete',
endpoint,
)
return data['resourceId'] == app_table_id
class DataTableColumn(FineractObject):
"""
This class represent a datatable column
"""
def _init_attributes(self):
self.column_name = None
self.column_type = None
self.column_length = None
self.column_display_type = None
self.is_column_nullable = None
self.is_column_primary_key = None
def _use_attributes(self, attributes):
self.column_name = attributes.get('columnName', None)
self.column_type = attributes.get('columnType', None)
self.column_length = attributes.get('columnLength', 0)
self.column_display_type = attributes.get('columnDisplayType', None)
self.is_column_nullable = attributes.get('isColumnNullable', True)
self.is_column_primary_key = attributes.get('isColumnPrimaryKey', False)