Skip to content

Commit 89ede88

Browse files
committed
Added utils.get_file_uid_url method and added download domain registry config
1 parent d407939 commit 89ede88

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed

checkouts.cfg

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ always-checkout = force
33
auto-checkout +=
44
imio.annex
55
imio.helpers
6+
imio.pyutils
67

78
[remotes]
89
imio = https://github.com/imio
@@ -20,4 +21,4 @@ collective_push = git@github.com:collective
2021
[sources]
2122
imio.annex = git ${remotes:imio}/imio.annex.git pushurl=${remotes:imio_push}/imio.annex.git
2223
imio.helpers = git ${remotes:imio}/imio.helpers.git pushurl=${remotes:imio_push}/imio.helpers.git
23-
24+
imio.pyutils = git ${remotes:imio}/imio.pyutils.git pushurl=${remotes:imio_push}/imio.pyutils.git

src/imio/esign/browser/settings.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ class IImioEsignSettings(Interface):
4545
required=True,
4646
)
4747

48+
file_url = schema.URI(
49+
title=_("File URL download domain"),
50+
description=_("URL domain where the file can be donwloaded."),
51+
required=False,
52+
)
53+
4854
seal_code = schema.TextLine(
4955
title=_("Seal code"),
5056
description=_("Seal code given by eidas provider."),

src/imio/esign/tests/test_utils.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
"""utils tests for this package."""
33
from imio.esign.testing import IMIO_ESIGN_INTEGRATION_TESTING # noqa: E501
44
from imio.esign.utils import add_files_to_session
5+
from imio.esign.utils import get_file_uid_url
56
from imio.esign.utils import get_session_annotation
67
from imio.esign.utils import remove_context_from_session
78
from imio.esign.utils import remove_files_from_session
89
from imio.esign.utils import remove_session
10+
from imio.pyutils.utils import shortuid_decode_id
911
from plone import api
1012
from plone.app.testing import setRoles
1113
from plone.app.testing import TEST_USER_ID
@@ -293,6 +295,33 @@ def test_remove_session(self):
293295
self.assertEqual(len(annot["c_uids"]), 2)
294296
self.assertEqual(len(annot["sessions"]), 1)
295297

298+
def test_get_file_uid_url(self):
299+
"""Test generating file download URL from UID."""
300+
uid = "f40682caafc045b4b81973bd82ea9ab6"
301+
# Test error when no root_url is configured
302+
with self.assertRaises(Exception) as cm:
303+
get_file_uid_url(uid)
304+
self.assertIn("No root URL provided", str(cm.exception))
305+
306+
api.portal.set_registry_record("imio.esign.file_url", "https://downloads.files.com")
307+
308+
result = get_file_uid_url(uid)
309+
self.assertEqual(result, "https://downloads.files.com/Rzgwy-9BVG9-viEts-5GBkn-Rm")
310+
311+
result = get_file_uid_url(uid, separator="_", block_size=3)
312+
self.assertEqual(result, "https://downloads.files.com/Rzg_wy9_BVG_9vi_Ets_5GB_knR_m")
313+
314+
custom_url = "https://custom.domain.org/"
315+
result = get_file_uid_url(uid, root_url=custom_url)
316+
self.assertEqual(result, "https://custom.domain.org/Rzgwy-9BVG9-viEts-5GBkn-Rm")
317+
318+
# Test with another UID to verify encoding works
319+
uid2 = self.uids[0]
320+
result2 = get_file_uid_url(uid2)
321+
self.assertTrue(result2.startswith("https://downloads.files.com/"))
322+
suid = result2[len("https://downloads.files.com/") :]
323+
self.assertEqual(shortuid_decode_id(suid, separator="-"), uid2) # correctly decoded
324+
296325

297326
# example of annotation content
298327
"""

src/imio/esign/utils.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from imio.helpers.content import uuidToObject
99
from imio.helpers.transmogrifier import get_correct_id
1010
from imio.pyutils.system import post_request
11+
from imio.pyutils.utils import shortuid_encode_id
1112
from os import path
1213
from persistent.list import PersistentList
1314
from persistent.mapping import PersistentMapping
@@ -376,3 +377,21 @@ def remove_session(session_id):
376377

377378
del sessions[session_id]
378379
# logger.info("Session %s removed", session_id)
380+
381+
382+
def get_file_uid_url(uid, separator="-", block_size=5, root_url=None):
383+
"""Get the file download URL for a given file UID.
384+
385+
:param uid: file UID
386+
:param separator: separator used in short UID encoding
387+
:param block_size: block size used in short UID encoding
388+
:param root_url: root URL. If not provided, the settings value is used
389+
:return: file download URL
390+
"""
391+
if not root_url:
392+
root_url = api.portal.get_registry_record("imio.esign.file_url", default="")
393+
394+
if not root_url:
395+
raise Exception("No root URL provided for file download url.")
396+
short_uid = shortuid_encode_id(uid, separator=separator, block_size=block_size)
397+
return "{}/{}".format(root_url.strip('/'), short_uid)

0 commit comments

Comments
 (0)