From cc8c409f190b062fb9df7bbc91edef4ebd6bfc5c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 30 Sep 2021 09:32:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=87=E5=AE=9A=E6=9F=A5=E8=AF=A2=E5=88=86?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wf/filters.py | 22 ++++++++++++++++++++++ hb_server/apps/wf/models.py | 11 +++++++++-- hb_server/apps/wf/serializers.py | 4 ++-- hb_server/apps/wf/views.py | 20 ++++++-------------- 4 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 hb_server/apps/wf/filters.py diff --git a/hb_server/apps/wf/filters.py b/hb_server/apps/wf/filters.py new file mode 100644 index 0000000..0fbde88 --- /dev/null +++ b/hb_server/apps/wf/filters.py @@ -0,0 +1,22 @@ +from django_filters import rest_framework as filters +from .models import Ticket +class TicketFilterSet(filters.FilterSet): + start_create = filters.DateFilter(field_name="create_time", lookup_expr='gte') + end_create = filters.DateFilter(field_name="create_time", lookup_expr='lte') + category = filters.ChoiceFilter(choices = Ticket.category_choices, method='filter_category') + + class Meta: + model = Ticket + fields = ['workflow', 'state', 'act_state', 'start_create', 'end_create', 'category'] + + def filter_category(self, queryset, name, value): + user=self.request.user + if value == 'owner': + queryset = queryset.filter(create_by=user) + elif value == 'duty': + queryset = queryset.filter(participant__contains=user.id).exclude(act_state__in=[Ticket.TICKET_ACT_STATE_FINISH, Ticket.TICKET_ACT_STATE_CLOSED]) + elif value == 'worked': + queryset = queryset.filter(ticketflow_ticket__participant=user).exclude(create_by=user) + else: + queryset = queryset.none() + return queryset \ No newline at end of file diff --git a/hb_server/apps/wf/models.py b/hb_server/apps/wf/models.py index a665d04..8328153 100644 --- a/hb_server/apps/wf/models.py +++ b/hb_server/apps/wf/models.py @@ -149,6 +149,13 @@ class Ticket(CommonAModel): (TICKET_ACT_STATE_FINISH, '已完成'), (TICKET_ACT_STATE_CLOSED, '已关闭') ) + category_choices =( + ('all', '全部'), + ('owner', '我创建的'), + ('duty', '代办'), + ('worked', '我处理的'), + ('relation', '抄送我的') + ) title = models.CharField('标题', max_length=500, blank=True, default='', help_text="工单标题") workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, verbose_name='关联工作流') sn = models.CharField('流水号', max_length=25, help_text="工单的流水号") @@ -168,10 +175,10 @@ class TicketFlow(BaseModel): """ 工单流转日志 """ - ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE, verbose_name='关联工单') + ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE, verbose_name='关联工单', related_name='ticketflow_ticket') transition = models.ForeignKey(Transition, verbose_name='流转id', help_text='与worklow.Transition关联, 为0时表示认为干预的操作', on_delete=models.CASCADE, null=True, blank=True) suggestion = models.CharField('处理意见', max_length=10000, default='', blank=True) participant_type = models.IntegerField('处理人类型', default=0, help_text='0.无处理人,1.个人,2.多人', choices=State.type2_choices) - participant = models.ForeignKey(User, verbose_name='处理人', on_delete=models.SET_NULL, null=True, blank=True) + participant = models.ForeignKey(User, verbose_name='处理人', on_delete=models.SET_NULL, null=True, blank=True, related_name='ticketflow_participant') state = models.ForeignKey(State, verbose_name='当前状态', default=0, blank=True, on_delete=models.CASCADE) ticket_data = models.JSONField('工单数据', default=dict, blank=True, help_text='可以用于记录当前表单数据,json格式') \ No newline at end of file diff --git a/hb_server/apps/wf/serializers.py b/hb_server/apps/wf/serializers.py index 84c7862..8df3742 100644 --- a/hb_server/apps/wf/serializers.py +++ b/hb_server/apps/wf/serializers.py @@ -23,7 +23,7 @@ class WorkflowSimpleSerializer(serializers.ModelSerializer): class StateSimpleSerializer(serializers.ModelSerializer): class Meta: model = State - fields = ['id', 'name', 'type'] + fields = ['id', 'name', 'type', 'distribute_type'] class TransitionSerializer(serializers.ModelSerializer): source_state_ = StateSimpleSerializer(source='source_state', read_only=True) @@ -77,7 +77,7 @@ class TicketListSerializer(serializers.ModelSerializer): class Meta: model = Ticket - fields = ['id', 'title', 'sn', 'workflow', 'workflow_', 'state', 'state_', 'act_state', 'distribute_type'] + fields = ['id', 'title', 'sn', 'workflow', 'workflow_', 'state', 'state_', 'act_state'] @staticmethod def setup_eager_loading(queryset): diff --git a/hb_server/apps/wf/views.py b/hb_server/apps/wf/views.py index efe8077..4a00884 100644 --- a/hb_server/apps/wf/views.py +++ b/hb_server/apps/wf/views.py @@ -1,3 +1,4 @@ +from apps.wf.filters import TicketFilterSet from django.core.exceptions import AppRegistryNotReady from rest_framework.response import Response from rest_framework import serializers @@ -93,7 +94,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin queryset = Ticket.objects.all() serializer_class = TicketSerializer search_fields = ['title'] - filterset_fields = ['workflow', 'state'] + filterset_class = TicketFilterSet ordering = ['-create_time'] def get_serializer_class(self): @@ -106,20 +107,11 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin elif self.action == 'retrieve': return TicketDetailSerializer return super().get_serializer_class() - - def list(self, request, *args, **kwargs): - category = request.query_params.get('category', None) - if category and category in ['all', 'owner', 'duty', 'worked', 'relation']: - user = request.user - if category == 'owner': - self.queryset = Ticket.objects.filter(create_by=user) - elif category == 'duty': - self.queryset = Ticket.objects.filter(participant__contains=user.id).exclude(act_state__in=[Ticket.TICKET_ACT_STATE_FINISH, Ticket.TICKET_ACT_STATE_CLOSED]) - - else: - raise APIException('查询分类错误') - return super().list(request, *args, **kwargs) + def get_queryset(self): + if self.action=='list' and (not self.request.query_params.get('category', None)): + raise APIException('请指定查询分类') + return super().get_queryset() def create(self, request, *args, **kwargs): """