Skip to content

Commit 51e76da

Browse files
committed
feat: Statistics on the number of conversations on the homepage
1 parent cc85776 commit 51e76da

3 files changed

Lines changed: 79 additions & 2 deletions

File tree

apps/homepage/serializers/homepage.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,60 @@ def get_format_time(date_time):
4949

5050

5151
class HomePageSerializer(serializers.Serializer):
52+
class ChatRecordAggregation(serializers.Serializer):
53+
workspace_id = serializers.CharField(required=False, label=_("Workspace ID"))
54+
user_id = serializers.UUIDField(required=True, label=_("User ID"))
55+
start_time = serializers.DateField(format='%Y-%m-%d', label=_("Start time"))
56+
end_time = serializers.DateField(format='%Y-%m-%d', label=_("End time"))
57+
58+
def aggregation(self, auth, with_valid=True):
59+
if with_valid:
60+
self.is_valid(raise_exception=True)
61+
data = self.validated_data
62+
user_id = data["user_id"]
63+
workspace_id = data.get("workspace_id")
64+
start_time = get_format_time(data["start_time"])
65+
end_time = get_format_time(data["end_time"])
66+
workspace_manage = is_workspace_manage(auth, workspace_id)
67+
query = ChatRecord.objects.filter(
68+
create_time__gte=start_time,
69+
create_time__lte=end_time,
70+
)
71+
if workspace_manage:
72+
query = query.filter(
73+
chat__application__workspace_id=workspace_id
74+
)
75+
76+
else:
77+
permission_list = (
78+
["VIEW", "MANAGE", "ROLE"]
79+
if hasPermission(auth, "APPLICATION:READ")
80+
else ["VIEW", "MANAGE"]
81+
)
82+
permission_subquery = (
83+
WorkspaceUserResourcePermission.objects
84+
.filter(
85+
workspace_id=workspace_id,
86+
user_id=user_id,
87+
auth_type="APPLICATION",
88+
permission_list__overlap=permission_list
89+
)
90+
.annotate(
91+
target_uuid=Cast(
92+
"target",
93+
output_field=UUIDField()
94+
)
95+
)
96+
.values("target_uuid")
97+
)
98+
query = query.filter(
99+
chat__application_id__in=permission_subquery
100+
)
101+
102+
return query.aggregate(
103+
total_count=Count("id")
104+
)["total_count"]
105+
52106
class TokensAggregation(serializers.Serializer):
53107
workspace_id = serializers.CharField(required=False, label=_("Workspace ID"))
54108
user_id = serializers.UUIDField(required=True, label=_("User ID"))

apps/homepage/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414
path("workspace/<str:workspace_id>/homepage/knowledge/aggregation",views.HomePageAPI.KnowledgeAggregation.as_view()),
1515
path("workspace/<str:workspace_id>/homepage/tool/aggregation",views.HomePageAPI.ToolAggregation.as_view()),
1616
path("workspace/<str:workspace_id>/homepage/model/aggregation",views.HomePageAPI.ModelAggregation.as_view()),
17-
path("workspace/<str:workspace_id>/homepage/tokens/aggregation",views.HomePageAPI.TokensAggregation.as_view())
17+
path("workspace/<str:workspace_id>/homepage/tokens/aggregation",views.HomePageAPI.TokensAggregation.as_view()),
18+
path("workspace/<str:workspace_id>/homepage/chat_record/aggregation",views.HomePageAPI.ChatRecordAggregation.as_view())
1819
]

apps/homepage/views/homepage.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,36 @@
2323
class HomePageAPI(APIView):
2424
authentication_classes = [TokenAuth]
2525

26+
class ChatRecordAggregation(APIView):
27+
authentication_classes = [TokenAuth]
28+
29+
@extend_schema(
30+
methods=["GET"],
31+
description=_("Chat record data aggregation"),
32+
summary=_("Chat record aggregation"),
33+
operation_id="homepage_chat_count_aggregation",
34+
parameters=TokensAggregationAPI.get_parameters(),
35+
responses=TokensAggregationAPI.get_response(),
36+
tags=[_("Home page")],
37+
)
38+
def get(self, request: Request, workspace_id: str):
39+
return result.success(
40+
HomePageSerializer.ChatRecordAggregation(
41+
data={'workspace_id': workspace_id, 'user_id': request.user.id,
42+
'start_time': request.query_params.get(
43+
'start_time'),
44+
'end_time': request.query_params.get(
45+
'end_time')}).aggregation(
46+
request.auth))
47+
2648
class TokensAggregation(APIView):
2749
authentication_classes = [TokenAuth]
2850

2951
@extend_schema(
3052
methods=["GET"],
3153
description=_("Tokens data aggregation"),
3254
summary=_("Tokens data aggregation"),
33-
operation_id="homepage_model_aggregation",
55+
operation_id="homepage_tokens_aggregation",
3456
parameters=TokensAggregationAPI.get_parameters(),
3557
responses=TokensAggregationAPI.get_response(),
3658
tags=[_("Home page")],

0 commit comments

Comments
 (0)