82 lines
2.4 KiB
Python
82 lines
2.4 KiB
Python
from rest_framework import generics
|
|
from rest_framework.decorators import api_view, permission_classes
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.response import Response
|
|
from rest_framework.exceptions import PermissionDenied
|
|
from .models import Dictionary
|
|
from .serializers import DictionarySerializer
|
|
|
|
|
|
class DictionaryListView(generics.ListCreateAPIView):
|
|
"""
|
|
数据字典列表和创建视图
|
|
"""
|
|
serializer_class = DictionarySerializer
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get_queryset(self):
|
|
"""
|
|
支持按类型过滤
|
|
"""
|
|
queryset = Dictionary.objects.all()
|
|
|
|
# 支持按类型过滤
|
|
dict_type = self.request.query_params.get('type')
|
|
if dict_type:
|
|
queryset = queryset.filter(type=dict_type)
|
|
|
|
# 支持按名称搜索
|
|
name = self.request.query_params.get('name')
|
|
if name:
|
|
queryset = queryset.filter(name__icontains=name)
|
|
|
|
return queryset
|
|
|
|
def perform_create(self, serializer):
|
|
# 只有管理员可以创建字典
|
|
if self.request.user.role != 'admin':
|
|
raise PermissionDenied("只有管理员可以创建字典")
|
|
serializer.save()
|
|
|
|
|
|
class DictionaryDetailView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""
|
|
数据字典详情视图
|
|
"""
|
|
queryset = Dictionary.objects.all()
|
|
serializer_class = DictionarySerializer
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def perform_update(self, serializer):
|
|
# 只有管理员可以更新字典
|
|
if self.request.user.role != 'admin':
|
|
raise PermissionDenied("只有管理员可以更新字典")
|
|
serializer.save()
|
|
|
|
def perform_destroy(self, instance):
|
|
# 只有管理员可以删除字典
|
|
if self.request.user.role != 'admin':
|
|
raise PermissionDenied("只有管理员可以删除字典")
|
|
instance.delete()
|
|
|
|
|
|
@api_view(['GET'])
|
|
@permission_classes([IsAuthenticated])
|
|
def dictionary_grouped(request):
|
|
"""
|
|
获取分组的数据字典
|
|
"""
|
|
dict_types = Dictionary.objects.values('type').distinct()
|
|
|
|
result = []
|
|
for dict_type in dict_types:
|
|
type_name = dict_type['type']
|
|
items = Dictionary.objects.filter(type=type_name)
|
|
serializer = DictionarySerializer(items, many=True)
|
|
result.append({
|
|
'type': type_name,
|
|
'items': serializer.data
|
|
})
|
|
|
|
return Response(result)
|