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 from .models import Template from .serializers import ( TemplateListSerializer, TemplateDetailSerializer, TemplateCreateUpdateSerializer ) from .filters import TemplateFilter from .utils import ApiResponse from .pagination import StandardResultsSetPagination from rest_framework.permissions import IsAuthenticated from apps.user.authentication import CustomTokenAuthentication # Create your views here. class TemplateViewSet(viewsets.ModelViewSet): """ 模板视图集 提供模板的增删改查功能 """ queryset = Template.objects.all() authentication_classes = [CustomTokenAuthentication] permission_classes = [IsAuthenticated] 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 http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'] 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): """获取所有模板,支持通过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()) 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 ) if mission == 'all': queryset = self.get_queryset() else: queryset = self.get_queryset().filter(mission=mission) 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="按服务类型获取模板成功" ) @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: 任务类型 - page: 页码(可选,默认1) - page_size: 每页数量(可选,默认10) """ # 获取查询参数 mission = request.data.get('mission', None) 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 ) # 构建查询集 if mission and mission != 'all': queryset = self.filter_queryset(self.get_queryset().filter(mission=mission)) else: queryset = self.filter_queryset(self.get_queryset()) # 设置分页 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="查询模板成功" )