Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid storing KC domain in asset deployment data #4885

Merged
merged 3 commits into from Apr 24, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
41 changes: 16 additions & 25 deletions kpi/deployment_backends/kobocat_backend.py
Expand Up @@ -164,7 +164,7 @@ def connect(self, identifier=None, active=False):
if path_head != '/':
raise Exception('The identifier is not properly formatted.')

url = self.external_to_internal_url('{}/api/v1/forms'.format(kc_server))
url = self.normalize_internal_url('{}/api/v1/forms'.format(kc_server))
xlsx_io = self.asset.to_xlsx_io(
versioned=True, append={
'settings': {
Expand All @@ -188,6 +188,8 @@ def connect(self, identifier=None, active=False):
files = {'xls_file': ('{}.xlsx'.format(id_string), xlsx_io)}
json_response = self._kobocat_request(
'POST', url, data=payload, files=files)
# Store only path
json_response["url"] = urlparse(json_response["url"]).path
bufke marked this conversation as resolved.
Show resolved Hide resolved
self.store_data({
'backend': 'kobocat',
'identifier': self.internal_to_external_url(identifier),
Expand Down Expand Up @@ -266,7 +268,7 @@ def delete(self):
"""
WARNING! Deletes all submitted data!
"""
url = self.external_to_internal_url(self.backend_response['url'])
url = self.normalize_internal_url(self.backend_response['url'])
try:
self._kobocat_request('DELETE', url)
except KobocatDeploymentException as e:
Expand Down Expand Up @@ -481,22 +483,12 @@ def enketo_id(self):
return enketo_id

@staticmethod
def external_to_internal_url(url):
def normalize_internal_url(url: str) -> str:
"""
Replace the value of `settings.KOBOCAT_URL` with that of
`settings.KOBOCAT_INTERNAL_URL` when it appears at the beginning of
`url`
Normalize url to ensure KOBOCAT_INTERNAL_URL is used
"""
kobocat_url = settings.KOBOCAT_URL
# If old domain name is detected, use it for search&replace below
if settings.KOBOCAT_OLD_URL and settings.KOBOCAT_OLD_URL in url:
kobocat_url = settings.KOBOCAT_OLD_URL

return re.sub(
pattern='^{}'.format(re.escape(kobocat_url)),
repl=settings.KOBOCAT_INTERNAL_URL,
string=url
)
parsed_url = urlparse(url)
return f'{settings.KOBOCAT_INTERNAL_URL}{parsed_url.path}'
bufke marked this conversation as resolved.
Show resolved Hide resolved

def get_attachment(
self,
Expand Down Expand Up @@ -877,7 +869,7 @@ def redeploy(self, active=None):
"""
if active is None:
active = self.active
url = self.external_to_internal_url(self.backend_response['url'])
url = self.normalize_internal_url(self.backend_response['url'])
id_string = self.backend_response['id_string']
xlsx_io = self.asset.to_xlsx_io(
versioned=True, append={
Expand Down Expand Up @@ -907,7 +899,6 @@ def redeploy(self, active=None):
# is gone! Try a standard deployment instead
return self.connect(self.identifier, active)
raise

self.set_asset_uid()

def remove_from_kc_only_flag(self,
Expand Down Expand Up @@ -949,7 +940,7 @@ def set_active(self, active):
"""
# self.store_data is an alias for
# self.asset._deployment_data.update(...)
url = self.external_to_internal_url(
url = self.normalize_internal_url(
self.backend_response['url'])
payload = {
'downloadable': bool(active)
Expand Down Expand Up @@ -979,7 +970,7 @@ def set_asset_uid(self, force: bool = False) -> bool:
if is_synchronized:
return False

url = self.external_to_internal_url(self.backend_response['url'])
url = self.normalize_internal_url(self.backend_response['url'])
payload = {
'kpi_asset_uid': self.asset.uid
}
Expand Down Expand Up @@ -1024,7 +1015,7 @@ def set_has_kpi_hooks(self):
Store results in deployment data
"""
has_active_hooks = self.asset.has_active_hooks
url = self.external_to_internal_url(
url = self.normalize_internal_url(
self.backend_response['url'])
payload = {
'has_kpi_hooks': has_active_hooks,
Expand Down Expand Up @@ -1157,7 +1148,7 @@ def submission_url(self) -> str:

def sync_media_files(self, file_type: str = AssetFile.FORM_MEDIA):

url = self.external_to_internal_url(self.backend_response['url'])
url = self.normalize_internal_url(self.backend_response['url'])
response = self._kobocat_request('GET', url)
kc_files = defaultdict(dict)

Expand Down Expand Up @@ -1363,7 +1354,7 @@ def __delete_kc_metadata(
"""
# Delete file in KC

delete_url = self.external_to_internal_url(kc_file_['url'])
delete_url = self.normalize_internal_url(kc_file_['url'])
self._kobocat_request('DELETE', url=delete_url, expect_formid=False)

if file_ is None:
Expand Down Expand Up @@ -1626,7 +1617,7 @@ def __save_kc_metadata(self, file_: SyncBackendMediaInterface):
"""
identifier = self.identifier
server, path_ = self.__parse_identifier(identifier)
metadata_url = self.external_to_internal_url(f'{server}/api/v1/metadata')
metadata_url = self.normalize_internal_url(f'{server}/api/v1/metadata')

kwargs = {
'data': {
Expand Down Expand Up @@ -1665,7 +1656,7 @@ def __update_kc_metadata_hash(
"""
identifier = self.identifier
server, path_ = self.__parse_identifier(identifier)
metadata_detail_url = self.external_to_internal_url(
metadata_detail_url = self.normalize_internal_url(
f'{server}/api/v1/metadata/{kc_metadata_id}'
)

Expand Down