90 lines
3.3 KiB
Python
90 lines
3.3 KiB
Python
# -*- coding: utf-8 -*-
|
||
from django.apps import apps
|
||
from rest_framework import serializers
|
||
from rest_framework.decorators import action
|
||
from rest_framework.permissions import IsAuthenticated
|
||
|
||
from dvadmin.system.models import Role, MenuField
|
||
from dvadmin.utils.models import get_custom_app_models
|
||
from dvadmin.utils.viewset import CustomModelViewSet
|
||
from dvadmin.utils.serializers import CustomModelSerializer
|
||
from dvadmin.utils.json_response import DetailResponse, ErrorResponse, SuccessResponse
|
||
|
||
|
||
class MenuFieldSerializer(CustomModelSerializer):
|
||
"""
|
||
列权限序列化器
|
||
"""
|
||
|
||
class Meta:
|
||
model = MenuField
|
||
fields = '__all__'
|
||
read_only_fields = ['id']
|
||
|
||
|
||
class MenuFieldViewSet(CustomModelViewSet):
|
||
"""
|
||
列权限视图集
|
||
"""
|
||
queryset = MenuField.objects.order_by('-model')
|
||
serializer_class = MenuFieldSerializer
|
||
|
||
def list(self, request, *args, **kwargs):
|
||
menu = request.query_params.get('menu')
|
||
if not menu:
|
||
return SuccessResponse([])
|
||
queryset = self.filter_queryset(self.get_queryset().filter(menu=menu))
|
||
serializer = self.get_serializer(queryset, many=True, request=request)
|
||
return SuccessResponse(data=serializer.data, msg="获取成功")
|
||
|
||
def create(self, request, *args, **kwargs):
|
||
payload = request.data
|
||
for model in apps.get_models():
|
||
if payload.get('model') == model.__name__:
|
||
break
|
||
else:
|
||
return ErrorResponse(msg='模型表不存在')
|
||
|
||
if MenuField.objects.filter(menu=payload.get('menu'),model=model.__name__, field_name=payload.get('field_name')).exists():
|
||
return ErrorResponse(msg='‘%s’ 字段权限已有,不可重复创建' % payload.get('title'))
|
||
|
||
return super().create(request, *args, **kwargs)
|
||
|
||
@action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])
|
||
def get_models(self, request):
|
||
"""获取所有项目app下的model"""
|
||
res = []
|
||
for model in get_custom_app_models():
|
||
res.append({
|
||
'app': model['app'],
|
||
'title': model['verbose'],
|
||
'key': model['model']
|
||
})
|
||
return DetailResponse(res)
|
||
|
||
@action(methods=['POST'], detail=False, permission_classes=[IsAuthenticated])
|
||
def auto_match_fields(self, request):
|
||
"""自动匹配已有的字段"""
|
||
menu_id = request.data.get('menu')
|
||
model_name = request.data.get('model')
|
||
if not menu_id or not model_name:
|
||
return ErrorResponse( msg='参数错误')
|
||
for model in get_custom_app_models():
|
||
if model['model'] != model_name:
|
||
continue
|
||
for field in model['fields']:
|
||
if MenuField.objects.filter(
|
||
menu_id=menu_id, model=model_name, field_name=field['name']
|
||
).exists():
|
||
continue
|
||
data = {
|
||
'menu': menu_id,
|
||
'model': model_name,
|
||
'field_name': field['name'],
|
||
'title': str(field['title']),
|
||
}
|
||
serializer = self.get_serializer(data=data, request=request)
|
||
serializer.is_valid(raise_exception=True)
|
||
serializer.save()
|
||
return SuccessResponse(msg='匹配成功')
|