diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index 35d54dcf..6dae38d8 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -1379,6 +1379,29 @@ class CallRejectedEvent(DataClassJsonMixin): ) +@dataclass +class CallReportResponse(DataClassJsonMixin): + score: float = dc_field(metadata=dc_config(field_name="score")) + ended_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="ended_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + started_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="started_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + + @dataclass class CallRequest(DataClassJsonMixin): created_by_id: Optional[str] = dc_field( @@ -5342,6 +5365,13 @@ class GetCallResponse(DataClassJsonMixin): call: "CallResponse" = dc_field(metadata=dc_config(field_name="call")) +@dataclass +class GetCallReportResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + session_id: str = dc_field(metadata=dc_config(field_name="session_id")) + report: "ReportResponse" = dc_field(metadata=dc_config(field_name="report")) + + @dataclass class GetCallStatsResponse(DataClassJsonMixin): call_duration_seconds: int = dc_field( @@ -7872,6 +7902,12 @@ class PaginationParams(DataClassJsonMixin): ) +@dataclass +class ParticipantReportResponse(DataClassJsonMixin): + sum: int = dc_field(metadata=dc_config(field_name="sum")) + unique: int = dc_field(metadata=dc_config(field_name="unique")) + + @dataclass class PendingMessageResponse(DataClassJsonMixin): channel: "Optional[ChannelResponse]" = dc_field( @@ -9583,6 +9619,17 @@ class ReportByHistogramBucket(DataClassJsonMixin): ) +@dataclass +class ReportResponse(DataClassJsonMixin): + call: "CallReportResponse" = dc_field(metadata=dc_config(field_name="call")) + participants: "ParticipantReportResponse" = dc_field( + metadata=dc_config(field_name="participants") + ) + user_ratings: "UserRatingReportResponse" = dc_field( + metadata=dc_config(field_name="user_ratings") + ) + + @dataclass class Response(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -12364,6 +12411,12 @@ class UserReactivatedEvent(DataClassJsonMixin): ) +@dataclass +class UserRatingReportResponse(DataClassJsonMixin): + average: float = dc_field(metadata=dc_config(field_name="average")) + count: int = dc_field(metadata=dc_config(field_name="count")) + + @dataclass class UserRequest(DataClassJsonMixin): id: str = dc_field(metadata=dc_config(field_name="id")) diff --git a/getstream/video/rest_client.py b/getstream/video/rest_client.py index 3cc590f3..2dca8fcb 100644 --- a/getstream/video/rest_client.py +++ b/getstream/video/rest_client.py @@ -792,3 +792,19 @@ def query_aggregate_call_stats( return self.post( "/api/v2/video/stats", QueryAggregateCallStatsResponse, json=json ) + + def get_call_report( + self, type: str, id: str, session_id: Optional[str] = None + ) -> StreamResponse[GetCallReportResponse]: + query_params = build_query_param(session_id=session_id) + path_params = { + "type": type, + "id": id, + } + + return self.get( + "/api/v2/video/call/{type}/{id}/report", + GetCallReportResponse, + query_params=query_params, + path_params=path_params, + ) diff --git a/tests/test_video_integration.py b/tests/test_video_integration.py index 3267f437..9982bd41 100644 --- a/tests/test_video_integration.py +++ b/tests/test_video_integration.py @@ -355,6 +355,16 @@ def test_delete_not_existing_transcription(self): with pytest.raises(StreamAPIException): self.call.delete_transcription("random_session", "random_filename") + def test_get_call_report_for_latest_session(self): + with pytest.raises(StreamAPIException): + self.client.video.get_call_report(self.call.call_type, self.call.id) + + def test_get_call_report_for_specified_session(self): + with pytest.raises(StreamAPIException): + self.client.video.get_call_report( + self.call.call_type, self.call.id, session_id="non_existent" + ) + class TestDeleteCall: def test_soft_delete(self, call: Call):