mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.8 KiB
96 lines
2.8 KiB
# -*- coding: utf-8 -*-
|
|
#
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from rest_framework import serializers
|
|
|
|
from ..exceptions import (
|
|
TicketClosed, OnlyTicketAssigneeCanOperate,
|
|
TicketCanNotOperate
|
|
)
|
|
from ..models import Ticket, Comment
|
|
|
|
__all__ = ['TicketSerializer', 'CommentSerializer']
|
|
|
|
|
|
class TicketSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Ticket
|
|
fields = [
|
|
'id', 'user', 'user_display', 'title', 'body',
|
|
'assignees', 'assignees_display', 'assignee', 'assignee_display',
|
|
'status', 'action', 'date_created', 'date_updated',
|
|
'type', 'type_display', 'action_display',
|
|
]
|
|
read_only_fields = [
|
|
'user_display', 'assignees_display',
|
|
'date_created', 'date_updated',
|
|
]
|
|
extra_kwargs = {
|
|
'status': {'label': _('Status')},
|
|
'action': {'label': _('Action')},
|
|
'user_display': {'label': _('User')}
|
|
}
|
|
|
|
def create(self, validated_data):
|
|
validated_data.pop('action')
|
|
return super().create(validated_data)
|
|
|
|
def update(self, instance, validated_data):
|
|
action = validated_data.get('action')
|
|
user = self.context['request'].user
|
|
|
|
if instance.type not in (Ticket.TYPE.GENERAL,
|
|
Ticket.TYPE.LOGIN_CONFIRM):
|
|
# 暂时的兼容操作吧,后期重构工单
|
|
raise TicketCanNotOperate
|
|
|
|
if instance.status == instance.STATUS.CLOSED:
|
|
raise TicketClosed
|
|
|
|
if action:
|
|
if user not in instance.assignees.all():
|
|
raise OnlyTicketAssigneeCanOperate
|
|
|
|
# 有 `action` 时忽略 `status`
|
|
validated_data.pop('status', None)
|
|
|
|
instance = super().update(instance, validated_data)
|
|
if not instance.status == instance.STATUS.CLOSED and action:
|
|
instance.perform_action(action, user)
|
|
else:
|
|
status = validated_data.get('status')
|
|
instance = super().update(instance, validated_data)
|
|
if status:
|
|
instance.perform_status(status, user)
|
|
|
|
return instance
|
|
|
|
|
|
class CurrentTicket(object):
|
|
ticket = None
|
|
|
|
def set_context(self, serializer_field):
|
|
self.ticket = serializer_field.context['ticket']
|
|
|
|
def __call__(self):
|
|
return self.ticket
|
|
|
|
|
|
class CommentSerializer(serializers.ModelSerializer):
|
|
user = serializers.HiddenField(
|
|
default=serializers.CurrentUserDefault(),
|
|
)
|
|
ticket = serializers.HiddenField(
|
|
default=CurrentTicket()
|
|
)
|
|
|
|
class Meta:
|
|
model = Comment
|
|
fields = [
|
|
'id', 'ticket', 'body', 'user', 'user_display',
|
|
'date_created', 'date_updated'
|
|
]
|
|
read_only_fields = [
|
|
'user_display', 'date_created', 'date_updated'
|
|
]
|