指定查询分类
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_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格式')
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue