Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/deep.rst
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ When creating a ``Project`` object, PyCap goes ahead and makes some useful API c

For non-longitudinal projects, ``events``, ``arm_nums``, and ``arm_names`` are empty tuples.

:note: To disable calls to the API on initialization you can set ``lazy=True``. This prevents much of the metadata associated with a project from being requested at `Project` initialization. Accessing these values prior to `Project.configure()` being run will result in the return of Null values. This might be useful if you're implementing PyCap into a service-based architecture. For example, On each request to the service you might want to initialize a different Project with each request to the service and use PyCap's methods to pull records without having to initialize the project's entire metadata on each service request.

Metadata
^^^^^^^^

Expand Down
41 changes: 29 additions & 12 deletions redcap/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
class Project(object):
"""Main class for interacting with REDCap projects"""

def __init__(self, url, token, name='', verify_ssl=True):
def __init__(self, url, token, name='', verify_ssl=True, lazy=False):
"""
Parameters
----------
Expand All @@ -32,6 +32,22 @@ def __init__(self, url, token, name='', verify_ssl=True):
self.name = name
self.url = url
self.verify = verify_ssl
self.metadata = None
self.redcap_version = None
self.field_names = None
# We'll use the first field as the default id for each row
self.def_field = None
self.field_labels = None
self.forms = None
self.events = None
self.arm_nums = None
self.arm_names = None
self.configured = False

if not lazy:
self.configure()

def configure(self):
try:
self.metadata = self.__md()
except RequestException:
Expand Down Expand Up @@ -59,6 +75,7 @@ def __init__(self, url, token, name='', verify_ssl=True):
self.events = events
self.arm_nums = arm_nums
self.arm_names = arm_names
self.configured = True

def __md(self):
"""Return the project's metadata structure"""
Expand Down Expand Up @@ -212,10 +229,10 @@ def export_metadata(self, fields=None, forms=None, format='json',
return read_csv(StringIO(response), **df_kwargs)

def export_records(self, records=None, fields=None, forms=None,
events=None, raw_or_label='raw', event_name='label',
format='json', export_survey_fields=False,
export_data_access_groups=False, df_kwargs=None,
export_checkbox_labels=False):
events=None, raw_or_label='raw', event_name='label',
format='json', export_survey_fields=False,
export_data_access_groups=False, df_kwargs=None,
export_checkbox_labels=False):
"""
Export data from the REDCap project.

Expand Down Expand Up @@ -279,11 +296,11 @@ def export_records(self, records=None, fields=None, forms=None,
pl = self.__basepl('record', format=ret_format)
fields = self.backfill_fields(fields, forms)
keys_to_add = (records, fields, forms, events,
raw_or_label, event_name, export_survey_fields,
export_data_access_groups, export_checkbox_labels)
raw_or_label, event_name, export_survey_fields,
export_data_access_groups, export_checkbox_labels)
str_keys = ('records', 'fields', 'forms', 'events', 'rawOrLabel',
'eventName', 'exportSurveyFields', 'exportDataAccessGroups',
'exportCheckboxLabel')
'eventName', 'exportSurveyFields', 'exportDataAccessGroups',
'exportCheckboxLabel')
for key, data in zip(str_keys, keys_to_add):
if data:
# Make a url-ok string
Expand All @@ -307,7 +324,7 @@ def export_records(self, records=None, fields=None, forms=None,
return df

def metadata_type(self, field_name):
"""If the given field_name is validated by REDCap, return its type"""
"""If the given field_name is validated by REDCap, return it's type"""
return self.__meta_metadata(field_name,
'text_validation_type_or_show_slider_number')

Expand Down Expand Up @@ -393,7 +410,7 @@ def names_labels(self, do_print=False):
return self.field_names, self.field_labels

def import_records(self, to_import, overwrite='normal', format='json',
return_format='json', return_content='count', rec_type='flat',
return_format='json', return_content='count',
date_format='YMD'):
"""
Import data into the RedCap Project
Expand Down Expand Up @@ -433,7 +450,7 @@ def import_records(self, to_import, overwrite='normal', format='json',
response : dict, str
response from REDCap API, json-decoded if ``return_format`` == ``'json'``
"""
pl = self.__basepl('record', rec_type=rec_type)
pl = self.__basepl('record')
if hasattr(to_import, 'to_csv'):
# We'll assume it's a df
from StringIO import StringIO
Expand Down
2 changes: 1 addition & 1 deletion redcap/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def validate(self):
'Exporting form-event mappings but content != formEventMapping'),
'exp_user': (['format'], 'user',
'Exporting users but content is not user'),
'version': (['format'], 'version',
'version': (['format'], 'version',
'Requesting version but content != version')
}
extra, req_content, err_msg = valid_data[self.type]
Expand Down