dept.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: Allen
  4. @Remark: 部门管理
  5. """
  6. from rest_framework import serializers
  7. from rest_framework.decorators import action
  8. from dvadmin.system.models import Dept
  9. from dvadmin.utils.json_response import DetailResponse, SuccessResponse
  10. from dvadmin.utils.permission import AnonymousUserPermission
  11. from dvadmin.utils.serializers import CustomModelSerializer
  12. from dvadmin.utils.viewset import CustomModelViewSet
  13. from dvadmin.utils.filters import LazyLoadFilter
  14. class DeptSerializer(CustomModelSerializer):
  15. """
  16. 部门-序列化器
  17. """
  18. parent_name = serializers.CharField(read_only=True, source='parent.name')
  19. status_label = serializers.SerializerMethodField()
  20. has_children = serializers.SerializerMethodField()
  21. hasChild = serializers.SerializerMethodField()
  22. def get_hasChild(self, instance):
  23. hasChild = Dept.objects.filter(parent=instance.id)
  24. if hasChild:
  25. return True
  26. return False
  27. def get_status_label(self, obj: Dept):
  28. if obj.status:
  29. return "启用"
  30. return "禁用"
  31. def get_has_children(self, obj: Dept):
  32. return Dept.objects.filter(parent_id=obj.id).count()
  33. class Meta:
  34. model = Dept
  35. fields = '__all__'
  36. read_only_fields = ["id"]
  37. class DeptImportSerializer(CustomModelSerializer):
  38. """
  39. 部门-导入-序列化器
  40. """
  41. class Meta:
  42. model = Dept
  43. fields = '__all__'
  44. read_only_fields = ["id"]
  45. class DeptInitSerializer(CustomModelSerializer):
  46. """
  47. 递归深度获取数信息(用于生成初始化json文件)
  48. """
  49. children = serializers.SerializerMethodField()
  50. def get_children(self, obj: Dept):
  51. data = []
  52. instance = Dept.objects.filter(parent_id=obj.id)
  53. if instance:
  54. serializer = DeptInitSerializer(instance=instance, many=True)
  55. data = serializer.data
  56. return data
  57. def save(self, **kwargs):
  58. instance = super().save(**kwargs)
  59. children = self.initial_data.get('children')
  60. if children:
  61. for menu_data in children:
  62. menu_data['parent'] = instance.id
  63. filter_data = {
  64. "name": menu_data['name'],
  65. "parent": menu_data['parent']
  66. }
  67. if 'key' in menu_data:
  68. filter_data['key'] = menu_data['key']
  69. instance_obj = Dept.objects.filter(**filter_data).first()
  70. if instance_obj and not self.initial_data.get('reset'):
  71. continue
  72. serializer = DeptInitSerializer(instance_obj, data=menu_data, request=self.request)
  73. serializer.is_valid(raise_exception=True)
  74. serializer.save()
  75. return instance
  76. class Meta:
  77. model = Dept
  78. fields = ['name', 'sort', 'owner', 'phone', 'email', 'status', 'parent', 'creator', 'dept_belong_id',
  79. 'children', 'key']
  80. extra_kwargs = {
  81. 'creator': {'write_only': True},
  82. 'dept_belong_id': {'write_only': True}
  83. }
  84. read_only_fields = ['id', 'children']
  85. class DeptCreateUpdateSerializer(CustomModelSerializer):
  86. """
  87. 部门管理 创建/更新时的列化器
  88. """
  89. def create(self, validated_data):
  90. value = validated_data.get('parent', None)
  91. if value is None:
  92. validated_data['parent'] = self.request.user.dept
  93. instance = super().create(validated_data)
  94. instance.dept_belong_id = instance.id
  95. instance.save()
  96. return instance
  97. class Meta:
  98. model = Dept
  99. fields = '__all__'
  100. class DeptLazyFilter(LazyLoadFilter):
  101. class Meta:
  102. model = Dept
  103. fields = ['name', 'parent', 'status']
  104. class DeptViewSet(CustomModelViewSet):
  105. """
  106. 部门管理接口
  107. list:查询
  108. create:新增
  109. update:修改
  110. retrieve:单例
  111. destroy:删除
  112. """
  113. queryset = Dept.objects.all()
  114. serializer_class = DeptSerializer
  115. create_serializer_class = DeptCreateUpdateSerializer
  116. update_serializer_class = DeptCreateUpdateSerializer
  117. # filter_fields = ["name", "id", "parent"]
  118. filter_class = DeptLazyFilter
  119. search_fields = []
  120. # extra_filter_backends = []
  121. import_serializer_class = DeptImportSerializer
  122. import_field_dict = {
  123. "name": "部门名称",
  124. "key": "部门标识",
  125. }
  126. def list(self, request, *args, **kwargs):
  127. # 如果懒加载,则只返回父级
  128. params = request.query_params
  129. parent = params.get('parent', None)
  130. if params:
  131. if parent:
  132. queryset = self.queryset.filter(parent=parent)
  133. else:
  134. queryset = self.queryset.filter(parent__isnull=True)
  135. else:
  136. queryset = self.queryset.filter(parent__isnull=True)
  137. queryset = self.filter_queryset(queryset.order_by('sort', 'create_datetime'))
  138. serializer = DeptSerializer(queryset, many=True, request=request)
  139. data = serializer.data
  140. return SuccessResponse(data=data)
  141. def dept_lazy_tree(self, request, *args, **kwargs):
  142. parent = self.request.query_params.get('parent')
  143. is_superuser = request.user.is_superuser
  144. if is_superuser:
  145. queryset = Dept.objects.values('id', 'name', 'parent')
  146. else:
  147. data_range = request.user.role.values_list('data_range', flat=True)
  148. user_dept_id = request.user.dept.id
  149. dept_list = [user_dept_id]
  150. data_range_list = list(set(data_range))
  151. for item in data_range_list:
  152. if item in [0, 2]:
  153. dept_list = [user_dept_id]
  154. elif item == 1:
  155. dept_list = Dept.recursion_dept_info(dept_id=user_dept_id)
  156. elif item == 3:
  157. dept_list = Dept.objects.values_list('id', flat=True)
  158. elif item == 4:
  159. dept_list = request.user.role.values_list('dept', flat=True)
  160. else:
  161. dept_list = []
  162. queryset = Dept.objects.filter(id__in=dept_list).values('id', 'name', 'parent')
  163. return DetailResponse(data=queryset, msg="获取成功")
  164. @action(methods=["GET"], detail=False, permission_classes=[AnonymousUserPermission])
  165. def all_dept(self, request, *args, **kwargs):
  166. queryset = self.filter_queryset(self.get_queryset())
  167. data = queryset.filter(status=True).order_by('sort').values('name', 'id', 'parent')
  168. return DetailResponse(data=data, msg="获取成功")
  169. @action(methods=["GET"], detail=False, permission_classes=[AnonymousUserPermission])
  170. def all_dept_not_extra(self, request, *args, **kwargs):
  171. self.extra_filter_backends = []
  172. queryset = self.filter_queryset(self.get_queryset())
  173. data = queryset.filter(status=True).order_by('sort').values('name', 'id', 'parent')
  174. return DetailResponse(data=data, msg="获取成功")