from parsons.etl.table import Table
import logging
logger = logging.getLogger(__name__)
[docs]
class CustomFields():
def __init__(self, van_connection):
self.connection = van_connection
[docs]
def get_custom_fields(self, field_type='contacts'):
"""
Get custom fields.
`Args:`
field_type : str
Filter by custom field group type. Must be one of ``contacts`` or
``contributions``.
`Returns:`
Parsons Table
See :ref:`parsons-table` for output options.
"""
params = {'customFieldsGroupType': field_type.capitalize()}
tbl = Table(self.connection.get_request('customFields', params=params))
logger.info(f'Found {tbl.num_rows} custom fields.')
return tbl
[docs]
def get_custom_fields_values(self, field_type='contacts'):
"""
Get custom field values as a long table.
`Args:`
field_type : str
Filter by custom field group type. Must be one of ``contacts`` or
``contributions``.
`Returns:`
Parsons Table
See :ref:`parsons-table` for output options.
"""
tbl = self.get_custom_fields()
# Some custom fields do no have associated values. If this is the case then
# we should return an empty Table, but with the expected columns.
if tbl.get_column_types('availableValues') == ['NoneType']:
logger.info('Found 0 custom field values.')
return Table([{'customFieldId': None,
'id': None,
'name': None,
'parentValueId': None}])
else:
logger.info(f'Found {tbl.num_rows} custom field values.')
return tbl.long_table('customFieldId', 'availableValues', prepend=False)
[docs]
def get_custom_field(self, custom_field_id):
"""
Get a custom field.
`Args:`
custom_field_id: int
A valid custom field id.
`Returns:`
A json.
"""
r = self.connection.get_request(f'customFields/{custom_field_id}')
logger.info(f'Found custom field {custom_field_id}.')
return r