From 5be5ff03c89179cee776156dd15b7819cd6607f3 Mon Sep 17 00:00:00 2001 From: rh0mb Date: Tue, 22 Jul 2025 10:58:44 -0600 Subject: [PATCH 1/3] Fix: serialize allowed_signature_methods correctly as JSON array MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR fixes an issue where the SDK was incorrectly sending `allowed_signature_methods` as a Python string instead of a JSON array, causing a 500 Internal Server Error when using mixed signature types like `FEA` and `FESCV`. ### What’s changed - In the `Document.create()` method, the `allowed_signature_methods` field is now properly serialized using `json.dumps()` before being sent in the form data. ### Why The Mifiel API expects `allowed_signature_methods` to be a JSON array (e.g. `["FEA"]`), not a Python string like `"['FEA']"` or `"FEA,FESCV"`. The previous version of the SDK unintentionally broke this compatibility when posting multipart/form-data requests. --- mifiel/document.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mifiel/document.py b/mifiel/document.py index 783e274..2d51ea9 100644 --- a/mifiel/document.py +++ b/mifiel/document.py @@ -49,11 +49,10 @@ def create(client, signatories, **kwargs): if 'viewers' in data: viewers = data.pop('viewers') - for index, item in enumerate(viewers): - for key, val in item.items(): - data.update( - {'viewers[' + str(index) + '][' + str(key) + ']': val} - ) + for index, item in enumerate(signatories): + for key, val in item.items(): + value = json.dumps(val) if key == 'allowed_signature_methods' and isinstance(val, list) else val + data[f'signatories[{index}][{key}]'] = value if 'callback_url' in kwargs: data['callback_url'] = kwargs.get('callback_url') if file: From 14200813e3578ef17c5c4d23885d90a3e3a142a7 Mon Sep 17 00:00:00 2001 From: rh0mb Date: Tue, 22 Jul 2025 13:30:44 -0600 Subject: [PATCH 2/3] Fix: send allowed_signature_methods as array using [] syntax in multipart/form-data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, allowed_signature_methods was being serialized either as a plain string or using indexed keys (e.g., [0], [1]), which resulted in incorrect array parsing by the Mifiel API backend. This commit updates the serialization to use the `[]` syntax: signatories[0][allowed_signature_methods][]=FEA signatories[0][allowed_signature_methods][]=FESCV This is a widely supported format for arrays in multipart/form-data and ensures compatibility with the backend’s expected structure. Also removes the use of json.dumps, which was turning arrays into escaped strings instead of sending them as proper arrays. --- mifiel/document.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/mifiel/document.py b/mifiel/document.py index 2d51ea9..20bdc52 100644 --- a/mifiel/document.py +++ b/mifiel/document.py @@ -43,16 +43,19 @@ def create(client, signatories, **kwargs): data = kwargs.copy() for index, item in enumerate(signatories): for key, val in item.items(): - data.update( - {'signatories[' + str(index) + '][' + str(key) + ']': val} - ) + if key == 'allowed_signature_methods' and isinstance(val, list): + for method in val: + data[f'signatories[{index}][{key}][]'] = method + else: + data[f'signatories[{index}][{key}]'] = val if 'viewers' in data: viewers = data.pop('viewers') - for index, item in enumerate(signatories): - for key, val in item.items(): - value = json.dumps(val) if key == 'allowed_signature_methods' and isinstance(val, list) else val - data[f'signatories[{index}][{key}]'] = value + for index, item in enumerate(viewers): + for key, val in item.items(): + data.update( + {'viewers[' + str(index) + '][' + str(key) + ']': val} + ) if 'callback_url' in kwargs: data['callback_url'] = kwargs.get('callback_url') if file: From 5d36fcaa0c6f347a618fbaa89c76ac6740fcd6c6 Mon Sep 17 00:00:00 2001 From: rh0mb Date: Tue, 22 Jul 2025 14:50:22 -0600 Subject: [PATCH 3/3] Fix: properly support multiple allowed_signature_methods per signer Replaced internal data structure with a list of tuples to correctly handle multiple allowed_signature_methods for each signer in multipart/form-data. This change ensures repeated keys are preserved, allowing the backend to receive arrays like: signatories[0][allowed_signature_methods][]=FEA signatories[0][allowed_signature_methods][]=FESCV instead of silently overwriting values when using a dict. --- mifiel/document.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mifiel/document.py b/mifiel/document.py index 20bdc52..fa97039 100644 --- a/mifiel/document.py +++ b/mifiel/document.py @@ -45,9 +45,13 @@ def create(client, signatories, **kwargs): for key, val in item.items(): if key == 'allowed_signature_methods' and isinstance(val, list): for method in val: - data[f'signatories[{index}][{key}][]'] = method + data.append( + (f'signatories[{index}][{key}][]', method) + ) else: - data[f'signatories[{index}][{key}]'] = val + data.append( + (f'signatories[{index}][{key}]', val) + ) if 'viewers' in data: viewers = data.pop('viewers')