指定查询分类
This commit is contained in:
parent
89d5eb0686
commit
cc8c409f19
|
|
@ -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
|
||||
|
|
@ -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格式')
|
||||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
|||
Loading…
Reference in New Issue