daren/apps/template/views.py

318 lines
12 KiB
Python
Raw Permalink Normal View History

2025-05-19 18:23:59 +08:00
from django.shortcuts import render
from rest_framework import viewsets, permissions, status, filters
from rest_framework.response import Response
from rest_framework.decorators import action
from django_filters.rest_framework import DjangoFilterBackend
2025-05-30 11:49:59 +08:00
from .models import Template
2025-05-19 18:23:59 +08:00
from .serializers import (
TemplateListSerializer,
TemplateDetailSerializer,
2025-05-30 11:49:59 +08:00
TemplateCreateUpdateSerializer
2025-05-19 18:23:59 +08:00
)
from .filters import TemplateFilter
from .utils import ApiResponse
from .pagination import StandardResultsSetPagination
2025-05-20 17:50:54 +08:00
from rest_framework.permissions import IsAuthenticated
from apps.user.authentication import CustomTokenAuthentication
2025-06-03 10:35:57 +08:00
from django.db.models import Q
2025-05-19 18:23:59 +08:00
# Create your views here.
class TemplateViewSet(viewsets.ModelViewSet):
"""
模板视图集
提供模板的增删改查功能
"""
queryset = Template.objects.all()
2025-05-20 17:50:54 +08:00
authentication_classes = [CustomTokenAuthentication]
permission_classes = [IsAuthenticated]
2025-05-19 18:23:59 +08:00
filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
filterset_class = TemplateFilter
search_fields = ['title', 'content']
ordering_fields = ['created_at', 'updated_at', 'title']
ordering = ['-created_at']
pagination_class = StandardResultsSetPagination
2025-05-30 11:49:59 +08:00
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options']
2025-05-19 18:23:59 +08:00
def get_queryset(self):
"""
自定义查询集返回所有模板
"""
return Template.objects.all()
def get_serializer_class(self):
"""根据不同的操作返回不同的序列化器"""
if self.action == 'list':
return TemplateListSerializer
elif self.action in ['create', 'update', 'partial_update']:
return TemplateCreateUpdateSerializer
return TemplateDetailSerializer
def list(self, request, *args, **kwargs):
2025-05-30 11:49:59 +08:00
"""获取所有模板支持通过query参数mission进行筛选"""
# 从query_params中获取mission参数
mission = request.query_params.get('mission', None)
if mission and mission != 'all':
queryset = self.filter_queryset(self.get_queryset().filter(mission=mission))
else:
queryset = self.filter_queryset(self.get_queryset())
2025-05-19 18:23:59 +08:00
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return ApiResponse.success(
data=serializer.data,
message="获取模板列表成功"
)
def retrieve(self, request, *args, **kwargs):
"""获取单个模板详情"""
instance = self.get_object()
serializer = self.get_serializer(instance)
return ApiResponse.success(
data=serializer.data,
message="获取模板详情成功"
)
def create(self, request, *args, **kwargs):
"""创建模板"""
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
self.perform_create(serializer)
return ApiResponse.success(
data=serializer.data,
message="模板创建成功",
code=status.HTTP_201_CREATED
)
return ApiResponse.error(
message="模板创建失败",
data=serializer.errors,
code=status.HTTP_400_BAD_REQUEST
)
def update(self, request, *args, **kwargs):
"""更新模板"""
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
if serializer.is_valid():
self.perform_update(serializer)
return ApiResponse.success(
data=serializer.data,
message="模板更新成功"
)
return ApiResponse.error(
message="模板更新失败",
data=serializer.errors,
code=status.HTTP_400_BAD_REQUEST
)
def destroy(self, request, *args, **kwargs):
"""删除模板"""
instance = self.get_object()
self.perform_destroy(instance)
return ApiResponse.success(
data=None,
message="模板删除成功"
)
@action(detail=False, methods=['get'])
def mine(self, request):
"""获取所有模板"""
templates = Template.objects.all()
page = self.paginate_queryset(templates)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(templates, many=True)
return ApiResponse.success(
data=serializer.data,
message="获取模板成功"
)
@action(detail=False, methods=['get'])
def public(self, request):
"""获取所有公开的模板"""
templates = Template.objects.filter(is_public=True)
page = self.paginate_queryset(templates)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(templates, many=True)
return ApiResponse.success(
data=serializer.data,
message="获取公开模板成功"
)
@action(detail=False, methods=['get'])
def by_mission(self, request):
"""按任务类型获取模板"""
mission = request.query_params.get('mission', None)
if not mission:
return ApiResponse.error(
message="需要提供mission参数",
code=status.HTTP_400_BAD_REQUEST
)
2025-05-30 11:49:59 +08:00
if mission == 'all':
queryset = self.get_queryset()
else:
queryset = self.get_queryset().filter(mission=mission)
2025-05-19 18:23:59 +08:00
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return ApiResponse.success(
data=serializer.data,
message="按任务类型获取模板成功"
)
@action(detail=False, methods=['get'])
def by_platform(self, request):
"""按平台获取模板"""
platform = request.query_params.get('platform', None)
if not platform:
return ApiResponse.error(
message="需要提供platform参数",
code=status.HTTP_400_BAD_REQUEST
)
queryset = self.get_queryset().filter(platform=platform)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return ApiResponse.success(
data=serializer.data,
message="按平台获取模板成功"
)
@action(detail=False, methods=['get'])
def by_collaboration(self, request):
"""按合作模式获取模板"""
collaboration_type = request.query_params.get('collaboration_type', None)
if not collaboration_type:
return ApiResponse.error(
message="需要提供collaboration_type参数",
code=status.HTTP_400_BAD_REQUEST
)
queryset = self.get_queryset().filter(collaboration_type=collaboration_type)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return ApiResponse.success(
data=serializer.data,
message="按合作模式获取模板成功"
)
@action(detail=False, methods=['get'])
def by_service(self, request):
"""按服务类型获取模板"""
service = request.query_params.get('service', None)
if not service:
return ApiResponse.error(
message="需要提供service参数",
code=status.HTTP_400_BAD_REQUEST
)
queryset = self.get_queryset().filter(service=service)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return ApiResponse.success(
data=serializer.data,
message="按服务类型获取模板成功"
)
2025-05-30 11:49:59 +08:00
@action(detail=False, methods=['get'])
def mission_options(self, request):
"""获取任务类型选项列表"""
mission_options = [
{'value': 'all', 'name': '全部'},
{'value': 'initial_contact', 'name': '初步建联'},
{'value': 'negotiation', 'name': '砍价邮件'},
{'value': 'script', 'name': '脚本邮件'},
{'value': 'follow_up', 'name': '合作追踪'},
]
return ApiResponse.success(
data=mission_options,
message="获取任务类型选项列表成功"
)
@action(detail=False, methods=['post'])
def search_templates(self, request):
"""
通过POST请求查询模板
请求体参数:
- mission: 任务类型
2025-06-03 10:35:57 +08:00
- query: 搜索关键词可选用于模糊查询标题和内容
2025-05-30 11:49:59 +08:00
- page: 页码可选默认1
- page_size: 每页数量可选默认10
"""
# 获取查询参数
mission = request.data.get('mission', None)
2025-06-03 10:35:57 +08:00
query = request.data.get('query', None)
2025-05-30 11:49:59 +08:00
page = request.data.get('page', 1)
page_size = request.data.get('page_size', 10)
try:
page = int(page)
page_size = int(page_size)
except (TypeError, ValueError):
return ApiResponse.error(
message="页码和每页数量必须是整数",
code=status.HTTP_400_BAD_REQUEST
)
# 构建查询集
2025-06-03 10:35:57 +08:00
queryset = self.get_queryset()
# 按任务类型筛选
2025-05-30 11:49:59 +08:00
if mission and mission != 'all':
2025-06-03 10:35:57 +08:00
queryset = queryset.filter(mission=mission)
# 按关键词模糊查询
if query:
queryset = queryset.filter(
Q(title__icontains=query) |
Q(content__icontains=query)
)
# 应用其他过滤器
queryset = self.filter_queryset(queryset)
2025-05-30 11:49:59 +08:00
# 设置分页
paginator = self.pagination_class()
paginator.page_size = page_size
paginated_queryset = paginator.paginate_queryset(queryset, request)
if paginated_queryset is not None:
serializer = self.get_serializer(paginated_queryset, many=True)
response_data = {
'count': paginator.page.paginator.count,
'next': paginator.get_next_link(),
'previous': paginator.get_previous_link(),
'results': serializer.data
}
return ApiResponse.success(
data=response_data,
message="查询模板成功"
)
serializer = self.get_serializer(queryset, many=True)
return ApiResponse.success(
data=serializer.data,
message="查询模板成功"
)