menu_button.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: Allen
  4. @Created on: 2023/10/18
  5. @Remark: 菜单按钮管理
  6. """
  7. from django.db.models import F, CharField, Value, ExpressionWrapper
  8. from django.db.models.functions import Cast, Concat
  9. from rest_framework.decorators import action
  10. from dvadmin.system.models import MenuButton, Menu
  11. from dvadmin.utils.json_response import DetailResponse
  12. from dvadmin.utils.serializers import CustomModelSerializer
  13. from dvadmin.utils.viewset import CustomModelViewSet
  14. class MenuButtonSerializer(CustomModelSerializer):
  15. """
  16. 菜单按钮-序列化器
  17. """
  18. class Meta:
  19. model = MenuButton
  20. fields = ["id", "name", "value", "api", "method", "menu"]
  21. read_only_fields = ["id"]
  22. class MenuButtonInitSerializer(CustomModelSerializer):
  23. """
  24. 初始化菜单按钮-序列化器
  25. """
  26. class Meta:
  27. model = MenuButton
  28. fields = ["id", "name", "value", "api", "method", "menu"]
  29. read_only_fields = ["id"]
  30. class MenuButtonCreateUpdateSerializer(CustomModelSerializer):
  31. """
  32. 初始化菜单按钮-序列化器
  33. """
  34. class Meta:
  35. model = MenuButton
  36. fields = "__all__"
  37. read_only_fields = ["id"]
  38. class MenuButtonViewSet(CustomModelViewSet):
  39. """
  40. 菜单按钮接口
  41. list:查询
  42. create:新增
  43. update:修改
  44. retrieve:单例
  45. destroy:删除
  46. """
  47. queryset = MenuButton.objects.all()
  48. serializer_class = MenuButtonSerializer
  49. create_serializer_class = MenuButtonCreateUpdateSerializer
  50. update_serializer_class = MenuButtonCreateUpdateSerializer
  51. extra_filter_backends = []
  52. @action(methods=["GET"], detail=False, permission_classes=[])
  53. def get_btn_permission(self, request):
  54. """
  55. 获取当前用户的按钮权限
  56. """
  57. user = request.user
  58. if not user.is_superuser:
  59. menuIds = user.role.values_list("menu__id", flat=True)
  60. else:
  61. menuIds = Menu.objects.filter(status=1)
  62. queryset = (
  63. MenuButton.objects.filter(menu__in=menuIds)
  64. .annotate(permission=Concat("menu__web_path", Value(":"), "value", output_field=CharField()))
  65. .values_list("permission", flat=True)
  66. )
  67. return DetailResponse(data=queryset)