From ba695c4600089f1fdba420b52a525d8deb848a41 Mon Sep 17 00:00:00 2001 From: Michael Bai Date: Thu, 13 Jan 2022 18:32:12 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=8A=BD=E8=B1=A1permissions-serializer?= =?UTF-8?q?=E7=9A=84actions=E5=AD=97=E6=AE=B5=E5=80=BC=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serializers/application/permission.py | 17 ++++----------- apps/perms/serializers/asset/permission.py | 4 ++-- apps/perms/serializers/base.py | 21 ++++++++++++++++++- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/apps/perms/serializers/application/permission.py b/apps/perms/serializers/application/permission.py index 1df5b1eca..f3e6443a0 100644 --- a/apps/perms/serializers/application/permission.py +++ b/apps/perms/serializers/application/permission.py @@ -6,14 +6,14 @@ from django.utils.translation import ugettext_lazy as _ from orgs.mixins.serializers import BulkOrgResourceModelSerializer from perms.models import ApplicationPermission -from ..base import ActionsField +from ..base import ActionsField, BasePermissionSerializer __all__ = [ 'ApplicationPermissionSerializer' ] -class ApplicationPermissionSerializer(BulkOrgResourceModelSerializer): +class ApplicationPermissionSerializer(BasePermissionSerializer): actions = ActionsField(required=False, allow_null=True, label=_("Actions")) category_display = serializers.ReadOnlyField(source='get_category_display', label=_('Category display')) type_display = serializers.ReadOnlyField(source='get_type_display', label=_('Type display')) @@ -46,15 +46,7 @@ class ApplicationPermissionSerializer(BulkOrgResourceModelSerializer): 'applications_amount': {'label': _('Applications amount')}, } - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.set_actions_choices() - - def set_actions_choices(self): - actions = self.fields.get('actions') - if not actions: - return - choices = actions._choices + def _filter_actions_choices(self, choices): if request := self.context.get('request'): category = request.query_params.get('category') else: @@ -62,8 +54,7 @@ class ApplicationPermissionSerializer(BulkOrgResourceModelSerializer): exclude_choices = ApplicationPermission.get_exclude_actions_choices(category=category) for choice in exclude_choices: choices.pop(choice, None) - actions._choices = choices - actions.default = list(choices.keys()) + return choices @classmethod def setup_eager_loading(cls, queryset): diff --git a/apps/perms/serializers/asset/permission.py b/apps/perms/serializers/asset/permission.py index 0b0d5aaa6..cd6c24723 100644 --- a/apps/perms/serializers/asset/permission.py +++ b/apps/perms/serializers/asset/permission.py @@ -9,12 +9,12 @@ from orgs.mixins.serializers import BulkOrgResourceModelSerializer from perms.models import AssetPermission, Action from assets.models import Asset, Node, SystemUser from users.models import User, UserGroup -from ..base import ActionsField +from ..base import ActionsField, BasePermissionSerializer __all__ = ['AssetPermissionSerializer'] -class AssetPermissionSerializer(BulkOrgResourceModelSerializer): +class AssetPermissionSerializer(BasePermissionSerializer): actions = ActionsField(required=False, allow_null=True, label=_("Actions")) is_valid = serializers.BooleanField(read_only=True, label=_("Is valid")) is_expired = serializers.BooleanField(read_only=True, label=_('Is expired')) diff --git a/apps/perms/serializers/base.py b/apps/perms/serializers/base.py index 7e8e1b63f..81707dbd1 100644 --- a/apps/perms/serializers/base.py +++ b/apps/perms/serializers/base.py @@ -1,7 +1,8 @@ from rest_framework import serializers from perms.models import Action +from orgs.mixins.serializers import BulkOrgResourceModelSerializer -__all__ = ['ActionsDisplayField', 'ActionsField'] +__all__ = ['ActionsDisplayField', 'ActionsField', 'BasePermissionSerializer'] class ActionsField(serializers.MultipleChoiceField): @@ -24,3 +25,21 @@ class ActionsDisplayField(ActionsField): choices = dict(Action.CHOICES) return [choices.get(i) for i in values] + +class BasePermissionSerializer(BulkOrgResourceModelSerializer): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.set_actions_field() + + def set_actions_field(self): + actions = self.fields.get('actions') + if not actions: + return + choices = actions._choices + choices = self._filter_actions_choices(choices) + actions._choices = choices + actions.default = list(choices.keys()) + + def _filter_actions_choices(self, choices): + return choices