指定查询分类

This commit is contained in:
caoqianming 2021-09-30 09:32:58 +08:00
parent 89d5eb0686
commit cc8c409f19
4 changed files with 39 additions and 18 deletions

View File

@ -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

View File

@ -149,6 +149,13 @@ class Ticket(CommonAModel):
(TICKET_ACT_STATE_FINISH, '已完成'), (TICKET_ACT_STATE_FINISH, '已完成'),
(TICKET_ACT_STATE_CLOSED, '已关闭') (TICKET_ACT_STATE_CLOSED, '已关闭')
) )
category_choices =(
('all', '全部'),
('owner', '我创建的'),
('duty', '代办'),
('worked', '我处理的'),
('relation', '抄送我的')
)
title = models.CharField('标题', max_length=500, blank=True, default='', help_text="工单标题") title = models.CharField('标题', max_length=500, blank=True, default='', help_text="工单标题")
workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, verbose_name='关联工作流') workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, verbose_name='关联工作流')
sn = models.CharField('流水号', max_length=25, help_text="工单的流水号") 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) 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) 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_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) 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格式') ticket_data = models.JSONField('工单数据', default=dict, blank=True, help_text='可以用于记录当前表单数据json格式')

View File

@ -23,7 +23,7 @@ class WorkflowSimpleSerializer(serializers.ModelSerializer):
class StateSimpleSerializer(serializers.ModelSerializer): class StateSimpleSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = State model = State
fields = ['id', 'name', 'type'] fields = ['id', 'name', 'type', 'distribute_type']
class TransitionSerializer(serializers.ModelSerializer): class TransitionSerializer(serializers.ModelSerializer):
source_state_ = StateSimpleSerializer(source='source_state', read_only=True) source_state_ = StateSimpleSerializer(source='source_state', read_only=True)
@ -77,7 +77,7 @@ class TicketListSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Ticket 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 @staticmethod
def setup_eager_loading(queryset): def setup_eager_loading(queryset):

View File

@ -1,3 +1,4 @@
from apps.wf.filters import TicketFilterSet
from django.core.exceptions import AppRegistryNotReady from django.core.exceptions import AppRegistryNotReady
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import serializers from rest_framework import serializers
@ -93,7 +94,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin
queryset = Ticket.objects.all() queryset = Ticket.objects.all()
serializer_class = TicketSerializer serializer_class = TicketSerializer
search_fields = ['title'] search_fields = ['title']
filterset_fields = ['workflow', 'state'] filterset_class = TicketFilterSet
ordering = ['-create_time'] ordering = ['-create_time']
def get_serializer_class(self): def get_serializer_class(self):
@ -106,20 +107,11 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin
elif self.action == 'retrieve': elif self.action == 'retrieve':
return TicketDetailSerializer return TicketDetailSerializer
return super().get_serializer_class() 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): def create(self, request, *args, **kwargs):
""" """