Skip to content

Commit 5a14e51

Browse files
authored
Merge pull request #62 from GetStream/query-by-ratings
[VID-300] Query user feedback API endpoint
2 parents 8a84b04 + 174f307 commit 5a14e51

File tree

4 files changed

+126
-16
lines changed

4 files changed

+126
-16
lines changed

getstream/models/__init__.py

Lines changed: 89 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,14 @@ class BroadcastSettingsResponse(DataClassJsonMixin):
870870
rtmp: "RTMPSettingsResponse" = dc_field(metadata=dc_config(field_name="rtmp"))
871871

872872

873+
@dataclass
874+
class BrowserDataResponse(DataClassJsonMixin):
875+
name: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="name"))
876+
version: Optional[str] = dc_field(
877+
default=None, metadata=dc_config(field_name="version")
878+
)
879+
880+
873881
@dataclass
874882
class CallAcceptedEvent(DataClassJsonMixin):
875883
call_cid: str = dc_field(metadata=dc_config(field_name="call_cid"))
@@ -3478,6 +3486,17 @@ class CheckSQSResponse(DataClassJsonMixin):
34783486
)
34793487

34803488

3489+
@dataclass
3490+
class ClientOSDataResponse(DataClassJsonMixin):
3491+
architecture: Optional[str] = dc_field(
3492+
default=None, metadata=dc_config(field_name="architecture")
3493+
)
3494+
name: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="name"))
3495+
version: Optional[str] = dc_field(
3496+
default=None, metadata=dc_config(field_name="version")
3497+
)
3498+
3499+
34813500
@dataclass
34823501
class ClosedCaptionEvent(DataClassJsonMixin):
34833502
call_cid: str = dc_field(metadata=dc_config(field_name="call_cid"))
@@ -4375,6 +4394,14 @@ class Device(DataClassJsonMixin):
43754394
voip: Optional[bool] = dc_field(default=None, metadata=dc_config(field_name="voip"))
43764395

43774396

4397+
@dataclass
4398+
class DeviceDataResponse(DataClassJsonMixin):
4399+
name: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="name"))
4400+
version: Optional[str] = dc_field(
4401+
default=None, metadata=dc_config(field_name="version")
4402+
)
4403+
4404+
43784405
@dataclass
43794406
class DeviceErrorInfo(DataClassJsonMixin):
43804407
error_message: str = dc_field(metadata=dc_config(field_name="error_message"))
@@ -5355,6 +5382,13 @@ class GetBlockedUsersResponse(DataClassJsonMixin):
53555382
)
53565383

53575384

5385+
@dataclass
5386+
class GetCallReportResponse(DataClassJsonMixin):
5387+
duration: str = dc_field(metadata=dc_config(field_name="duration"))
5388+
session_id: str = dc_field(metadata=dc_config(field_name="session_id"))
5389+
report: "ReportResponse" = dc_field(metadata=dc_config(field_name="report"))
5390+
5391+
53585392
@dataclass
53595393
class GetCallResponse(DataClassJsonMixin):
53605394
duration: str = dc_field(metadata=dc_config(field_name="duration"))
@@ -5365,13 +5399,6 @@ class GetCallResponse(DataClassJsonMixin):
53655399
call: "CallResponse" = dc_field(metadata=dc_config(field_name="call"))
53665400

53675401

5368-
@dataclass
5369-
class GetCallReportResponse(DataClassJsonMixin):
5370-
duration: str = dc_field(metadata=dc_config(field_name="duration"))
5371-
session_id: str = dc_field(metadata=dc_config(field_name="session_id"))
5372-
report: "ReportResponse" = dc_field(metadata=dc_config(field_name="report"))
5373-
5374-
53755402
@dataclass
53765403
class GetCallStatsResponse(DataClassJsonMixin):
53775404
call_duration_seconds: int = dc_field(
@@ -7975,6 +8002,13 @@ class PinResponse(DataClassJsonMixin):
79758002
duration: str = dc_field(metadata=dc_config(field_name="duration"))
79768003

79778004

8005+
@dataclass
8006+
class PlatformDataResponse(DataClassJsonMixin):
8007+
browser: "BrowserDataResponse" = dc_field(metadata=dc_config(field_name="browser"))
8008+
device: "DeviceDataResponse" = dc_field(metadata=dc_config(field_name="device"))
8009+
os: "ClientOSDataResponse" = dc_field(metadata=dc_config(field_name="os"))
8010+
8011+
79788012
@dataclass
79798013
class Policy(DataClassJsonMixin):
79808014
action: int = dc_field(metadata=dc_config(field_name="action"))
@@ -9187,6 +9221,31 @@ class QueryUsageStatsResponse(DataClassJsonMixin):
91879221
prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev"))
91889222

91899223

9224+
@dataclass
9225+
class QueryUserFeedbackRequest(DataClassJsonMixin):
9226+
limit: Optional[int] = dc_field(
9227+
default=None, metadata=dc_config(field_name="limit")
9228+
)
9229+
next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next"))
9230+
prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev"))
9231+
sort: "Optional[List[SortParamRequest]]" = dc_field(
9232+
default=None, metadata=dc_config(field_name="sort")
9233+
)
9234+
filter_conditions: Optional[Dict[str, object]] = dc_field(
9235+
default=None, metadata=dc_config(field_name="filter_conditions")
9236+
)
9237+
9238+
9239+
@dataclass
9240+
class QueryUserFeedbackResponse(DataClassJsonMixin):
9241+
duration: str = dc_field(metadata=dc_config(field_name="duration"))
9242+
user_feedback: "List[UserFeedbackResponse]" = dc_field(
9243+
metadata=dc_config(field_name="user_feedback")
9244+
)
9245+
next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next"))
9246+
prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev"))
9247+
9248+
91909249
@dataclass
91919250
class QueryUsersPayload(DataClassJsonMixin):
91929251
filter_conditions: Dict[str, object] = dc_field(
@@ -12270,6 +12329,23 @@ class UserFeedbackReportResponse(DataClassJsonMixin):
1227012329
)
1227112330

1227212331

12332+
@dataclass
12333+
class UserFeedbackResponse(DataClassJsonMixin):
12334+
cid: str = dc_field(metadata=dc_config(field_name="cid"))
12335+
rating: int = dc_field(metadata=dc_config(field_name="rating"))
12336+
reason: str = dc_field(metadata=dc_config(field_name="reason"))
12337+
sdk: str = dc_field(metadata=dc_config(field_name="sdk"))
12338+
sdk_version: str = dc_field(metadata=dc_config(field_name="sdk_version"))
12339+
session_id: str = dc_field(metadata=dc_config(field_name="session_id"))
12340+
user_id: str = dc_field(metadata=dc_config(field_name="user_id"))
12341+
platform: "PlatformDataResponse" = dc_field(
12342+
metadata=dc_config(field_name="platform")
12343+
)
12344+
custom: Optional[Dict[str, object]] = dc_field(
12345+
default=None, metadata=dc_config(field_name="custom")
12346+
)
12347+
12348+
1227312349
@dataclass
1227412350
class UserFlaggedEvent(DataClassJsonMixin):
1227512351
created_at: datetime = dc_field(
@@ -12393,6 +12469,12 @@ class UserMutedEvent(DataClassJsonMixin):
1239312469
)
1239412470

1239512471

12472+
@dataclass
12473+
class UserRatingReportResponse(DataClassJsonMixin):
12474+
average: float = dc_field(metadata=dc_config(field_name="average"))
12475+
count: int = dc_field(metadata=dc_config(field_name="count"))
12476+
12477+
1239612478
@dataclass
1239712479
class UserReactivatedEvent(DataClassJsonMixin):
1239812480
created_at: datetime = dc_field(
@@ -12411,12 +12493,6 @@ class UserReactivatedEvent(DataClassJsonMixin):
1241112493
)
1241212494

1241312495

12414-
@dataclass
12415-
class UserRatingReportResponse(DataClassJsonMixin):
12416-
average: float = dc_field(metadata=dc_config(field_name="average"))
12417-
count: int = dc_field(metadata=dc_config(field_name="count"))
12418-
12419-
1242012496
@dataclass
1242112497
class UserRequest(DataClassJsonMixin):
1242212498
id: str = dc_field(metadata=dc_config(field_name="id"))

getstream/video/call.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,15 @@ def list_recordings(self) -> StreamResponse[ListRecordingsResponse]:
199199
self._sync_from_response(response.data)
200200
return response
201201

202+
def get_call_report(
203+
self, session_id: Optional[str] = None
204+
) -> StreamResponse[GetCallReportResponse]:
205+
response = self.client.get_call_report(
206+
type=self.call_type, id=self.id, session_id=session_id
207+
)
208+
self._sync_from_response(response.data)
209+
return response
210+
202211
def start_rtmp_broadcasts(
203212
self, broadcasts: List[RTMPBroadcastRequest]
204213
) -> StreamResponse[StartRTMPBroadcastsResponse]:

getstream/video/rest_client.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,31 @@ def __init__(self, api_key: str, base_url: str, timeout: float, token: str):
2121
token=token,
2222
)
2323

24+
def query_user_feedback(
25+
self,
26+
full: Optional[bool] = None,
27+
limit: Optional[int] = None,
28+
next: Optional[str] = None,
29+
prev: Optional[str] = None,
30+
sort: Optional[List[SortParamRequest]] = None,
31+
filter_conditions: Optional[Dict[str, object]] = None,
32+
) -> StreamResponse[QueryUserFeedbackResponse]:
33+
query_params = build_query_param(full=full)
34+
json = build_body_dict(
35+
limit=limit,
36+
next=next,
37+
prev=prev,
38+
sort=sort,
39+
filter_conditions=filter_conditions,
40+
)
41+
42+
return self.post(
43+
"/api/v2/video/call/feedback",
44+
QueryUserFeedbackResponse,
45+
query_params=query_params,
46+
json=json,
47+
)
48+
2449
def query_call_members(
2550
self,
2651
id: str,

tests/test_video_examples.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
ScreensharingSettingsRequest,
88
OwnCapability,
99
LimitsSettingsRequest,
10-
BackstageSettingsRequest, SessionSettingsRequest,
10+
BackstageSettingsRequest,
11+
SessionSettingsRequest,
1112
)
1213
from getstream.video.call import Call
1314
from datetime import datetime, timezone, timedelta
@@ -305,7 +306,6 @@ def test_create_call_with_custom_session_inactivity_timeout(call: Call):
305306

306307

307308
def test_create_call_type_with_custom_session_inactivity_timeout(client: Stream):
308-
309309
# create a call type with a session inactivity timeout of 5 minutes
310310
response = client.video.create_call_type(
311311
name="long_inactivity_timeout_" + str(uuid.uuid4()),
@@ -316,4 +316,4 @@ def test_create_call_type_with_custom_session_inactivity_timeout(client: Stream)
316316
),
317317
)
318318

319-
assert response.data.settings.session.inactivity_timeout_seconds == 300
319+
assert response.data.settings.session.inactivity_timeout_seconds == 300

0 commit comments

Comments
 (0)