| Index: cms/translations/xtm/xtm_api.py | 
| diff --git a/cms/translations/xtm/xtm_api.py b/cms/translations/xtm/xtm_api.py | 
| index b65ce27054151a31a10dd6a7adf5dc9488cda549..601391fc443e7881317778eb7d3f6c65f0092dee 100644 | 
| --- a/cms/translations/xtm/xtm_api.py | 
| +++ b/cms/translations/xtm/xtm_api.py | 
| @@ -16,6 +16,11 @@ | 
| from __future__ import unicode_literals | 
| import json | 
| +try: | 
| + import urlparse | 
| +except ImportError: | 
| + # It's Python 3 | 
| + import urllib.parse as urlparse | 
| import requests | 
| @@ -76,17 +81,19 @@ class XTMCloudAPI(object): | 
| ADD_TARGET_LANGS = 200 | 
| GET_WORKFLOW_IDS = 200 | 
| - def __init__(self, token): | 
| + def __init__(self, token, base_url): | 
| """Constructor. | 
| Parameters | 
| ---------- | 
| token: str | 
| Token used to authenticate with the API. | 
| + base_url: str | 
| + Url used to connect to the API. | 
| """ | 
| self._token = token | 
| - self.base_url = _BASE_URL | 
| + self.base_url = base_url | 
| def _execute(self, url, data=None, files=None, stream=False, | 
| params=None, headers=None): | 
| @@ -218,12 +225,13 @@ class XTMCloudAPI(object): | 
| # Hacky way to go around 415 error code | 
| files_to_upload = {'a': 'b'} | 
| - url = self.base_url + self._UrlPaths.CREATE | 
| + url = urlparse.urljoin(self.base_url, self._UrlPaths.CREATE) | 
| response = self._execute(url, data=data, files=files_to_upload) | 
| if response.status_code != self._SuccessCodes.CREATE: | 
| # The creation was not successful | 
| + print('Raising exception') | 
| raise XTMCloudException(response.status_code, | 
| response.text.decode('utf-8'), | 
| 'creating job') | 
| @@ -275,7 +283,9 @@ class XTMCloudAPI(object): | 
| data = {'matchType': self._MATCH_TYPE[overwrite]} | 
| data.update(file_names) | 
| - url = self.base_url + self._UrlPaths.UPLOAD.format(project_id) | 
| + url = urlparse.urljoin( | 
| + self.base_url, self._UrlPaths.UPLOAD.format(project_id), | 
| + ) | 
| response = self._execute(url, data=data, files=files_to_upload) | 
| @@ -307,7 +317,9 @@ class XTMCloudAPI(object): | 
| If the request is flawed in any way. | 
| """ | 
| - url = (self.base_url + self._UrlPaths.DOWNLOAD).format(project_id) | 
| + url = urlparse.urljoin( | 
| + self.base_url, self._UrlPaths.DOWNLOAD.format(project_id), | 
| + ) | 
| exception_msg = { | 
| 400: 'Invalid request', | 
| @@ -347,8 +359,8 @@ class XTMCloudAPI(object): | 
| If the request is unsuccessful. | 
| """ | 
| - url = (self.base_url + self._UrlPaths.GET_TARGET_LANG).format( | 
| - project_id, | 
| + url = urlparse.urljoin( | 
| + self.base_url, self._UrlPaths.GET_TARGET_LANG.format(project_id), | 
| ) | 
| response = self._execute(url, stream=True) | 
| @@ -379,9 +391,11 @@ class XTMCloudAPI(object): | 
| data = json.dumps({ | 
| 'targetLanguages': target_languages, | 
| }) | 
| - url = (self.base_url + self._UrlPaths.ADD_TARGET_LANG).format( | 
| - project_id, | 
| + | 
| + url = urlparse.urljoin( | 
| + self.base_url, self._UrlPaths.ADD_TARGET_LANG.format(project_id), | 
| ) | 
| + | 
| headers = {'content-type': 'application/json'} | 
| response = self._execute(url, data=data, headers=headers) | 
| @@ -404,7 +418,7 @@ class XTMCloudAPI(object): | 
| Of workflow ids that match the name provided. | 
| """ | 
| - url = self.base_url + self._UrlPaths.GET_WORKFLOW_IDS | 
| + url = urlparse.urljoin(self.base_url, self._UrlPaths.GET_WORKFLOW_IDS) | 
| response = self._execute(url, params={'name': name}) | 
| @@ -420,7 +434,7 @@ class XTMCloudAPI(object): | 
| return valid_ids | 
| -def get_token(username, password, user_id): | 
| +def get_token(username, password, user_id, base_url): | 
| """Generate an API token from username and password. | 
| Parameters | 
| @@ -431,6 +445,8 @@ def get_token(username, password, user_id): | 
| The password used to generate the token. | 
| user_id: int | 
| The user ID used to generate the token. | 
| + base_url: str | 
| + The url used to connect to the API | 
| Returns | 
| ------- | 
| @@ -449,7 +465,7 @@ def get_token(username, password, user_id): | 
| 'userId': user_id, | 
| }) | 
| - url = _BASE_URL + 'auth/token' | 
| + url = urlparse.urljoin(base_url, 'auth/token') | 
| headers = {'content-type': 'application/json'} |