def _send_signature_request(self, test_mode=False, client_id=None, files=None, file_urls=None, title=None, subject=None, message=None, signing_redirect_url=None, signers=None, cc_email_addresses=None, form_fields_per_document=None, use_text_tags=False, hide_text_tags=False, metadata=None, ux_version=None, allow_decline=False):
        ''' To share the same logic between send_signature_request &
            send_signature_request_embedded functions

        Args:

            test_mode (bool, optional):             Whether this is a test, the signature request will not be legally binding if set to True. Defaults to False.

            client_id (str):                        Client id of the app you're using to create this embedded signature request. Visit the embedded page to learn more about this parameter (https://www.hellosign.com/api/embeddedSigningWalkthrough)

            files (list of str):                    The uploaded file(s) to send for signature

            file_urls (list of str):                URLs of the file for HelloSign to download to send for signature. Use either `files` or `file_urls`

            title (str, optional):                  The title you want to assign to the SignatureRequest

            subject (str, optional):                The subject in the email that will be sent to the signers

            message (str, optional):                The custom message in the email that will be sent to the signers

            signing_redirect_url (str, optional):   The URL you want the signer redirected to after they successfully sign

            signers (list of dict):                 A list of signers, which each has the following attributes:

                name (str):                         The name of the signer
                email_address (str):                Email address of the signer
                order (str, optional):              The order the signer is required to sign in
                pin (str, optional):                The 4- to 12-character access code that will secure this signer's signature page

            cc_email_addresses (list, optional):    A list of email addresses that should be CCed

            form_fields_per_document (str):         The fields that should appear on the document, expressed as a serialized JSON data structure which is a list of lists of the form fields. Please refer to the API reference of HelloSign for more details (https://www.hellosign.com/api/reference#SignatureRequest)

            use_text_tags (bool, optional):         Use text tags in the provided file(s) to create form fields

            hide_text_tags (bool, optional):        Hide text tag areas

            metadata (dict, optional):              Metadata to associate with the signature request

            ux_version (int):                       UX version, either 1 (default) or 2.

            allow_decline (bool, optional);         Allows signers to decline to sign a document if set to 1. Defaults to 0.

        Returns:
            A SignatureRequest object

        '''

        # Files
        files_payload = HSFormat.format_file_params(files)

        # File URLs
        file_urls_payload = HSFormat.format_file_url_params(file_urls)

        # Signers
        signers_payload = HSFormat.format_dict_list(signers, 'signers')

        # CCs
        cc_email_addresses_payload = HSFormat.format_param_list(cc_email_addresses, 'cc_email_addresses')

        # Metadata
        metadata_payload = HSFormat.format_single_dict(metadata, 'metadata')

        payload = {
            "test_mode": self._boolean(test_mode),
            "client_id": client_id,
            "title": title,
            "subject": subject,
            "message": message,
            "signing_redirect_url": signing_redirect_url,
            "form_fields_per_document": form_fields_per_document,
            "use_text_tags": self._boolean(use_text_tags),
            "hide_text_tags": self._boolean(hide_text_tags),
            "allow_decline": self._boolean(allow_decline)
        }

        if ux_version is not None:
            payload['ux_version'] = ux_version

        # remove attributes with none value
        payload = HSFormat.strip_none_values(payload)

        url = self.SIGNATURE_REQUEST_CREATE_URL
        if client_id:
            url = self.SIGNATURE_REQUEST_CREATE_EMBEDDED_URL

        data = {}
        data.update(payload)
        data.update(signers_payload)
        data.update(cc_email_addresses_payload)
        data.update(file_urls_payload)
        data.update(metadata_payload)

        request = self._get_request()
        response = request.post(url, data=data, files=files_payload)
        return response
To share the same logic between send_signature_request &
            send_signature_request_embedded functions

        Args:

            test_mode (bool, optional):             Whether this is a test, the signature request will not be legally binding if set to True. Defaults to False.

            client_id (str):                        Client id of the app you're using to create this embedded signature request. Visit the embedded page to learn more about this parameter (https://www.hellosign.com/api/embeddedSigningWalkthrough)

            files (list of str):                    The uploaded file(s) to send for signature

            file_urls (list of str):                URLs of the file for HelloSign to download to send for signature. Use either `files` or `file_urls`

            title (str, optional):                  The title you want to assign to the SignatureRequest

            subject (str, optional):                The subject in the email that will be sent to the signers

            message (str, optional):                The custom message in the email that will be sent to the signers

            signing_redirect_url (str, optional):   The URL you want the signer redirected to after they successfully sign

            signers (list of dict):                 A list of signers, which each has the following attributes:

                name (str):                         The name of the signer
                email_address (str):                Email address of the signer
                order (str, optional):              The order the signer is required to sign in
                pin (str, optional):                The 4- to 12-character access code that will secure this signer's signature page

            cc_email_addresses (list, optional):    A list of email addresses that should be CCed

            form_fields_per_document (str):         The fields that should appear on the document, expressed as a serialized JSON data structure which is a list of lists of the form fields. Please refer to the API reference of HelloSign for more details (https://www.hellosign.com/api/reference#SignatureRequest)

            use_text_tags (bool, optional):         Use text tags in the provided file(s) to create form fields

            hide_text_tags (bool, optional):        Hide text tag areas

            metadata (dict, optional):              Metadata to associate with the signature request

            ux_version (int):                       UX version, either 1 (default) or 2.

            allow_decline (bool, optional);         Allows signers to decline to sign a document if set to 1. Defaults to 0.

        Returns:
            A SignatureRequest object