def update(self, instance, validated_data): # 验证服部门父部门不能为其本身或其子部门 departments_id = get_child_ids(instance.id, Departments) if validated_data.get('pid') and validated_data.get( 'pid').id in departments_id: raise serializers.ValidationError('父部门不能为其本身或其子部门') return super().update(instance, validated_data)
def update(self, instance, validated_data): if validated_data.get('menu') is False: if Permissions.objects.filter(pid=instance.id, menu=True): raise serializers.ValidationError('菜单权限存在子菜单, 请先修改子菜单') if validated_data.get('pid'): if Permissions.objects.filter(id=validated_data.get('pid').id, menu=False): raise serializers.ValidationError('菜单父权限必须为菜单权限') permissions_id = get_child_ids(instance.id, Permissions) if validated_data.get('pid').id in permissions_id: raise serializers.ValidationError('父权限不能为其本身或其子权限') return super().update(instance, validated_data)
def get_queryset(self, **kwargs): # 解决drf-yasg加载报错 if isinstance(self.request.user, AnonymousUser): return Assets.objects.none() asset_type = kwargs.get('asset_type') assert asset_type is not None, '关键字参数asset_type, 为必传参数' assert asset_type in [ values[0] for values in Assets.asset_type_choice ], 'asset_type应存在与Assets.asset_type_choice' # 管理员角色用户可查看所有 if {'name': 'admin'} in self.request.user.roles.values('name'): return Assets.objects.filter(asset_type=asset_type) # 每个用户只能查看到所属部门及其子部门下的服务器, 及该用户管理服务器 if self.request.user.department: departments = get_child_ids(self.request.user.department.id, Departments) return (Assets.objects.filter(asset_type=asset_type).filter( Q(department__in=departments) | Q(admin=self.request.user))).distinct() else: return Assets.objects.filter(asset_type=asset_type, admin=self.request.user)
def department_service_filter(self, queryset, name, value): """过滤该部门及所有子部门下的用户""" return queryset.filter(department_id__in=get_child_ids(value, Departments))