From 65224108b29e43883e80f2a01f4684283b70e359 Mon Sep 17 00:00:00 2001 From: shaohuzhang1 Date: Mon, 25 May 2026 16:52:54 +0800 Subject: [PATCH] feat: Homepage data: Total number of added tokens statistics --- apps/homepage/serializers/homepage.py | 54 +++++++++++++++++++++++++++ apps/homepage/urls.py | 3 +- apps/homepage/views/homepage.py | 24 +++++++++++- 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/apps/homepage/serializers/homepage.py b/apps/homepage/serializers/homepage.py index e554080bd43..764bcd41a61 100644 --- a/apps/homepage/serializers/homepage.py +++ b/apps/homepage/serializers/homepage.py @@ -49,6 +49,60 @@ def get_format_time(date_time): class HomePageSerializer(serializers.Serializer): + class ChatRecordAggregation(serializers.Serializer): + workspace_id = serializers.CharField(required=False, label=_("Workspace ID")) + user_id = serializers.UUIDField(required=True, label=_("User ID")) + start_time = serializers.DateField(format='%Y-%m-%d', label=_("Start time")) + end_time = serializers.DateField(format='%Y-%m-%d', label=_("End time")) + + def aggregation(self, auth, with_valid=True): + if with_valid: + self.is_valid(raise_exception=True) + data = self.validated_data + user_id = data["user_id"] + workspace_id = data.get("workspace_id") + start_time = get_format_time(data["start_time"]) + end_time = get_format_time(data["end_time"]) + workspace_manage = is_workspace_manage(auth, workspace_id) + query = ChatRecord.objects.filter( + create_time__gte=start_time, + create_time__lte=end_time, + ) + if workspace_manage: + query = query.filter( + chat__application__workspace_id=workspace_id + ) + + else: + permission_list = ( + ["VIEW", "MANAGE", "ROLE"] + if hasPermission(auth, "APPLICATION:READ") + else ["VIEW", "MANAGE"] + ) + permission_subquery = ( + WorkspaceUserResourcePermission.objects + .filter( + workspace_id=workspace_id, + user_id=user_id, + auth_type="APPLICATION", + permission_list__overlap=permission_list + ) + .annotate( + target_uuid=Cast( + "target", + output_field=UUIDField() + ) + ) + .values("target_uuid") + ) + query = query.filter( + chat__application_id__in=permission_subquery + ) + + return query.aggregate( + total_count=Count("id") + )["total_count"] + class TokensAggregation(serializers.Serializer): workspace_id = serializers.CharField(required=False, label=_("Workspace ID")) user_id = serializers.UUIDField(required=True, label=_("User ID")) diff --git a/apps/homepage/urls.py b/apps/homepage/urls.py index 924811984fc..f8dca911243 100644 --- a/apps/homepage/urls.py +++ b/apps/homepage/urls.py @@ -14,5 +14,6 @@ path("workspace//homepage/knowledge/aggregation",views.HomePageAPI.KnowledgeAggregation.as_view()), path("workspace//homepage/tool/aggregation",views.HomePageAPI.ToolAggregation.as_view()), path("workspace//homepage/model/aggregation",views.HomePageAPI.ModelAggregation.as_view()), - path("workspace//homepage/tokens/aggregation",views.HomePageAPI.TokensAggregation.as_view()) + path("workspace//homepage/tokens/aggregation",views.HomePageAPI.TokensAggregation.as_view()), + path("workspace//homepage/chat_record/aggregation",views.HomePageAPI.ChatRecordAggregation.as_view()) ] diff --git a/apps/homepage/views/homepage.py b/apps/homepage/views/homepage.py index 31e898e291a..04350e409ca 100644 --- a/apps/homepage/views/homepage.py +++ b/apps/homepage/views/homepage.py @@ -23,6 +23,28 @@ class HomePageAPI(APIView): authentication_classes = [TokenAuth] + class ChatRecordAggregation(APIView): + authentication_classes = [TokenAuth] + + @extend_schema( + methods=["GET"], + description=_("Chat record data aggregation"), + summary=_("Chat record aggregation"), + operation_id="homepage_chat_count_aggregation", + parameters=TokensAggregationAPI.get_parameters(), + responses=TokensAggregationAPI.get_response(), + tags=[_("Home page")], + ) + def get(self, request: Request, workspace_id: str): + return result.success( + HomePageSerializer.ChatRecordAggregation( + data={'workspace_id': workspace_id, 'user_id': request.user.id, + 'start_time': request.query_params.get( + 'start_time'), + 'end_time': request.query_params.get( + 'end_time')}).aggregation( + request.auth)) + class TokensAggregation(APIView): authentication_classes = [TokenAuth] @@ -30,7 +52,7 @@ class TokensAggregation(APIView): methods=["GET"], description=_("Tokens data aggregation"), summary=_("Tokens data aggregation"), - operation_id="homepage_model_aggregation", + operation_id="homepage_tokens_aggregation", parameters=TokensAggregationAPI.get_parameters(), responses=TokensAggregationAPI.get_response(), tags=[_("Home page")],