feat: 添加对话列表点赞点踩过滤
This commit is contained in:
parent
928ea66b9d
commit
9d58718757
@ -9,20 +9,22 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import uuid
|
import uuid
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
from typing import Dict, List
|
from typing import Dict, List
|
||||||
|
|
||||||
|
from django.core import validators
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from django.db import transaction
|
from django.db import transaction, models
|
||||||
from django.db.models import QuerySet
|
from django.db.models import QuerySet, Q
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from application.models import Chat, Application, ApplicationDatasetMapping, VoteChoices, ChatRecord
|
from application.models import Chat, Application, ApplicationDatasetMapping, VoteChoices, ChatRecord
|
||||||
from application.serializers.application_serializers import ModelDatasetAssociation, DatasetSettingSerializer, \
|
from application.serializers.application_serializers import ModelDatasetAssociation, DatasetSettingSerializer, \
|
||||||
ModelSettingSerializer
|
ModelSettingSerializer
|
||||||
from application.serializers.chat_message_serializers import ChatInfo
|
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.event import ListenerManagement
|
||||||
from common.exception.app_exception import AppApiException
|
from common.exception.app_exception import AppApiException
|
||||||
from common.util.file_util import get_file_content
|
from common.util.file_util import get_file_content
|
||||||
@ -53,6 +55,12 @@ class ChatSerializers(serializers.Serializer):
|
|||||||
history_day = serializers.IntegerField(required=True)
|
history_day = serializers.IntegerField(required=True)
|
||||||
user_id = serializers.UUIDField(required=True)
|
user_id = serializers.UUIDField(required=True)
|
||||||
application_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):
|
def get_end_time(self):
|
||||||
history_day = self.data.get('history_day')
|
history_day = self.data.get('history_day')
|
||||||
@ -60,24 +68,51 @@ class ChatSerializers(serializers.Serializer):
|
|||||||
|
|
||||||
def get_query_set(self):
|
def get_query_set(self):
|
||||||
end_time = self.get_end_time()
|
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:
|
if 'abstract' in self.data and self.data.get('abstract') is not None:
|
||||||
query_dict['abstract__contains'] = self.data.get('abstract')
|
base_query_dict['abstract__contains'] = self.data.get('abstract')
|
||||||
return QuerySet(Chat).filter(**query_dict).order_by("-create_time")
|
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):
|
def list(self, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
self.is_valid(raise_exception=True)
|
self.is_valid(raise_exception=True)
|
||||||
return native_search(self.get_query_set(), select_string=get_file_content(
|
return native_search(self.get_query_set(), select_string=get_file_content(
|
||||||
os.path.join(PROJECT_DIR, "apps", "application", 'sql', 'list_application_chat.sql')),
|
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):
|
def page(self, current_page: int, page_size: int, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
self.is_valid(raise_exception=True)
|
self.is_valid(raise_exception=True)
|
||||||
return native_page_search(current_page, page_size, self.get_query_set(), select_string=get_file_content(
|
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')),
|
os.path.join(PROJECT_DIR, "apps", "application", 'sql', 'list_application_chat.sql')),
|
||||||
with_table_name=True)
|
with_table_name=False)
|
||||||
|
|
||||||
class OpenChat(serializers.Serializer):
|
class OpenChat(serializers.Serializer):
|
||||||
user_id = serializers.UUIDField(required=True)
|
user_id = serializers.UUIDField(required=True)
|
||||||
|
|||||||
@ -104,7 +104,13 @@ class ChatApi(ApiMixin):
|
|||||||
required=True,
|
required=True,
|
||||||
description='历史天数'),
|
description='历史天数'),
|
||||||
openapi.Parameter(name='abstract', in_=openapi.IN_QUERY, type=openapi.TYPE_STRING, required=False,
|
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 比较器")
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user