feat: 添加对话列表点赞点踩过滤

This commit is contained in:
shaohuzhang1 2024-01-25 19:19:46 +08:00
parent 928ea66b9d
commit 9d58718757
2 changed files with 50 additions and 9 deletions

View File

@ -9,20 +9,22 @@
import datetime
import json
import os
import re
import uuid
from functools import reduce
from typing import Dict, List
from django.core import validators
from django.core.cache import cache
from django.db import transaction
from django.db.models import QuerySet
from django.db import transaction, models
from django.db.models import QuerySet, Q
from rest_framework import serializers
from application.models import Chat, Application, ApplicationDatasetMapping, VoteChoices, ChatRecord
from application.serializers.application_serializers import ModelDatasetAssociation, DatasetSettingSerializer, \
ModelSettingSerializer
from application.serializers.chat_message_serializers import ChatInfo
from common.db.search import native_search, native_page_search, page_search
from common.db.search import native_search, native_page_search, page_search, get_dynamics_model
from common.event import ListenerManagement
from common.exception.app_exception import AppApiException
from common.util.file_util import get_file_content
@ -53,6 +55,12 @@ class ChatSerializers(serializers.Serializer):
history_day = serializers.IntegerField(required=True)
user_id = serializers.UUIDField(required=True)
application_id = serializers.UUIDField(required=True)
min_star = serializers.IntegerField(required=False, min_value=0)
min_trample = serializers.IntegerField(required=False, min_value=0)
comparer = serializers.CharField(required=False, validators=[
validators.RegexValidator(regex=re.compile("^and|or$"),
message="只支持and|or", code=500)
])
def get_end_time(self):
history_day = self.data.get('history_day')
@ -60,24 +68,51 @@ class ChatSerializers(serializers.Serializer):
def get_query_set(self):
end_time = self.get_end_time()
query_dict = {'application_id': self.data.get("application_id"), 'create_time__gte': end_time}
query_set = QuerySet(model=get_dynamics_model(
{'application_id': models.CharField(),
'abstract': models.CharField(),
"star_num": models.IntegerField(),
'trample_num': models.IntegerField(),
'comparer': models.CharField(),
'create_time': models.DateTimeField()}))
base_query_dict = {'application_id': self.data.get("application_id"), 'create_time__gte': end_time}
if 'abstract' in self.data and self.data.get('abstract') is not None:
query_dict['abstract__contains'] = self.data.get('abstract')
return QuerySet(Chat).filter(**query_dict).order_by("-create_time")
base_query_dict['abstract__contains'] = self.data.get('abstract')
base_condition = Q(**base_query_dict)
min_star_query = None
min_trample_query = None
if 'min_star' in self.data and self.data.get('min_star') is not None:
min_star_query = Q(star_num__gte=self.data.get('min_star'))
if 'min_trample' in self.data and self.data.get('min_trample') is not None:
min_trample_query = Q(trample_num__gte=self.data.get('min_trample'))
if min_star_query is not None and min_trample_query is not None:
if self.data.get(
'comparer') is not None and self.data.get('comparer') == 'or':
condition = base_condition & (min_star_query | min_trample_query)
else:
condition = base_condition & (min_star_query & min_trample_query)
elif min_star_query is not None:
condition = base_condition & min_star_query
elif min_trample_query is not None:
condition = base_condition & min_trample_query
else:
condition = base_condition
return query_set.filter(condition).order_by("-create_time")
def list(self, with_valid=True):
if with_valid:
self.is_valid(raise_exception=True)
return native_search(self.get_query_set(), select_string=get_file_content(
os.path.join(PROJECT_DIR, "apps", "application", 'sql', 'list_application_chat.sql')),
with_table_name=True)
with_table_name=False)
def page(self, current_page: int, page_size: int, with_valid=True):
if with_valid:
self.is_valid(raise_exception=True)
return native_page_search(current_page, page_size, self.get_query_set(), select_string=get_file_content(
os.path.join(PROJECT_DIR, "apps", "application", 'sql', 'list_application_chat.sql')),
with_table_name=True)
with_table_name=False)
class OpenChat(serializers.Serializer):
user_id = serializers.UUIDField(required=True)

View File

@ -104,7 +104,13 @@ class ChatApi(ApiMixin):
required=True,
description='历史天数'),
openapi.Parameter(name='abstract', in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=False,
description="摘要")
description="摘要"),
openapi.Parameter(name='min_star', in_=openapi.IN_QUERY, type=openapi.TYPE_INTEGER, required=False,
description="最小点赞数"),
openapi.Parameter(name='min_trample', in_=openapi.IN_QUERY, type=openapi.TYPE_INTEGER, required=False,
description="最小点踩数"),
openapi.Parameter(name='comparer', in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=False,
description="or|and 比较器")
]