From 8e614741575acbaca128fa16d6e4356422e4b2bf Mon Sep 17 00:00:00 2001 From: Ajevan M Date: Wed, 4 Mar 2026 11:06:17 -0500 Subject: [PATCH 1/4] Resolve VCSWP-23999 --- README.md | 3 +- docs/CallResult.md | 1 + docs/DefaultApi.md | 32 ++-- freeclimb/__init__.py | 2 +- freeclimb/api/default_api.py | 251 +++++++++++++++++++++++++++++++- freeclimb/api_client.py | 2 +- freeclimb/configuration.py | 2 +- freeclimb/models/call_result.py | 15 ++ openapi.json | 71 ++++++++- pyproject.toml | 2 +- setup.py | 2 +- test/api/test_default_api.py | 72 ++++++++- test/models/test_call_result.py | 5 + 13 files changed, 434 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 45a3a4d..96b898b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ FreeClimb is a cloud-based application programming interface (API) that puts the This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0.0 -- Package version: 5.3.0 +- Package version: 5.2.1 - Generator version: 7.9.0 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://www.freeclimb.com/support/](https://www.freeclimb.com/support/) @@ -389,4 +389,3 @@ Authentication schemes defined for the API: support@freeclimb.com - diff --git a/docs/CallResult.md b/docs/CallResult.md index fbf17a1..afe8a1d 100644 --- a/docs/CallResult.md +++ b/docs/CallResult.md @@ -21,6 +21,7 @@ Name | Type | Description | Notes **end_time** | **str** | End time of the Call (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). Empty if the Call did not complete successfully. | [optional] **duration** | **int** | Total length of the Call in seconds. Measures time between startTime and endTime. This value is empty for busy, failed, unanswered or ongoing Calls. | [optional] **connect_duration** | **int** | Length of time that the Call was connected in seconds. Measures time between connectTime and endTime. This value is empty for busy, failed, unanswered or ongoing Calls. | [optional] +**audio_stream_duration** | **int** | Length of time that the Call used the audio stream in seconds. This value is empty or zero when the Call did not use the audio stream. | [optional] **direction** | [**CallDirection**](CallDirection.md) | | [optional] **answered_by** | [**AnsweredBy**](AnsweredBy.md) | | [optional] **subresource_uris** | **object** | The list of subresources for this Call. These include things like logs and recordings associated with the Call. | [optional] diff --git a/docs/DefaultApi.md b/docs/DefaultApi.md index 42f6a4c..6f5c040 100644 --- a/docs/DefaultApi.md +++ b/docs/DefaultApi.md @@ -310,7 +310,7 @@ Name | Type | Description | Notes | Status code | Description | Response headers | |-------------|-------------|------------------| -**200** | Successfuly created queue | - | +**201** | Successfuly created queue | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -3583,7 +3583,7 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **list_call_recordings** -> RecordingList list_call_recordings(account_id, call_id, date_created=date_created) +> RecordingList list_call_recordings(account_id, call_id, date_created=date_created, start_time=start_time, end_time=end_time) List Call Recordings @@ -3621,10 +3621,12 @@ with freeclimb.ApiClient(configuration) as api_client: account_id = 'AC170e4c66d358aa1755931da0452561933d1b8fd5' # str | ID of the account call_id = 'call_id_example' # str | String that uniquely identifies this call resource. date_created = 'date_created_example' # str | Only show recordings created on the specified date, in the form *YYYY-MM-DD*. (optional) + start_time = 'start_time_example' # str | Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. (optional) + end_time = 'end_time_example' # str | Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. (optional) try: # List Call Recordings - api_response = api_instance.list_call_recordings(account_id, call_id, date_created=date_created) + api_response = api_instance.list_call_recordings(account_id, call_id, date_created=date_created, start_time=start_time, end_time=end_time) print("The response of DefaultApi->list_call_recordings:\n") pprint(api_response) except Exception as e: @@ -3641,6 +3643,8 @@ Name | Type | Description | Notes **account_id** | **str**| ID of the account | **call_id** | **str**| String that uniquely identifies this call resource. | **date_created** | **str**| Only show recordings created on the specified date, in the form *YYYY-MM-DD*. | [optional] + **start_time** | **str**| Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. | [optional] + **end_time** | **str**| Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. | [optional] ### Return type @@ -3664,7 +3668,7 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **list_calls** -> CallList list_calls(account_id, active=active, to=to, var_from=var_from, status=status, start_time=start_time, end_time=end_time, parent_call_id=parent_call_id, application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max) +> CallList list_calls(account_id, used_audio_stream=used_audio_stream, active=active, to=to, var_from=var_from, status=status, start_time=start_time, end_time=end_time, parent_call_id=parent_call_id, application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max) List Calls @@ -3701,6 +3705,7 @@ with freeclimb.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = freeclimb.DefaultApi(api_client) account_id = 'AC170e4c66d358aa1755931da0452561933d1b8fd5' # str | ID of the account + used_audio_stream = False # bool | If usedAudioStream is set to true then all calls that have a audioStreamDuration > 0 will be returned (optional) (default to False) active = False # bool | If active is set to true then all calls of the nature queued, ringing, inProgress are returned in the query. (optional) (default to False) to = 'to_example' # str | Only show Calls to this phone number. (optional) var_from = 'var_from_example' # str | Only show Calls from this phone number. (optional) @@ -3714,7 +3719,7 @@ with freeclimb.ApiClient(configuration) as api_client: try: # List Calls - api_response = api_instance.list_calls(account_id, active=active, to=to, var_from=var_from, status=status, start_time=start_time, end_time=end_time, parent_call_id=parent_call_id, application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max) + api_response = api_instance.list_calls(account_id, used_audio_stream=used_audio_stream, active=active, to=to, var_from=var_from, status=status, start_time=start_time, end_time=end_time, parent_call_id=parent_call_id, application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max) print("The response of DefaultApi->list_calls:\n") pprint(api_response) except Exception as e: @@ -3729,6 +3734,7 @@ with freeclimb.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **account_id** | **str**| ID of the account | + **used_audio_stream** | **bool**| If usedAudioStream is set to true then all calls that have a audioStreamDuration > 0 will be returned | [optional] [default to False] **active** | **bool**| If active is set to true then all calls of the nature queued, ringing, inProgress are returned in the query. | [optional] [default to False] **to** | **str**| Only show Calls to this phone number. | [optional] **var_from** | **str**| Only show Calls from this phone number. | [optional] @@ -3762,7 +3768,7 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **list_conference_recordings** -> RecordingList list_conference_recordings(account_id, conference_id, call_id=call_id, date_created=date_created) +> RecordingList list_conference_recordings(account_id, conference_id, call_id=call_id, date_created=date_created, start_time=start_time, end_time=end_time) List Conference Recordings @@ -3801,10 +3807,12 @@ with freeclimb.ApiClient(configuration) as api_client: conference_id = 'conference_id_example' # str | Show only Recordings made during the conference with this ID. call_id = 'call_id_example' # str | Show only Recordings made during the Call with this ID. (optional) date_created = 'date_created_example' # str | Only show Recordings created on this date, formatted as *YYYY-MM-DD*. (optional) + start_time = 'start_time_example' # str | Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. (optional) + end_time = 'end_time_example' # str | Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. (optional) try: # List Conference Recordings - api_response = api_instance.list_conference_recordings(account_id, conference_id, call_id=call_id, date_created=date_created) + api_response = api_instance.list_conference_recordings(account_id, conference_id, call_id=call_id, date_created=date_created, start_time=start_time, end_time=end_time) print("The response of DefaultApi->list_conference_recordings:\n") pprint(api_response) except Exception as e: @@ -3822,6 +3830,8 @@ Name | Type | Description | Notes **conference_id** | **str**| Show only Recordings made during the conference with this ID. | **call_id** | **str**| Show only Recordings made during the Call with this ID. | [optional] **date_created** | **str**| Only show Recordings created on this date, formatted as *YYYY-MM-DD*. | [optional] + **start_time** | **str**| Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. | [optional] + **end_time** | **str**| Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. | [optional] ### Return type @@ -4281,7 +4291,7 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **list_recordings** -> RecordingList list_recordings(account_id, call_id=call_id, conference_id=conference_id, date_created=date_created) +> RecordingList list_recordings(account_id, call_id=call_id, conference_id=conference_id, date_created=date_created, start_time=start_time, end_time=end_time) List Recordings @@ -4320,10 +4330,12 @@ with freeclimb.ApiClient(configuration) as api_client: call_id = 'call_id_example' # str | Show only Recordings made during the Call with this ID. (optional) conference_id = 'conference_id_example' # str | Show only Recordings made during the conference with this ID. (optional) date_created = 'date_created_example' # str | Only show Recordings created on this date, formatted as *YYYY-MM-DD*. (optional) + start_time = 'start_time_example' # str | Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. (optional) + end_time = 'end_time_example' # str | Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. (optional) try: # List Recordings - api_response = api_instance.list_recordings(account_id, call_id=call_id, conference_id=conference_id, date_created=date_created) + api_response = api_instance.list_recordings(account_id, call_id=call_id, conference_id=conference_id, date_created=date_created, start_time=start_time, end_time=end_time) print("The response of DefaultApi->list_recordings:\n") pprint(api_response) except Exception as e: @@ -4341,6 +4353,8 @@ Name | Type | Description | Notes **call_id** | **str**| Show only Recordings made during the Call with this ID. | [optional] **conference_id** | **str**| Show only Recordings made during the conference with this ID. | [optional] **date_created** | **str**| Only show Recordings created on this date, formatted as *YYYY-MM-DD*. | [optional] + **start_time** | **str**| Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. | [optional] + **end_time** | **str**| Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. | [optional] ### Return type diff --git a/freeclimb/__init__.py b/freeclimb/__init__.py index 73df7e2..abb385e 100644 --- a/freeclimb/__init__.py +++ b/freeclimb/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "5.3.0" +__version__ = "5.2.1" # import apis into sdk package from freeclimb.api.default_api import DefaultApi as DefaultApi diff --git a/freeclimb/api/default_api.py b/freeclimb/api/default_api.py index 57d827a..da28473 100644 --- a/freeclimb/api/default_api.py +++ b/freeclimb/api/default_api.py @@ -801,7 +801,7 @@ def create_a_queue( ) _response_types_map: Dict[str, Optional[str]] = { - "200": "QueueResult", + "201": "QueueResult", } response_data = self.api_client.call_api( *_param, _request_timeout=_request_timeout @@ -870,7 +870,7 @@ def create_a_queue_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - "200": "QueueResult", + "201": "QueueResult", } response_data = self.api_client.call_api( *_param, _request_timeout=_request_timeout @@ -939,7 +939,7 @@ def create_a_queue_without_preload_content( ) _response_types_map: Dict[str, Optional[str]] = { - "200": "QueueResult", + "201": "QueueResult", } response_data = self.api_client.call_api( *_param, _request_timeout=_request_timeout @@ -12100,6 +12100,18 @@ def list_call_recordings( description="Only show recordings created on the specified date, in the form *YYYY-MM-DD*." ), ] = None, + start_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, + end_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -12121,6 +12133,12 @@ def list_call_recordings( :param date_created: Only show recordings created on the specified date, in the form *YYYY-MM-DD*. :type date_created: str + :param start_time: Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. + :type start_time: str + + :param end_time: Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. + :type end_time: str + :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -12148,6 +12166,8 @@ def list_call_recordings( account_id=account_id, call_id=call_id, date_created=date_created, + start_time=start_time, + end_time=end_time, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -12179,6 +12199,18 @@ def list_call_recordings_with_http_info( description="Only show recordings created on the specified date, in the form *YYYY-MM-DD*." ), ] = None, + start_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, + end_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -12200,6 +12232,12 @@ def list_call_recordings_with_http_info( :param date_created: Only show recordings created on the specified date, in the form *YYYY-MM-DD*. :type date_created: str + :param start_time: Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. + :type start_time: str + + :param end_time: Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. + :type end_time: str + :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -12227,6 +12265,8 @@ def list_call_recordings_with_http_info( account_id=account_id, call_id=call_id, date_created=date_created, + start_time=start_time, + end_time=end_time, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -12258,6 +12298,18 @@ def list_call_recordings_without_preload_content( description="Only show recordings created on the specified date, in the form *YYYY-MM-DD*." ), ] = None, + start_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, + end_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -12279,6 +12331,12 @@ def list_call_recordings_without_preload_content( :param date_created: Only show recordings created on the specified date, in the form *YYYY-MM-DD*. :type date_created: str + :param start_time: Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. + :type start_time: str + + :param end_time: Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. + :type end_time: str + :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -12306,6 +12364,8 @@ def list_call_recordings_without_preload_content( account_id=account_id, call_id=call_id, date_created=date_created, + start_time=start_time, + end_time=end_time, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -12325,6 +12385,8 @@ def _list_call_recordings_serialize( account_id, call_id, date_created, + start_time, + end_time, _request_auth, _content_type, _headers, @@ -12354,6 +12416,14 @@ def _list_call_recordings_serialize( _query_params.append(("dateCreated", date_created)) + if start_time is not None: + + _query_params.append(("startTime", start_time)) + + if end_time is not None: + + _query_params.append(("endTime", end_time)) + # process the header parameters # process the form parameters # process the body parameter @@ -12385,6 +12455,12 @@ def _list_call_recordings_serialize( @validate_call def list_calls( self, + used_audio_stream: Annotated[ + Optional[StrictBool], + Field( + description="If usedAudioStream is set to true then all calls that have a audioStreamDuration > 0 will be returned " + ), + ] = None, active: Annotated[ Optional[StrictBool], Field( @@ -12458,6 +12534,9 @@ def list_calls( """List Calls + :param used_audio_stream: If usedAudioStream is set to true then all calls that have a audioStreamDuration > 0 will be returned + :type used_audio_stream: bool + :param active: If active is set to true then all calls of the nature queued, ringing, inProgress are returned in the query. :type active: bool @@ -12513,6 +12592,7 @@ def list_calls( _param = self._list_calls_serialize( account_id=account_id, + used_audio_stream=used_audio_stream, active=active, to=to, var_from=var_from, @@ -12544,6 +12624,12 @@ def list_calls( @validate_call def list_calls_with_http_info( self, + used_audio_stream: Annotated[ + Optional[StrictBool], + Field( + description="If usedAudioStream is set to true then all calls that have a audioStreamDuration > 0 will be returned " + ), + ] = None, active: Annotated[ Optional[StrictBool], Field( @@ -12617,6 +12703,9 @@ def list_calls_with_http_info( """List Calls + :param used_audio_stream: If usedAudioStream is set to true then all calls that have a audioStreamDuration > 0 will be returned + :type used_audio_stream: bool + :param active: If active is set to true then all calls of the nature queued, ringing, inProgress are returned in the query. :type active: bool @@ -12672,6 +12761,7 @@ def list_calls_with_http_info( _param = self._list_calls_serialize( account_id=account_id, + used_audio_stream=used_audio_stream, active=active, to=to, var_from=var_from, @@ -12703,6 +12793,12 @@ def list_calls_with_http_info( @validate_call def list_calls_without_preload_content( self, + used_audio_stream: Annotated[ + Optional[StrictBool], + Field( + description="If usedAudioStream is set to true then all calls that have a audioStreamDuration > 0 will be returned " + ), + ] = None, active: Annotated[ Optional[StrictBool], Field( @@ -12776,6 +12872,9 @@ def list_calls_without_preload_content( """List Calls + :param used_audio_stream: If usedAudioStream is set to true then all calls that have a audioStreamDuration > 0 will be returned + :type used_audio_stream: bool + :param active: If active is set to true then all calls of the nature queued, ringing, inProgress are returned in the query. :type active: bool @@ -12831,6 +12930,7 @@ def list_calls_without_preload_content( _param = self._list_calls_serialize( account_id=account_id, + used_audio_stream=used_audio_stream, active=active, to=to, var_from=var_from, @@ -12858,6 +12958,7 @@ def list_calls_without_preload_content( def _list_calls_serialize( self, account_id, + used_audio_stream, active, to, var_from, @@ -12893,6 +12994,10 @@ def _list_calls_serialize( if account_id is not None: _path_params["accountId"] = account_id # process the query parameters + if used_audio_stream is not None: + + _query_params.append(("usedAudioStream", used_audio_stream)) + if active is not None: _query_params.append(("active", active)) @@ -12982,6 +13087,18 @@ def list_conference_recordings( description="Only show Recordings created on this date, formatted as *YYYY-MM-DD*." ), ] = None, + start_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, + end_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -13006,6 +13123,12 @@ def list_conference_recordings( :param date_created: Only show Recordings created on this date, formatted as *YYYY-MM-DD*. :type date_created: str + :param start_time: Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. + :type start_time: str + + :param end_time: Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. + :type end_time: str + :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -13034,6 +13157,8 @@ def list_conference_recordings( conference_id=conference_id, call_id=call_id, date_created=date_created, + start_time=start_time, + end_time=end_time, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -13073,6 +13198,18 @@ def list_conference_recordings_with_http_info( description="Only show Recordings created on this date, formatted as *YYYY-MM-DD*." ), ] = None, + start_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, + end_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -13097,6 +13234,12 @@ def list_conference_recordings_with_http_info( :param date_created: Only show Recordings created on this date, formatted as *YYYY-MM-DD*. :type date_created: str + :param start_time: Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. + :type start_time: str + + :param end_time: Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. + :type end_time: str + :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -13125,6 +13268,8 @@ def list_conference_recordings_with_http_info( conference_id=conference_id, call_id=call_id, date_created=date_created, + start_time=start_time, + end_time=end_time, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -13164,6 +13309,18 @@ def list_conference_recordings_without_preload_content( description="Only show Recordings created on this date, formatted as *YYYY-MM-DD*." ), ] = None, + start_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, + end_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -13188,6 +13345,12 @@ def list_conference_recordings_without_preload_content( :param date_created: Only show Recordings created on this date, formatted as *YYYY-MM-DD*. :type date_created: str + :param start_time: Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. + :type start_time: str + + :param end_time: Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. + :type end_time: str + :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -13216,6 +13379,8 @@ def list_conference_recordings_without_preload_content( conference_id=conference_id, call_id=call_id, date_created=date_created, + start_time=start_time, + end_time=end_time, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -13236,6 +13401,8 @@ def _list_conference_recordings_serialize( conference_id, call_id, date_created, + start_time, + end_time, _request_auth, _content_type, _headers, @@ -13269,6 +13436,14 @@ def _list_conference_recordings_serialize( _query_params.append(("dateCreated", date_created)) + if start_time is not None: + + _query_params.append(("startTime", start_time)) + + if end_time is not None: + + _query_params.append(("endTime", end_time)) + # process the header parameters # process the form parameters # process the body parameter @@ -15228,6 +15403,18 @@ def list_recordings( description="Only show Recordings created on this date, formatted as *YYYY-MM-DD*." ), ] = None, + start_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, + end_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -15252,6 +15439,12 @@ def list_recordings( :param date_created: Only show Recordings created on this date, formatted as *YYYY-MM-DD*. :type date_created: str + :param start_time: Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. + :type start_time: str + + :param end_time: Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. + :type end_time: str + :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -15280,6 +15473,8 @@ def list_recordings( call_id=call_id, conference_id=conference_id, date_created=date_created, + start_time=start_time, + end_time=end_time, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -15319,6 +15514,18 @@ def list_recordings_with_http_info( description="Only show Recordings created on this date, formatted as *YYYY-MM-DD*." ), ] = None, + start_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, + end_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -15343,6 +15550,12 @@ def list_recordings_with_http_info( :param date_created: Only show Recordings created on this date, formatted as *YYYY-MM-DD*. :type date_created: str + :param start_time: Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. + :type start_time: str + + :param end_time: Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. + :type end_time: str + :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -15371,6 +15584,8 @@ def list_recordings_with_http_info( call_id=call_id, conference_id=conference_id, date_created=date_created, + start_time=start_time, + end_time=end_time, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -15410,6 +15625,18 @@ def list_recordings_without_preload_content( description="Only show Recordings created on this date, formatted as *YYYY-MM-DD*." ), ] = None, + start_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, + end_time: Annotated[ + Optional[StrictStr], + Field( + description="Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss." + ), + ] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -15434,6 +15661,12 @@ def list_recordings_without_preload_content( :param date_created: Only show Recordings created on this date, formatted as *YYYY-MM-DD*. :type date_created: str + :param start_time: Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss. + :type start_time: str + + :param end_time: Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss. + :type end_time: str + :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -15462,6 +15695,8 @@ def list_recordings_without_preload_content( call_id=call_id, conference_id=conference_id, date_created=date_created, + start_time=start_time, + end_time=end_time, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -15482,6 +15717,8 @@ def _list_recordings_serialize( call_id, conference_id, date_created, + start_time, + end_time, _request_auth, _content_type, _headers, @@ -15517,6 +15754,14 @@ def _list_recordings_serialize( _query_params.append(("dateCreated", date_created)) + if start_time is not None: + + _query_params.append(("startTime", start_time)) + + if end_time is not None: + + _query_params.append(("endTime", end_time)) + # process the header parameters # process the form parameters # process the body parameter diff --git a/freeclimb/api_client.py b/freeclimb/api_client.py index 882c5bb..57f4b6e 100644 --- a/freeclimb/api_client.py +++ b/freeclimb/api_client.py @@ -88,7 +88,7 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = "OpenAPI-Generator/5.3.0/python" + self.user_agent = "OpenAPI-Generator/5.2.1/python" self.client_side_validation = configuration.client_side_validation def __enter__(self): diff --git a/freeclimb/configuration.py b/freeclimb/configuration.py index e2beb3d..75d9051 100644 --- a/freeclimb/configuration.py +++ b/freeclimb/configuration.py @@ -427,7 +427,7 @@ def to_debug_report(self): "OS: {env}\n" "Python Version: {pyversion}\n" "Version of the API: 1.0.0\n" - "SDK Package Version: 5.3.0".format(env=sys.platform, pyversion=sys.version) + "SDK Package Version: 5.2.1".format(env=sys.platform, pyversion=sys.version) ) def get_host_settings(self): diff --git a/freeclimb/models/call_result.py b/freeclimb/models/call_result.py index d659fa9..27e6aaf 100644 --- a/freeclimb/models/call_result.py +++ b/freeclimb/models/call_result.py @@ -103,6 +103,11 @@ class CallResult( description="Length of time that the Call was connected in seconds. Measures time between connectTime and endTime. This value is empty for busy, failed, unanswered or ongoing Calls.", alias="connectDuration", ) + audio_stream_duration: Optional[StrictInt] = Field( + default=None, + description="Length of time that the Call used the audio stream in seconds. This value is empty or zero when the Call did not use the audio stream.", + alias="audioStreamDuration", + ) direction: Optional[CallDirection] = None answered_by: Optional[AnsweredBy] = Field(default=None, alias="answeredBy") subresource_uris: Optional[Dict[str, Any]] = Field( @@ -133,6 +138,7 @@ class CallResult( "endTime", "duration", "connectDuration", + "audioStreamDuration", "direction", "answeredBy", "subresourceUris", @@ -233,6 +239,14 @@ def to_dict(self) -> Dict[str, Any]: ): _dict["connectDuration"] = None + # set to None if audio_stream_duration (nullable) is None + # and model_fields_set contains the field + if ( + self.audio_stream_duration is None + and "audio_stream_duration" in self.model_fields_set + ): + _dict["audioStreamDuration"] = None + # set to None if direction (nullable) is None # and model_fields_set contains the field if self.direction is None and "direction" in self.model_fields_set: @@ -285,6 +299,7 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "endTime": obj.get("endTime"), "duration": obj.get("duration"), "connectDuration": obj.get("connectDuration"), + "audioStreamDuration": obj.get("audioStreamDuration"), "direction": obj.get("direction"), "answeredBy": obj.get("answeredBy"), "subresourceUris": obj.get("subresourceUris"), diff --git a/openapi.json b/openapi.json index d89e37c..fd9ec40 100644 --- a/openapi.json +++ b/openapi.json @@ -3175,6 +3175,11 @@ "description": "Length of time that the Call was connected in seconds. Measures time between connectTime and endTime. This value is empty for busy, failed, unanswered or ongoing Calls.", "nullable": true }, + "audioStreamDuration": { + "type": "integer", + "description": "Length of time that the Call used the audio stream in seconds. This value is empty or zero when the Call did not use the audio stream.", + "nullable": true + }, "direction": { "$ref": "#/components/schemas/CallDirection" }, @@ -6003,6 +6008,16 @@ "summary": "List Calls", "operationId": "list-calls", "parameters": [ + { + "name": "usedAudioStream", + "in": "query", + "description": "If usedAudioStream is set to true then all calls that have a audioStreamDuration > 0 will be returned ", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + }, { "name": "active", "in": "query", @@ -6145,6 +6160,24 @@ "schema": { "type": "string" } + }, + { + "name": "startTime", + "in": "query", + "description": "Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "endTime", + "in": "query", + "description": "Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss.", + "required": false, + "schema": { + "type": "string" + } } ], "deprecated": false, @@ -6619,6 +6652,24 @@ "schema": { "type": "string" } + }, + { + "name": "startTime", + "in": "query", + "description": "Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "endTime", + "in": "query", + "description": "Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss.", + "required": false, + "schema": { + "type": "string" + } } ], "responses": { @@ -6766,7 +6817,7 @@ }, "deprecated": false, "responses": { - "200": { + "201": { "description": "Successfuly created queue", "content": { "application/json": { @@ -7057,6 +7108,24 @@ }, { "$ref": "#/components/parameters/AccountId" + }, + { + "name": "startTime", + "in": "query", + "description": "Only show Recordings created at or after this time, given as YYYY-MM-DD hh:mm:ss.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "endTime", + "in": "query", + "description": "Only show Recordings created at or before this time, given as YYYY-MM-DD hh:mm:ss.", + "required": false, + "schema": { + "type": "string" + } } ], "responses": { diff --git a/pyproject.toml b/pyproject.toml index 0904b06..9fad184 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "freeclimb" -version = "5.3.0" +version = "5.2.1" description = "FreeClimb API" authors = ["FreeClimb API Support "] license = "NoLicense" diff --git a/setup.py b/setup.py index 9680322..312bb77 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "FreeClimb" -VERSION = "5.3.0" +VERSION = "5.2.1" PYTHON_REQUIRES = ">= 3.8" REQUIRES = [ "urllib3 >= 1.25.3, < 3.0.0", diff --git a/test/api/test_default_api.py b/test/api/test_default_api.py index c8d3ada..e59d855 100644 --- a/test/api/test_default_api.py +++ b/test/api/test_default_api.py @@ -77,6 +77,7 @@ from freeclimb.models.export_request import ExportRequest from freeclimb.models.export_result import ExportResult from freeclimb.models.export_result_output import ExportResultOutput +from freeclimb.models.export_result_output import ExportResultOutput from freeclimb.models.create_blob_request import CreateBlobRequest from freeclimb.models.modify_blob_request import ModifyBlobRequest from freeclimb.models.replace_blob_request import ReplaceBlobRequest @@ -686,8 +687,15 @@ def test_list_call_recordings(self) -> None: date_created = date_created_list_call_recordings_test_value + start_time = start_time_list_call_recordings_test_value + + end_time = end_time_list_call_recordings_test_value + api_response = self.api.list_call_recordings( - call_id=call_id, date_created=date_created + call_id=call_id, + date_created=date_created, + start_time=start_time, + end_time=end_time, ) assert isinstance(api_response, RecordingList) @@ -698,6 +706,8 @@ def test_list_calls(self) -> None: List Calls """ + used_audio_stream = used_audio_stream_list_calls_test_value + active = active_list_calls_test_value to = to_list_calls_test_value @@ -719,6 +729,7 @@ def test_list_calls(self) -> None: risk_score_max = risk_score_max_list_calls_test_value api_response = self.api.list_calls( + used_audio_stream=used_audio_stream, active=active, to=to, var_from=var_from, @@ -745,8 +756,16 @@ def test_list_conference_recordings(self) -> None: date_created = date_created_list_conference_recordings_test_value + start_time = start_time_list_conference_recordings_test_value + + end_time = end_time_list_conference_recordings_test_value + api_response = self.api.list_conference_recordings( - conference_id=conference_id, call_id=call_id, date_created=date_created + conference_id=conference_id, + call_id=call_id, + date_created=date_created, + start_time=start_time, + end_time=end_time, ) assert isinstance(api_response, RecordingList) @@ -890,8 +909,16 @@ def test_list_recordings(self) -> None: date_created = date_created_list_recordings_test_value + start_time = start_time_list_recordings_test_value + + end_time = end_time_list_recordings_test_value + api_response = self.api.list_recordings( - call_id=call_id, conference_id=conference_id, date_created=date_created + call_id=call_id, + conference_id=conference_id, + date_created=date_created, + start_time=start_time, + end_time=end_time, ) assert isinstance(api_response, RecordingList) @@ -1329,9 +1356,14 @@ def test_list_call_recordings_get_next_page(self): call_id = call_id_list_call_recordings_test_value date_created = date_created_list_call_recordings_test_value + start_time = start_time_list_call_recordings_test_value + end_time = end_time_list_call_recordings_test_value api_response = self.api.list_call_recordings( - call_id=call_id, date_created=date_created + call_id=call_id, + date_created=date_created, + start_time=start_time, + end_time=end_time, ) api_response.next_page_uri = ( "/Accounts/{accountId}/Calls/{callId}/Recordings?cursor=1" @@ -1346,6 +1378,7 @@ def test_list_calls_get_next_page(self): Get Next Page for List Calls # noqa: E501 """ + used_audio_stream = used_audio_stream_list_calls_test_value active = active_list_calls_test_value to = to_list_calls_test_value var_from = var_from_list_calls_test_value @@ -1358,6 +1391,7 @@ def test_list_calls_get_next_page(self): risk_score_max = risk_score_max_list_calls_test_value api_response = self.api.list_calls( + used_audio_stream=used_audio_stream, active=active, to=to, var_from=var_from, @@ -1383,9 +1417,15 @@ def test_list_conference_recordings_get_next_page(self): conference_id = conference_id_list_conference_recordings_test_value call_id = call_id_list_conference_recordings_test_value date_created = date_created_list_conference_recordings_test_value + start_time = start_time_list_conference_recordings_test_value + end_time = end_time_list_conference_recordings_test_value api_response = self.api.list_conference_recordings( - conference_id=conference_id, call_id=call_id, date_created=date_created + conference_id=conference_id, + call_id=call_id, + date_created=date_created, + start_time=start_time, + end_time=end_time, ) api_response.next_page_uri = ( "/Accounts/{accountId}/Conferences/{conferenceId}/Recordings?cursor=1" @@ -1526,9 +1566,15 @@ def test_list_recordings_get_next_page(self): call_id = call_id_list_recordings_test_value conference_id = conference_id_list_recordings_test_value date_created = date_created_list_recordings_test_value + start_time = start_time_list_recordings_test_value + end_time = end_time_list_recordings_test_value api_response = self.api.list_recordings( - call_id=call_id, conference_id=conference_id, date_created=date_created + call_id=call_id, + conference_id=conference_id, + date_created=date_created, + start_time=start_time, + end_time=end_time, ) api_response.next_page_uri = "/Accounts/{accountId}/Recordings?cursor=1" next_page_api_response = self.api.get_next_page(api_response) @@ -1915,5 +1961,19 @@ def test_list_sms_messages_get_next_page(self): replace_blob_request_replace_blob_test_value = ReplaceBlobRequest(blob={}) +start_time_list_call_recordings_test_value = "start_time_test_value" + +end_time_list_call_recordings_test_value = "end_time_test_value" + +used_audio_stream_list_calls_test_value = True + +start_time_list_conference_recordings_test_value = "start_time_test_value" + +end_time_list_conference_recordings_test_value = "end_time_test_value" + +start_time_list_recordings_test_value = "start_time_test_value" + +end_time_list_recordings_test_value = "end_time_test_value" + if __name__ == "__main__": unittest.main() diff --git a/test/models/test_call_result.py b/test/models/test_call_result.py index 4a1aeb0..ca09de1 100644 --- a/test/models/test_call_result.py +++ b/test/models/test_call_result.py @@ -133,6 +133,11 @@ def test_connect_duration(self): self.model.connect_duration = 1 assert self.model.connect_duration == 1 + def test_audio_stream_duration(self): + """Test CallResult.audio_stream_duration""" + self.model.audio_stream_duration = 1 + assert self.model.audio_stream_duration == 1 + def test_direction(self): """Test CallResult.direction""" self.model.direction = CallDirection.INBOUND From daefa3687355ca77919e9fadaeb0244372905f0d Mon Sep 17 00:00:00 2001 From: Ajevan M Date: Wed, 4 Mar 2026 12:40:29 -0500 Subject: [PATCH 2/4] Fix package version for Python SDK and add changelog entry --- CHANGELOG.md | 9 +++++++++ README.md | 2 +- freeclimb/__init__.py | 2 +- freeclimb/api_client.py | 2 +- freeclimb/configuration.py | 2 +- pyproject.toml | 2 +- setup.py | 2 +- 7 files changed, 15 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bccedd..5aef6fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,15 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm None + + +## [5.3.1] - 2026-03-04 + +### Added + +- New parameters for fetching recordings (start time and end time) +- Audio Streaming feature + ## [5.3.0] - 2025-10-27 diff --git a/README.md b/README.md index 96b898b..c7fc780 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ FreeClimb is a cloud-based application programming interface (API) that puts the This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0.0 -- Package version: 5.2.1 +- Package version: 5.3.1 - Generator version: 7.9.0 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://www.freeclimb.com/support/](https://www.freeclimb.com/support/) diff --git a/freeclimb/__init__.py b/freeclimb/__init__.py index abb385e..d633e63 100644 --- a/freeclimb/__init__.py +++ b/freeclimb/__init__.py @@ -15,7 +15,7 @@ """ # noqa: E501 -__version__ = "5.2.1" +__version__ = "5.3.1" # import apis into sdk package from freeclimb.api.default_api import DefaultApi as DefaultApi diff --git a/freeclimb/api_client.py b/freeclimb/api_client.py index 57f4b6e..c024d1b 100644 --- a/freeclimb/api_client.py +++ b/freeclimb/api_client.py @@ -88,7 +88,7 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = "OpenAPI-Generator/5.2.1/python" + self.user_agent = "OpenAPI-Generator/5.3.1/python" self.client_side_validation = configuration.client_side_validation def __enter__(self): diff --git a/freeclimb/configuration.py b/freeclimb/configuration.py index 75d9051..493857f 100644 --- a/freeclimb/configuration.py +++ b/freeclimb/configuration.py @@ -427,7 +427,7 @@ def to_debug_report(self): "OS: {env}\n" "Python Version: {pyversion}\n" "Version of the API: 1.0.0\n" - "SDK Package Version: 5.2.1".format(env=sys.platform, pyversion=sys.version) + "SDK Package Version: 5.3.1".format(env=sys.platform, pyversion=sys.version) ) def get_host_settings(self): diff --git a/pyproject.toml b/pyproject.toml index 9fad184..f359150 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "freeclimb" -version = "5.2.1" +version = "5.3.1" description = "FreeClimb API" authors = ["FreeClimb API Support "] license = "NoLicense" diff --git a/setup.py b/setup.py index 312bb77..d487924 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools NAME = "FreeClimb" -VERSION = "5.2.1" +VERSION = "5.3.1" PYTHON_REQUIRES = ">= 3.8" REQUIRES = [ "urllib3 >= 1.25.3, < 3.0.0", From c398477ffd334c8c267cc8cc39beccc9c0b6c236 Mon Sep 17 00:00:00 2001 From: Ajevan M Date: Fri, 6 Mar 2026 10:04:48 -0500 Subject: [PATCH 3/4] Add new changes from latest spec updates part 2 --- .openapi-generator/FILES | 3 + README.md | 1 + docs/AvailableNumber.md | 1 + docs/CallResult.md | 9 +- docs/CallResultAllOfSubresourceUris.md | 31 +++++ docs/DefaultApi.md | 6 +- docs/QueueResult.md | 1 + freeclimb/__init__.py | 3 + freeclimb/api/default_api.py | 29 +++++ freeclimb/models/__init__.py | 3 + freeclimb/models/available_number.py | 10 ++ freeclimb/models/call_result.py | 112 +++++++++++++++++- .../call_result_all_of_subresource_uris.py | 90 ++++++++++++++ freeclimb/models/queue_result.py | 15 +++ openapi.json | 79 +++++++++++- test/api/test_default_api.py | 7 ++ test/models/test_available_number.py | 6 + test/models/test_call_result.py | 41 ++++++- ...est_call_result_all_of_subresource_uris.py | 46 +++++++ test/models/test_queue_result.py | 5 + 20 files changed, 486 insertions(+), 12 deletions(-) create mode 100644 docs/CallResultAllOfSubresourceUris.md create mode 100644 freeclimb/models/call_result_all_of_subresource_uris.py create mode 100644 test/models/test_call_result_all_of_subresource_uris.py diff --git a/.openapi-generator/FILES b/.openapi-generator/FILES index 8c4baaf..8766494 100644 --- a/.openapi-generator/FILES +++ b/.openapi-generator/FILES @@ -22,6 +22,7 @@ docs/CallDirection.md docs/CallEndedReason.md docs/CallList.md docs/CallResult.md +docs/CallResultAllOfSubresourceUris.md docs/CallStatus.md docs/CallStatusWebhook.md docs/Capabilities.md @@ -187,6 +188,7 @@ freeclimb/models/call_direction.py freeclimb/models/call_ended_reason.py freeclimb/models/call_list.py freeclimb/models/call_result.py +freeclimb/models/call_result_all_of_subresource_uris.py freeclimb/models/call_status.py freeclimb/models/call_status_webhook.py freeclimb/models/capabilities.py @@ -350,6 +352,7 @@ test/test_call_direction.py test/test_call_ended_reason.py test/test_call_list.py test/test_call_result.py +test/test_call_result_all_of_subresource_uris.py test/test_call_status.py test/test_call_status_webhook.py test/test_capabilities.py diff --git a/README.md b/README.md index c7fc780..157c813 100644 --- a/README.md +++ b/README.md @@ -210,6 +210,7 @@ Class | Method | HTTP request | Description - [CallEndedReason](docs/CallEndedReason.md) - [CallList](docs/CallList.md) - [CallResult](docs/CallResult.md) + - [CallResultAllOfSubresourceUris](docs/CallResultAllOfSubresourceUris.md) - [CallStatus](docs/CallStatus.md) - [CallStatusWebhook](docs/CallStatusWebhook.md) - [Capabilities](docs/Capabilities.md) diff --git a/docs/AvailableNumber.md b/docs/AvailableNumber.md index cea521a..756cfdf 100644 --- a/docs/AvailableNumber.md +++ b/docs/AvailableNumber.md @@ -8,6 +8,7 @@ Name | Type | Description | Notes **capabilities** | [**Capabilities**](Capabilities.md) | | [optional] **campaign_id** | **str** | The campaign ID generated by the campaign registry | [optional] **phone_number** | **str** | The phone number, in E.164 format (+ country code and phone number: +18003608245). | [optional] +**alias** | **str** | A nicely-formatted version of the phone number. | [optional] **region** | **str** | The state or province of this phone number. | [optional] **country** | **str** | The country of this phone number. | [optional] diff --git a/docs/CallResult.md b/docs/CallResult.md index afe8a1d..2a2f5b6 100644 --- a/docs/CallResult.md +++ b/docs/CallResult.md @@ -9,6 +9,8 @@ Name | Type | Description | Notes **date_created** | **str** | The date that this resource was created (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). | [optional] **date_updated** | **str** | The date that this resource was last updated (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). | [optional] **revision** | **int** | Revision count for the resource. This count is set to 1 on creation and is incremented every time it is updated. | [optional] +**date_created_iso** | **datetime** | The date that this resource was created in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z). | [optional] +**date_updated_iso** | **datetime** | The date that this resource was last updated in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z). | [optional] **call_id** | **str** | String that uniquely identifies this Call resource. | [optional] **parent_call_id** | **str** | ID of the Call that created this leg (child Call). | [optional] **account_id** | **str** | ID of the account that owns this Call. | [optional] @@ -17,14 +19,19 @@ Name | Type | Description | Notes **phone_number_id** | **str** | If the Call was inbound, this is the ID of the IncomingPhoneNumber that received the Call (DNIS). If the Call was outbound, this is the ID of the phone number from which the Call was placed (ANI). | [optional] **status** | [**CallStatus**](CallStatus.md) | | [optional] **start_time** | **str** | Start time of the Call (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). Empty if the Call has not yet been dialed. | [optional] +**start_time_iso** | **datetime** | Start time of the Call in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z). Empty if the Call has not yet been dialed. | [optional] **connect_time** | **str** | Time the Call was answered (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). Empty if the Call has not yet been dialed. | [optional] +**connect_time_iso** | **datetime** | Time the Call was answered in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z). Empty if the Call has not yet been dialed. | [optional] **end_time** | **str** | End time of the Call (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). Empty if the Call did not complete successfully. | [optional] +**end_time_iso** | **datetime** | End time of the Call in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z). Empty if the Call did not complete successfully. | [optional] **duration** | **int** | Total length of the Call in seconds. Measures time between startTime and endTime. This value is empty for busy, failed, unanswered or ongoing Calls. | [optional] **connect_duration** | **int** | Length of time that the Call was connected in seconds. Measures time between connectTime and endTime. This value is empty for busy, failed, unanswered or ongoing Calls. | [optional] **audio_stream_duration** | **int** | Length of time that the Call used the audio stream in seconds. This value is empty or zero when the Call did not use the audio stream. | [optional] **direction** | [**CallDirection**](CallDirection.md) | | [optional] **answered_by** | [**AnsweredBy**](AnsweredBy.md) | | [optional] -**subresource_uris** | **object** | The list of subresources for this Call. These include things like logs and recordings associated with the Call. | [optional] +**caller_name** | **str** | The caller ID name (CNAM) for this Call. Empty if unavailable. | [optional] +**web_rtc** | **bool** | Indicates whether this Call was initiated via WebRTC. | [optional] +**subresource_uris** | [**CallResultAllOfSubresourceUris**](CallResultAllOfSubresourceUris.md) | | [optional] **application_id** | **str** | ApplicationId associated with the Call. | [optional] ## Example diff --git a/docs/CallResultAllOfSubresourceUris.md b/docs/CallResultAllOfSubresourceUris.md new file mode 100644 index 0000000..50e62d5 --- /dev/null +++ b/docs/CallResultAllOfSubresourceUris.md @@ -0,0 +1,31 @@ +# CallResultAllOfSubresourceUris + +The list of subresources for this Call. These include things like logs and recordings associated with the Call. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**logs** | **str** | The URI for the logs associated with this Call. | [optional] +**recordings** | **str** | The URI for the recordings associated with this Call. | [optional] + +## Example + +```python +from freeclimb.models.call_result_all_of_subresource_uris import CallResultAllOfSubresourceUris + +# TODO update the JSON string below +json = "{}" +# create an instance of CallResultAllOfSubresourceUris from a JSON string +call_result_all_of_subresource_uris_instance = CallResultAllOfSubresourceUris.from_json(json) +# print the JSON string representation of the object +print(CallResultAllOfSubresourceUris.to_json()) + +# convert the object into a dict +call_result_all_of_subresource_uris_dict = call_result_all_of_subresource_uris_instance.to_dict() +# create an instance of CallResultAllOfSubresourceUris from a dict +call_result_all_of_subresource_uris_from_dict = CallResultAllOfSubresourceUris.from_dict(call_result_all_of_subresource_uris_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/docs/DefaultApi.md b/docs/DefaultApi.md index 6f5c040..603ca69 100644 --- a/docs/DefaultApi.md +++ b/docs/DefaultApi.md @@ -3668,7 +3668,7 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **list_calls** -> CallList list_calls(account_id, used_audio_stream=used_audio_stream, active=active, to=to, var_from=var_from, status=status, start_time=start_time, end_time=end_time, parent_call_id=parent_call_id, application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max) +> CallList list_calls(account_id, used_audio_stream=used_audio_stream, active=active, to=to, var_from=var_from, status=status, start_time=start_time, end_time=end_time, parent_call_id=parent_call_id, application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max, web_rtc=web_rtc) List Calls @@ -3716,10 +3716,11 @@ with freeclimb.ApiClient(configuration) as api_client: application_id = ['application_id_example'] # List[str] | Only show calls belonging to the given applicationId. This parameter can be repeated to return calls from multiple Applications. (optional) risk_score_min = 56 # int | The minimum riskScore that should be included in the list. (optional) risk_score_max = 56 # int | The maximum riskScore that should be included in the list. (optional) + web_rtc = False # bool | Only show Calls that were originated via WebRTC. (optional) (default to False) try: # List Calls - api_response = api_instance.list_calls(account_id, used_audio_stream=used_audio_stream, active=active, to=to, var_from=var_from, status=status, start_time=start_time, end_time=end_time, parent_call_id=parent_call_id, application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max) + api_response = api_instance.list_calls(account_id, used_audio_stream=used_audio_stream, active=active, to=to, var_from=var_from, status=status, start_time=start_time, end_time=end_time, parent_call_id=parent_call_id, application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max, web_rtc=web_rtc) print("The response of DefaultApi->list_calls:\n") pprint(api_response) except Exception as e: @@ -3745,6 +3746,7 @@ Name | Type | Description | Notes **application_id** | [**List[str]**](str.md)| Only show calls belonging to the given applicationId. This parameter can be repeated to return calls from multiple Applications. | [optional] **risk_score_min** | **int**| The minimum riskScore that should be included in the list. | [optional] **risk_score_max** | **int**| The maximum riskScore that should be included in the list. | [optional] + **web_rtc** | **bool**| Only show Calls that were originated via WebRTC. | [optional] [default to False] ### Return type diff --git a/docs/QueueResult.md b/docs/QueueResult.md index 87359b3..7eaa838 100644 --- a/docs/QueueResult.md +++ b/docs/QueueResult.md @@ -15,6 +15,7 @@ Name | Type | Description | Notes **max_size** | **int** | The maximum number of Calls permitted in the Queue. Default is 100. Maximum is 1000. | [optional] **current_size** | **int** | Count of Calls currently in the Queue. | [optional] **average_queue_removal_time** | **int** | The average amount of time (in seconds) for a call to be removed from the queue. | [optional] +**average_wait_time** | **int** | The average wait time (in seconds) of all Calls in the Queue. | [optional] **subresource_uris** | **object** | List of subresources for this Queue (which includes Queue members). | [optional] ## Example diff --git a/freeclimb/__init__.py b/freeclimb/__init__.py index d633e63..1199724 100644 --- a/freeclimb/__init__.py +++ b/freeclimb/__init__.py @@ -66,6 +66,9 @@ from freeclimb.models.call_ended_reason import CallEndedReason as CallEndedReason from freeclimb.models.call_list import CallList as CallList from freeclimb.models.call_result import CallResult as CallResult +from freeclimb.models.call_result_all_of_subresource_uris import ( + CallResultAllOfSubresourceUris as CallResultAllOfSubresourceUris, +) from freeclimb.models.call_status import CallStatus as CallStatus from freeclimb.models.call_status_webhook import CallStatusWebhook as CallStatusWebhook from freeclimb.models.capabilities import Capabilities as Capabilities diff --git a/freeclimb/api/default_api.py b/freeclimb/api/default_api.py index da28473..239cc38 100644 --- a/freeclimb/api/default_api.py +++ b/freeclimb/api/default_api.py @@ -12519,6 +12519,10 @@ def list_calls( description="The maximum riskScore that should be included in the list." ), ] = None, + web_rtc: Annotated[ + Optional[StrictBool], + Field(description="Only show Calls that were originated via WebRTC."), + ] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -12567,6 +12571,9 @@ def list_calls( :param risk_score_max: The maximum riskScore that should be included in the list. :type risk_score_max: int + :param web_rtc: Only show Calls that were originated via WebRTC. + :type web_rtc: bool + :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -12603,6 +12610,7 @@ def list_calls( application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max, + web_rtc=web_rtc, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -12688,6 +12696,10 @@ def list_calls_with_http_info( description="The maximum riskScore that should be included in the list." ), ] = None, + web_rtc: Annotated[ + Optional[StrictBool], + Field(description="Only show Calls that were originated via WebRTC."), + ] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -12736,6 +12748,9 @@ def list_calls_with_http_info( :param risk_score_max: The maximum riskScore that should be included in the list. :type risk_score_max: int + :param web_rtc: Only show Calls that were originated via WebRTC. + :type web_rtc: bool + :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -12772,6 +12787,7 @@ def list_calls_with_http_info( application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max, + web_rtc=web_rtc, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -12857,6 +12873,10 @@ def list_calls_without_preload_content( description="The maximum riskScore that should be included in the list." ), ] = None, + web_rtc: Annotated[ + Optional[StrictBool], + Field(description="Only show Calls that were originated via WebRTC."), + ] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -12905,6 +12925,9 @@ def list_calls_without_preload_content( :param risk_score_max: The maximum riskScore that should be included in the list. :type risk_score_max: int + :param web_rtc: Only show Calls that were originated via WebRTC. + :type web_rtc: bool + :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -12941,6 +12964,7 @@ def list_calls_without_preload_content( application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max, + web_rtc=web_rtc, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -12969,6 +12993,7 @@ def _list_calls_serialize( application_id, risk_score_min, risk_score_max, + web_rtc, _request_auth, _content_type, _headers, @@ -13038,6 +13063,10 @@ def _list_calls_serialize( _query_params.append(("riskScoreMax", risk_score_max)) + if web_rtc is not None: + + _query_params.append(("webRTC", web_rtc)) + # process the header parameters # process the form parameters # process the body parameter diff --git a/freeclimb/models/__init__.py b/freeclimb/models/__init__.py index cd23dda..a4d36e1 100644 --- a/freeclimb/models/__init__.py +++ b/freeclimb/models/__init__.py @@ -49,6 +49,9 @@ from freeclimb.models.call_ended_reason import CallEndedReason as CallEndedReason from freeclimb.models.call_list import CallList as CallList from freeclimb.models.call_result import CallResult as CallResult +from freeclimb.models.call_result_all_of_subresource_uris import ( + CallResultAllOfSubresourceUris as CallResultAllOfSubresourceUris, +) from freeclimb.models.call_status import CallStatus as CallStatus from freeclimb.models.call_status_webhook import CallStatusWebhook as CallStatusWebhook from freeclimb.models.capabilities import Capabilities as Capabilities diff --git a/freeclimb/models/available_number.py b/freeclimb/models/available_number.py index 9875f1b..b20488d 100644 --- a/freeclimb/models/available_number.py +++ b/freeclimb/models/available_number.py @@ -44,6 +44,9 @@ class AvailableNumber( description="The phone number, in E.164 format (+ country code and phone number: +18003608245).", alias="phoneNumber", ) + alias: Optional[StrictStr] = Field( + default=None, description="A nicely-formatted version of the phone number." + ) region: Optional[StrictStr] = Field( default=None, description="The state or province of this phone number." ) @@ -55,6 +58,7 @@ class AvailableNumber( "capabilities", "campaignId", "phoneNumber", + "alias", "region", "country", ] @@ -103,6 +107,11 @@ def to_dict(self) -> Dict[str, Any]: if self.phone_number is None and "phone_number" in self.model_fields_set: _dict["phoneNumber"] = None + # set to None if alias (nullable) is None + # and model_fields_set contains the field + if self.alias is None and "alias" in self.model_fields_set: + _dict["alias"] = None + # set to None if region (nullable) is None # and model_fields_set contains the field if self.region is None and "region" in self.model_fields_set: @@ -133,6 +142,7 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: ), "campaignId": obj.get("campaignId"), "phoneNumber": obj.get("phoneNumber"), + "alias": obj.get("alias"), "region": obj.get("region"), "country": obj.get("country"), } diff --git a/freeclimb/models/call_result.py b/freeclimb/models/call_result.py index 27e6aaf..5eb4037 100644 --- a/freeclimb/models/call_result.py +++ b/freeclimb/models/call_result.py @@ -18,10 +18,14 @@ import re # noqa: F401 import json -from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictInt, StrictStr from typing import Any, ClassVar, Dict, List, Optional from freeclimb.models.answered_by import AnsweredBy from freeclimb.models.call_direction import CallDirection +from freeclimb.models.call_result_all_of_subresource_uris import ( + CallResultAllOfSubresourceUris, +) from freeclimb.models.call_status import CallStatus from pydantic import StrictStr from typing import Optional, Set @@ -52,6 +56,16 @@ class CallResult( default=None, description="Revision count for the resource. This count is set to 1 on creation and is incremented every time it is updated.", ) + date_created_iso: Optional[datetime] = Field( + default=None, + description="The date that this resource was created in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z).", + alias="dateCreatedISO", + ) + date_updated_iso: Optional[datetime] = Field( + default=None, + description="The date that this resource was last updated in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z).", + alias="dateUpdatedISO", + ) call_id: Optional[StrictStr] = Field( default=None, description="String that uniquely identifies this Call resource.", @@ -84,16 +98,31 @@ class CallResult( description="Start time of the Call (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). Empty if the Call has not yet been dialed.", alias="startTime", ) + start_time_iso: Optional[datetime] = Field( + default=None, + description="Start time of the Call in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z). Empty if the Call has not yet been dialed.", + alias="startTimeISO", + ) connect_time: Optional[StrictStr] = Field( default=None, description="Time the Call was answered (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). Empty if the Call has not yet been dialed.", alias="connectTime", ) + connect_time_iso: Optional[datetime] = Field( + default=None, + description="Time the Call was answered in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z). Empty if the Call has not yet been dialed.", + alias="connectTimeISO", + ) end_time: Optional[StrictStr] = Field( default=None, description="End time of the Call (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). Empty if the Call did not complete successfully.", alias="endTime", ) + end_time_iso: Optional[datetime] = Field( + default=None, + description="End time of the Call in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z). Empty if the Call did not complete successfully.", + alias="endTimeISO", + ) duration: Optional[StrictInt] = Field( default=None, description="Total length of the Call in seconds. Measures time between startTime and endTime. This value is empty for busy, failed, unanswered or ongoing Calls.", @@ -110,10 +139,18 @@ class CallResult( ) direction: Optional[CallDirection] = None answered_by: Optional[AnsweredBy] = Field(default=None, alias="answeredBy") - subresource_uris: Optional[Dict[str, Any]] = Field( + caller_name: Optional[StrictStr] = Field( + default=None, + description="The caller ID name (CNAM) for this Call. Empty if unavailable.", + alias="callerName", + ) + web_rtc: Optional[StrictBool] = Field( default=None, - description="The list of subresources for this Call. These include things like logs and recordings associated with the Call.", - alias="subresourceUris", + description="Indicates whether this Call was initiated via WebRTC.", + alias="webRTC", + ) + subresource_uris: Optional[CallResultAllOfSubresourceUris] = Field( + default=None, alias="subresourceUris" ) application_id: Optional[StrictStr] = Field( default=None, @@ -126,6 +163,8 @@ class CallResult( "dateCreated", "dateUpdated", "revision", + "dateCreatedISO", + "dateUpdatedISO", "callId", "parentCallId", "accountId", @@ -134,13 +173,18 @@ class CallResult( "phoneNumberId", "status", "startTime", + "startTimeISO", "connectTime", + "connectTimeISO", "endTime", + "endTimeISO", "duration", "connectDuration", "audioStreamDuration", "direction", "answeredBy", + "callerName", + "webRTC", "subresourceUris", "applicationId", ] @@ -176,6 +220,25 @@ def to_dict(self) -> Dict[str, Any]: exclude=excluded_fields, exclude_none=True, ) + # override the default output from pydantic by calling `to_dict()` of subresource_uris + if self.subresource_uris: + _dict["subresourceUris"] = self.subresource_uris.to_dict() + # set to None if date_created_iso (nullable) is None + # and model_fields_set contains the field + if ( + self.date_created_iso is None + and "date_created_iso" in self.model_fields_set + ): + _dict["dateCreatedISO"] = None + + # set to None if date_updated_iso (nullable) is None + # and model_fields_set contains the field + if ( + self.date_updated_iso is None + and "date_updated_iso" in self.model_fields_set + ): + _dict["dateUpdatedISO"] = None + # set to None if call_id (nullable) is None # and model_fields_set contains the field if self.call_id is None and "call_id" in self.model_fields_set: @@ -216,16 +279,34 @@ def to_dict(self) -> Dict[str, Any]: if self.start_time is None and "start_time" in self.model_fields_set: _dict["startTime"] = None + # set to None if start_time_iso (nullable) is None + # and model_fields_set contains the field + if self.start_time_iso is None and "start_time_iso" in self.model_fields_set: + _dict["startTimeISO"] = None + # set to None if connect_time (nullable) is None # and model_fields_set contains the field if self.connect_time is None and "connect_time" in self.model_fields_set: _dict["connectTime"] = None + # set to None if connect_time_iso (nullable) is None + # and model_fields_set contains the field + if ( + self.connect_time_iso is None + and "connect_time_iso" in self.model_fields_set + ): + _dict["connectTimeISO"] = None + # set to None if end_time (nullable) is None # and model_fields_set contains the field if self.end_time is None and "end_time" in self.model_fields_set: _dict["endTime"] = None + # set to None if end_time_iso (nullable) is None + # and model_fields_set contains the field + if self.end_time_iso is None and "end_time_iso" in self.model_fields_set: + _dict["endTimeISO"] = None + # set to None if duration (nullable) is None # and model_fields_set contains the field if self.duration is None and "duration" in self.model_fields_set: @@ -257,6 +338,16 @@ def to_dict(self) -> Dict[str, Any]: if self.answered_by is None and "answered_by" in self.model_fields_set: _dict["answeredBy"] = None + # set to None if caller_name (nullable) is None + # and model_fields_set contains the field + if self.caller_name is None and "caller_name" in self.model_fields_set: + _dict["callerName"] = None + + # set to None if web_rtc (nullable) is None + # and model_fields_set contains the field + if self.web_rtc is None and "web_rtc" in self.model_fields_set: + _dict["webRTC"] = None + # set to None if subresource_uris (nullable) is None # and model_fields_set contains the field if ( @@ -287,6 +378,8 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "dateCreated": obj.get("dateCreated"), "dateUpdated": obj.get("dateUpdated"), "revision": obj.get("revision"), + "dateCreatedISO": obj.get("dateCreatedISO"), + "dateUpdatedISO": obj.get("dateUpdatedISO"), "callId": obj.get("callId"), "parentCallId": obj.get("parentCallId"), "accountId": obj.get("accountId"), @@ -295,14 +388,23 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "phoneNumberId": obj.get("phoneNumberId"), "status": obj.get("status"), "startTime": obj.get("startTime"), + "startTimeISO": obj.get("startTimeISO"), "connectTime": obj.get("connectTime"), + "connectTimeISO": obj.get("connectTimeISO"), "endTime": obj.get("endTime"), + "endTimeISO": obj.get("endTimeISO"), "duration": obj.get("duration"), "connectDuration": obj.get("connectDuration"), "audioStreamDuration": obj.get("audioStreamDuration"), "direction": obj.get("direction"), "answeredBy": obj.get("answeredBy"), - "subresourceUris": obj.get("subresourceUris"), + "callerName": obj.get("callerName"), + "webRTC": obj.get("webRTC"), + "subresourceUris": ( + CallResultAllOfSubresourceUris.from_dict(obj["subresourceUris"]) + if obj.get("subresourceUris") is not None + else None + ), "applicationId": obj.get("applicationId"), } ) diff --git a/freeclimb/models/call_result_all_of_subresource_uris.py b/freeclimb/models/call_result_all_of_subresource_uris.py new file mode 100644 index 0000000..719df25 --- /dev/null +++ b/freeclimb/models/call_result_all_of_subresource_uris.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + FreeClimb API + + FreeClimb is a cloud-based application programming interface (API) that puts the power of the Vail platform in your hands. FreeClimb simplifies the process of creating applications that can use a full range of telephony features without requiring specialized or on-site telephony equipment. Using the FreeClimb REST API to write applications is easy! You have the option to use the language of your choice or hit the API directly. Your application can execute a command by issuing a RESTful request to the FreeClimb API. The base URL to send HTTP requests to the FreeClimb REST API is: /apiserver. FreeClimb authenticates and processes your request. + + The version of the OpenAPI document: 1.0.0 + Contact: support@freeclimb.com + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from pydantic import StrictStr +from typing import Optional, Set +from typing_extensions import Self + + +class CallResultAllOfSubresourceUris( + BaseModel, populate_by_name=True, validate_assignment=True, protected_namespaces=() +): + """ + The list of subresources for this Call. These include things like logs and recordings associated with the Call. + """ # noqa: E501 + + logs: Optional[StrictStr] = Field( + default=None, description="The URI for the logs associated with this Call." + ) + recordings: Optional[StrictStr] = Field( + default=None, + description="The URI for the recordings associated with this Call.", + ) + + __properties: ClassVar[List[str]] = ["logs", "recordings"] + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of CallResultAllOfSubresourceUris from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of CallResultAllOfSubresourceUris from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + {"logs": obj.get("logs"), "recordings": obj.get("recordings")} + ) + return _obj diff --git a/freeclimb/models/queue_result.py b/freeclimb/models/queue_result.py index dfbe367..61413b0 100644 --- a/freeclimb/models/queue_result.py +++ b/freeclimb/models/queue_result.py @@ -77,6 +77,11 @@ class QueueResult( description="The average amount of time (in seconds) for a call to be removed from the queue.", alias="averageQueueRemovalTime", ) + average_wait_time: Optional[StrictInt] = Field( + default=None, + description="The average wait time (in seconds) of all Calls in the Queue.", + alias="averageWaitTime", + ) subresource_uris: Optional[Dict[str, Any]] = Field( default=None, description="List of subresources for this Queue (which includes Queue members).", @@ -94,6 +99,7 @@ class QueueResult( "maxSize", "currentSize", "averageQueueRemovalTime", + "averageWaitTime", "subresourceUris", ] @@ -161,6 +167,14 @@ def to_dict(self) -> Dict[str, Any]: ): _dict["averageQueueRemovalTime"] = None + # set to None if average_wait_time (nullable) is None + # and model_fields_set contains the field + if ( + self.average_wait_time is None + and "average_wait_time" in self.model_fields_set + ): + _dict["averageWaitTime"] = None + # set to None if subresource_uris (nullable) is None # and model_fields_set contains the field if ( @@ -192,6 +206,7 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "maxSize": obj.get("maxSize"), "currentSize": obj.get("currentSize"), "averageQueueRemovalTime": obj.get("averageQueueRemovalTime"), + "averageWaitTime": obj.get("averageWaitTime"), "subresourceUris": obj.get("subresourceUris"), } ) diff --git a/openapi.json b/openapi.json index fd9ec40..c759411 100644 --- a/openapi.json +++ b/openapi.json @@ -2935,6 +2935,11 @@ "description": "The phone number, in E.164 format (+ country code and phone number: +18003608245).", "nullable": true }, + "alias": { + "type": "string", + "description": "A nicely-formatted version of the phone number.", + "nullable": true + }, "voiceEnabled": { "type": "boolean", "description": "Typically set to true for all numbers.", @@ -3109,6 +3114,21 @@ } } }, + "CallResultAllOfSubresourceUris": { + "type": "object", + "description": "The list of subresources for this Call. These include things like logs and recordings associated with the Call.", + "nullable": true, + "properties": { + "logs": { + "type": "string", + "description": "The URI for the logs associated with this Call." + }, + "recordings": { + "type": "string", + "description": "The URI for the recordings associated with this Call." + } + } + }, "CallResult": { "allOf": [ { @@ -3117,6 +3137,18 @@ { "type": "object", "properties": { + "dateCreatedISO": { + "type": "string", + "format": "date-time", + "description": "The date that this resource was created in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z).", + "nullable": true + }, + "dateUpdatedISO": { + "type": "string", + "format": "date-time", + "description": "The date that this resource was last updated in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z).", + "nullable": true + }, "callId": { "type": "string", "description": "String that uniquely identifies this Call resource.", @@ -3155,16 +3187,34 @@ "description": "Start time of the Call (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). Empty if the Call has not yet been dialed.", "nullable": true }, + "startTimeISO": { + "type": "string", + "format": "date-time", + "description": "Start time of the Call in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z). Empty if the Call has not yet been dialed.", + "nullable": true + }, "connectTime": { "type": "string", "description": "Time the Call was answered (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). Empty if the Call has not yet been dialed.", "nullable": true }, + "connectTimeISO": { + "type": "string", + "format": "date-time", + "description": "Time the Call was answered in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z). Empty if the Call has not yet been dialed.", + "nullable": true + }, "endTime": { "type": "string", "description": "End time of the Call (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). Empty if the Call did not complete successfully.", "nullable": true }, + "endTimeISO": { + "type": "string", + "format": "date-time", + "description": "End time of the Call in ISO 8601 format (e.g., 2022-01-01T00:00:00.000Z). Empty if the Call did not complete successfully.", + "nullable": true + }, "duration": { "type": "integer", "description": "Total length of the Call in seconds. Measures time between startTime and endTime. This value is empty for busy, failed, unanswered or ongoing Calls.", @@ -3186,11 +3236,19 @@ "answeredBy": { "$ref": "#/components/schemas/AnsweredBy" }, - "subresourceUris": { - "type": "object", - "description": "The list of subresources for this Call. These include things like logs and recordings associated with the Call.", + "callerName": { + "type": "string", + "description": "The caller ID name (CNAM) for this Call. Empty if unavailable.", + "nullable": true + }, + "webRTC": { + "type": "boolean", + "description": "Indicates whether this Call was initiated via WebRTC.", "nullable": true }, + "subresourceUris": { + "$ref": "#/components/schemas/CallResultAllOfSubresourceUris" + }, "applicationId": { "type": "string", "description": "ApplicationId associated with the Call.", @@ -3858,6 +3916,11 @@ "description": "The average amount of time (in seconds) for a call to be removed from the queue.", "nullable": true }, + "averageWaitTime": { + "type": "integer", + "description": "The average wait time (in seconds) of all Calls in the Queue.", + "nullable": true + }, "subresourceUris": { "type": "object", "description": "List of subresources for this Queue (which includes Queue members).", @@ -6117,6 +6180,16 @@ "schema": { "type": "integer" } + }, + { + "name": "webRTC", + "in": "query", + "description": "Only show Calls that were originated via WebRTC.", + "required": false, + "schema": { + "type": "boolean", + "default": false + } } ], "deprecated": false, diff --git a/test/api/test_default_api.py b/test/api/test_default_api.py index e59d855..d17526c 100644 --- a/test/api/test_default_api.py +++ b/test/api/test_default_api.py @@ -728,6 +728,8 @@ def test_list_calls(self) -> None: risk_score_max = risk_score_max_list_calls_test_value + web_rtc = web_rtc_list_calls_test_value + api_response = self.api.list_calls( used_audio_stream=used_audio_stream, active=active, @@ -740,6 +742,7 @@ def test_list_calls(self) -> None: application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max, + web_rtc=web_rtc, ) assert isinstance(api_response, CallList) @@ -1389,6 +1392,7 @@ def test_list_calls_get_next_page(self): application_id = application_id_list_calls_test_value risk_score_min = risk_score_min_list_calls_test_value risk_score_max = risk_score_max_list_calls_test_value + web_rtc = web_rtc_list_calls_test_value api_response = self.api.list_calls( used_audio_stream=used_audio_stream, @@ -1402,6 +1406,7 @@ def test_list_calls_get_next_page(self): application_id=application_id, risk_score_min=risk_score_min, risk_score_max=risk_score_max, + web_rtc=web_rtc, ) api_response.next_page_uri = "/Accounts/{accountId}/Calls?cursor=1" next_page_api_response = self.api.get_next_page(api_response) @@ -1975,5 +1980,7 @@ def test_list_sms_messages_get_next_page(self): end_time_list_recordings_test_value = "end_time_test_value" +web_rtc_list_calls_test_value = True + if __name__ == "__main__": unittest.main() diff --git a/test/models/test_available_number.py b/test/models/test_available_number.py index 4eba6f2..e2b400c 100644 --- a/test/models/test_available_number.py +++ b/test/models/test_available_number.py @@ -51,6 +51,12 @@ def test_phone_number(self): self.model.phone_number = "TEST_STRING" assert self.model.phone_number == "TEST_STRING" + def test_alias(self): + """Test AvailableNumber.alias""" + + self.model.alias = "TEST_STRING" + assert self.model.alias == "TEST_STRING" + def test_region(self): """Test AvailableNumber.region""" diff --git a/test/models/test_call_result.py b/test/models/test_call_result.py index ca09de1..8bd332d 100644 --- a/test/models/test_call_result.py +++ b/test/models/test_call_result.py @@ -50,6 +50,16 @@ def test_revision(self): self.model.revision = 1 assert self.model.revision == 1 + def test_date_created_iso(self): + """Test CallResult.date_created_iso""" + self.model.date_created_iso = datetime.fromtimestamp(1691592436) + assert self.model.date_created_iso == datetime.fromtimestamp(1691592436) + + def test_date_updated_iso(self): + """Test CallResult.date_updated_iso""" + self.model.date_updated_iso = datetime.fromtimestamp(1691592436) + assert self.model.date_updated_iso == datetime.fromtimestamp(1691592436) + def test_call_id(self): """Test CallResult.call_id""" @@ -111,18 +121,33 @@ def test_start_time(self): self.model.start_time = "TEST_STRING" assert self.model.start_time == "TEST_STRING" + def test_start_time_iso(self): + """Test CallResult.start_time_iso""" + self.model.start_time_iso = datetime.fromtimestamp(1691592436) + assert self.model.start_time_iso == datetime.fromtimestamp(1691592436) + def test_connect_time(self): """Test CallResult.connect_time""" self.model.connect_time = "TEST_STRING" assert self.model.connect_time == "TEST_STRING" + def test_connect_time_iso(self): + """Test CallResult.connect_time_iso""" + self.model.connect_time_iso = datetime.fromtimestamp(1691592436) + assert self.model.connect_time_iso == datetime.fromtimestamp(1691592436) + def test_end_time(self): """Test CallResult.end_time""" self.model.end_time = "TEST_STRING" assert self.model.end_time == "TEST_STRING" + def test_end_time_iso(self): + """Test CallResult.end_time_iso""" + self.model.end_time_iso = datetime.fromtimestamp(1691592436) + assert self.model.end_time_iso == datetime.fromtimestamp(1691592436) + def test_duration(self): """Test CallResult.duration""" self.model.duration = 1 @@ -154,9 +179,23 @@ def test_answered_by(self): self.model.answered_by = AnsweredBy.MACHINE assert self.model.answered_by == AnsweredBy.MACHINE + def test_caller_name(self): + """Test CallResult.caller_name""" + + self.model.caller_name = "TEST_STRING" + assert self.model.caller_name == "TEST_STRING" + + def test_web_rtc(self): + """Test CallResult.web_rtc""" + self.model.web_rtc = False + assert self.model.web_rtc == False + def test_subresource_uris(self): """Test CallResult.subresource_uris""" - object = {} + object = freeclimb.models.call_result_all_of_subresource_uris.CallResultAllOfSubresourceUris( + logs="", + recordings="", + ) self.model.subresource_uris = object assert self.model.subresource_uris == object diff --git a/test/models/test_call_result_all_of_subresource_uris.py b/test/models/test_call_result_all_of_subresource_uris.py new file mode 100644 index 0000000..bea0887 --- /dev/null +++ b/test/models/test_call_result_all_of_subresource_uris.py @@ -0,0 +1,46 @@ +# coding: utf-8 + +""" + FreeClimb API + + FreeClimb is a cloud-based application programming interface (API) that puts the power of the Vail platform in your hands. FreeClimb simplifies the process of creating applications that can use a full range of telephony features without requiring specialized or on-site telephony equipment. Using the FreeClimb REST API to write applications is easy! You have the option to use the language of your choice or hit the API directly. Your application can execute a command by issuing a RESTful request to the FreeClimb API. The base URL to send HTTP requests to the FreeClimb REST API is: /apiserver. FreeClimb authenticates and processes your request. + + The version of the OpenAPI document: 1.0.0 + Contact: support@freeclimb.com + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest +import pydantic_core +from datetime import datetime +import freeclimb +from freeclimb import * +from freeclimb.models.call_result_all_of_subresource_uris import ( + CallResultAllOfSubresourceUris, +) + + +class TestCallResultAllOfSubresourceUris(unittest.TestCase): + """CallResultAllOfSubresourceUris unit test stubs""" + + def setUp(self): + self.model = CallResultAllOfSubresourceUris() + + def test_logs(self): + """Test CallResultAllOfSubresourceUris.logs""" + + self.model.logs = "TEST_STRING" + assert self.model.logs == "TEST_STRING" + + def test_recordings(self): + """Test CallResultAllOfSubresourceUris.recordings""" + + self.model.recordings = "TEST_STRING" + assert self.model.recordings == "TEST_STRING" + + +if __name__ == "__main__": + unittest.main() diff --git a/test/models/test_queue_result.py b/test/models/test_queue_result.py index a66efb6..2ec8c65 100644 --- a/test/models/test_queue_result.py +++ b/test/models/test_queue_result.py @@ -83,6 +83,11 @@ def test_average_queue_removal_time(self): self.model.average_queue_removal_time = 1 assert self.model.average_queue_removal_time == 1 + def test_average_wait_time(self): + """Test QueueResult.average_wait_time""" + self.model.average_wait_time = 1 + assert self.model.average_wait_time == 1 + def test_subresource_uris(self): """Test QueueResult.subresource_uris""" object = {} From c545dee82ef9851b395bdd849b4ac81025c27630 Mon Sep 17 00:00:00 2001 From: Ajevan M Date: Mon, 9 Mar 2026 09:48:16 -0400 Subject: [PATCH 4/4] Resolve dependabot high critical vulnerabilities --- package.json | 2 +- yarn.lock | 23 +++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index ad7a5a6..8677816 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "dependencies": { "@stoplight/json": "3.21.7", "@stoplight/prism-cli": "5.14.2", - "fast-xml-parser": "^4.5.0", + "fast-xml-parser": "^5.3.8", "jsonpath-plus": "^10.3.0" }, "resolutions": { diff --git a/yarn.lock b/yarn.lock index 577e70c..e844a6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -528,6 +528,11 @@ fast-uri@^3.0.1: resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== +fast-xml-builder@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz#a485d7e8381f1db983cf006f849d1066e2935241" + integrity sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ== + fast-xml-parser@^4.2.0: version "4.5.3" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz#c54d6b35aa0f23dc1ea60b6c884340c006dc6efb" @@ -535,12 +540,13 @@ fast-xml-parser@^4.2.0: dependencies: strnum "^1.1.1" -fast-xml-parser@^4.5.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz#a7e665ff79b7919100a5202f23984b6150f9b31e" - integrity sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w== +fast-xml-parser@^5.3.8: + version "5.4.2" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.4.2.tgz#7fc66463b59260b0c5fd57edf46148a418bde68b" + integrity sha512-pw/6pIl4k0CSpElPEJhDppLzaixDEuWui2CUQQBH/ECDf7+y6YwA4Gf7Tyb0Rfe4DIMuZipYj4AEL0nACKglvQ== dependencies: - strnum "^1.0.5" + fast-xml-builder "^1.0.0" + strnum "^2.1.2" fastestsmallesttextencoderdecoder@^1.0.22: version "1.0.22" @@ -1122,11 +1128,16 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strnum@^1.0.5, strnum@^1.1.1: +strnum@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.1.2.tgz#57bca4fbaa6f271081715dbc9ed7cee5493e28e4" integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA== +strnum@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.2.0.tgz#8b582b637e4621f62ff714493e0ce30846f903a6" + integrity sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"