Skip to content

Commit 1eb78f1

Browse files
Merge branch 'dev' into 10-termination-codes
2 parents 064eefd + 86805e2 commit 1eb78f1

File tree

3 files changed

+83
-14
lines changed

3 files changed

+83
-14
lines changed

CmixAPIClient/api.py

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,19 @@ def add_extra_url_params(self, url, params):
163163

164164
return url
165165

166+
def get_survey_data_layouts(self, survey_id):
167+
self.check_auth_headers()
168+
data_layouts_url = '{}/surveys/{}/data-layouts'.format(CMIX_SERVICES['survey'][self.url_type], survey_id)
169+
data_layouts_response = requests.get(data_layouts_url, headers=self._authentication_headers)
170+
if data_layouts_response.status_code != 200:
171+
raise CmixError(
172+
'CMIX returned a non-200 response code while getting data_layouts: {} and error {}'.format(
173+
data_layouts_response.status_code,
174+
data_layouts_response.text
175+
)
176+
)
177+
return data_layouts_response.json()
178+
166179
def get_survey_definition(self, survey_id):
167180
self.check_auth_headers()
168181
definition_url = '{}/surveys/{}/definition'.format(CMIX_SERVICES['survey'][self.url_type], survey_id)
@@ -209,6 +222,19 @@ def get_survey_status(self, survey_id):
209222
raise CmixError('Get Survey Status returned without a status. Response: {}'.format(status_response.json()))
210223
return status.lower()
211224

225+
def get_survey_sources(self, survey_id):
226+
self.check_auth_headers()
227+
sources_url = '{}/surveys/{}/sources'.format(CMIX_SERVICES['survey'][self.url_type], survey_id)
228+
sources_response = requests.get(sources_url, headers=self._authentication_headers)
229+
if sources_response.status_code != 200:
230+
raise CmixError(
231+
'CMIX returned a non-200 response code while getting sources: {} and error {}'.format(
232+
sources_response.status_code,
233+
sources_response.text
234+
)
235+
)
236+
return sources_response.json()
237+
212238
def get_survey_completes(self, survey_id):
213239
return self.get_survey_respondents(survey_id, "COMPLETE", True)
214240

@@ -255,25 +281,14 @@ def create_export_archive(self, survey_id, export_type):
255281
)
256282
archive_json = archive_response.json()
257283

258-
layout_url = '{}/surveys/{}/data-layouts/'.format(CMIX_SERVICES['survey']["BASE_URL"], survey_id)
259-
layout_response = requests.get(layout_url, headers=self._authentication_headers)
260-
if layout_response.status_code != 200:
261-
raise CmixError(
262-
'CMIX returned a non-200 response code: {} and error {}'.format(
263-
layout_response.status_code,
264-
layout_response.text
265-
)
266-
)
284+
layout_json = self.get_survey_data_layouts(survey_id)
267285
layout_id = None
268-
for layout in layout_response.json():
286+
for layout in layout_json:
269287
if layout.get('name') == 'Default':
270288
layout_id = layout.get('id')
271289
if layout_id is None:
272290
raise CmixError(
273-
'Layouts response did not contain a "Default" layout. Response Code: {}, Body {}'.format(
274-
layout_response.status_code,
275-
layout_response.content
276-
)
291+
'Layouts response did not contain a "Default" layout.'
277292
)
278293

279294
archive_json['dataLayoutId'] = layout_id

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@ A Python client library for the [Dynata Cmix API](https://wiki2.criticalmix.net/
2929
fetch_banner_filter(survey_id, question_a, question_b, response_id)
3030
fetch_raw_results(survey_id, payload)
3131
get_surveys(status, *args, **kwargs)
32+
get_survey_data_layouts(survey_id)
3233
get_survey_definition(survey_id)
3334
get_survey_xml(survey_id)
3435
get_survey_simulations(survey_id)
3536
get_survey_termination_codes(survey_id)
37+
get_survey_sources(survey_id)
3638
get_survey_test_url(survey_id)
3739
get_survey_respondents(survey_id, respondent_type, live)
3840
get_survey_status(survey_id)

tests/test_api.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,32 @@ def test_create_export_archive_errors_handled(self):
116116
with self.assertRaises(CmixError):
117117
self.cmix_api.create_export_archive(self.survey_id, 'XLSX_READABLE')
118118

119+
def test_get_survey_data_layouts(self):
120+
self.cmix_api._authentication_headers = {'Authentication': 'Bearer test'}
121+
122+
# success case
123+
with mock.patch('CmixAPIClient.api.requests') as mock_request:
124+
mock_get = mock.Mock()
125+
mock_get.status_code = 200
126+
mock_get.json.return_value = {}
127+
mock_request.get.return_value = mock_get
128+
129+
self.cmix_api.get_survey_data_layouts(self.survey_id)
130+
131+
base_url = CMIX_SERVICES['survey']['BASE_URL']
132+
surveys_url = '{}/surveys/{}/data-layouts'.format(base_url, self.survey_id)
133+
mock_request.get.assert_any_call(surveys_url, headers=self.cmix_api._authentication_headers)
134+
135+
# error case (survey not found)
136+
with mock.patch('CmixAPIClient.api.requests') as mock_request:
137+
mock_get = mock.Mock()
138+
mock_get.status_code = 404
139+
mock_get.json.return_value = {}
140+
mock_request.get.return_value = mock_get
141+
142+
with self.assertRaises(CmixError):
143+
self.cmix_api.get_survey_data_layouts(self.survey_id)
144+
119145
def test_get_survey_status(self):
120146
self.cmix_api._authentication_headers = {'Authentication': 'Bearer test'}
121147

@@ -143,6 +169,32 @@ def test_get_survey_status_error_handled(self):
143169
with self.assertRaises(CmixError):
144170
self.cmix_api.get_survey_status(self.survey_id)
145171

172+
def test_get_survey_sources(self):
173+
self.cmix_api._authentication_headers = {'Authentication': 'Bearer test'}
174+
175+
# success case
176+
with mock.patch('CmixAPIClient.api.requests') as mock_request:
177+
mock_get = mock.Mock()
178+
mock_get.status_code = 200
179+
mock_get.json.return_value = {}
180+
mock_request.get.return_value = mock_get
181+
182+
self.cmix_api.get_survey_sources(self.survey_id)
183+
184+
base_url = CMIX_SERVICES['survey']['BASE_URL']
185+
surveys_url = '{}/surveys/{}/sources'.format(base_url, self.survey_id)
186+
mock_request.get.assert_any_call(surveys_url, headers=self.cmix_api._authentication_headers)
187+
188+
# error case (survey not found)
189+
with mock.patch('CmixAPIClient.api.requests') as mock_request:
190+
mock_get = mock.Mock()
191+
mock_get.status_code = 404
192+
mock_get.json.return_value = {}
193+
mock_request.get.return_value = mock_get
194+
195+
with self.assertRaises(CmixError):
196+
self.cmix_api.get_survey_sources(self.survey_id)
197+
146198
def test_get_survey_test_url(self):
147199
self.cmix_api._authentication_headers = {'Authentication': 'Bearer test'}
148200
correct_test_link = '{}/#/?cmixSvy={}&cmixTest={}'.format(

0 commit comments

Comments
 (0)