From 448c5db3bb95fb585cd269d7badd5c75b1d34795 Mon Sep 17 00:00:00 2001 From: xinwen Date: Fri, 6 Nov 2020 10:46:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(orgs):=20=E6=B7=BB=E5=8A=A0=E6=97=A7?= =?UTF-8?q?=E7=9A=84=20member=20=E7=9B=B8=E5=85=B3=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/orgs/api.py | 54 +++++++++++++++++++++++++++++++++++--- apps/orgs/serializers.py | 25 +++++++++++++++++- apps/orgs/urls/api_urls.py | 5 ++++ 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/apps/orgs/api.py b/apps/orgs/api.py index 8176405ac..ff3a38007 100644 --- a/apps/orgs/api.py +++ b/apps/orgs/api.py @@ -2,17 +2,17 @@ # from django.utils.translation import ugettext as _ -from django.db.models import Q from rest_framework import status from rest_framework.views import Response from rest_framework_bulk import BulkModelViewSet from common.permissions import IsSuperUserOrAppUser -from common.drf.api import JMSBulkRelationModelViewSet, JMSModelViewSet +from common.drf.api import JMSBulkRelationModelViewSet from .models import Organization, ROLE from .serializers import ( OrgSerializer, OrgReadSerializer, - OrgRetrieveSerializer, OrgMemberSerializer + OrgRetrieveSerializer, OrgMemberSerializer, + OrgMemberAdminSerializer, OrgMemberUserSerializer ) from users.models import User, UserGroup from assets.models import Asset, Domain, AdminUser, SystemUser, Label @@ -84,3 +84,51 @@ class OrgMemberRelationBulkViewSet(JMSBulkRelationModelViewSet): objs = list(queryset.all().prefetch_related('user', 'org')) queryset.delete() self.send_m2m_changed_signal(objs, action='post_remove') + + +class OrgMemberAdminRelationBulkViewSet(JMSBulkRelationModelViewSet): + permission_classes = (IsSuperUserOrAppUser,) + m2m_field = Organization.members.field + serializer_class = OrgMemberAdminSerializer + filterset_class = OrgMemberRelationFilterSet + search_fields = ('user__name', 'user__username', 'org__name') + + def get_queryset(self): + queryset = super().get_queryset() + org_id = self.kwargs.get('org_id') + queryset = queryset.filter(org_id=org_id, role=ROLE.ADMIN) + return queryset + + def perform_bulk_create(self, serializer): + data = serializer.validated_data + relations = [OrganizationMember(**i) for i in data] + OrganizationMember.objects.bulk_create(relations, ignore_conflicts=True) + + def perform_bulk_destroy(self, queryset): + objs = list(queryset.all().prefetch_related('user', 'org')) + queryset.delete() + self.send_m2m_changed_signal(objs, action='post_remove') + + +class OrgMemberUserRelationBulkViewSet(JMSBulkRelationModelViewSet): + permission_classes = (IsSuperUserOrAppUser,) + m2m_field = Organization.members.field + serializer_class = OrgMemberUserSerializer + filterset_class = OrgMemberRelationFilterSet + search_fields = ('user__name', 'user__username', 'org__name') + + def get_queryset(self): + queryset = super().get_queryset() + org_id = self.kwargs.get('org_id') + queryset = queryset.filter(org_id=org_id, role=ROLE.USER) + return queryset + + def perform_bulk_create(self, serializer): + data = serializer.validated_data + relations = [OrganizationMember(**i) for i in data] + OrganizationMember.objects.bulk_create(relations, ignore_conflicts=True) + + def perform_bulk_destroy(self, queryset): + objs = list(queryset.all().prefetch_related('user', 'org')) + queryset.delete() + self.send_m2m_changed_signal(objs, action='post_remove') diff --git a/apps/orgs/serializers.py b/apps/orgs/serializers.py index 36c529882..7a57b4fac 100644 --- a/apps/orgs/serializers.py +++ b/apps/orgs/serializers.py @@ -1,12 +1,13 @@ from django.db.models import F from rest_framework.serializers import ModelSerializer from rest_framework import serializers +from django.utils.translation import ugettext_lazy as _ from users.models.user import User from common.serializers import AdaptedBulkListSerializer from common.drf.serializers import BulkModelSerializer from common.db.models import concated_display as display -from .models import Organization, OrganizationMember +from .models import Organization, OrganizationMember, ROLE class OrgSerializer(ModelSerializer): @@ -73,6 +74,28 @@ class OrgMemberSerializer(BulkModelSerializer): ).distinct() +class OrgMemberAdminSerializer(BulkModelSerializer): + role = serializers.HiddenField(default=ROLE.ADMIN) + organization = serializers.PrimaryKeyRelatedField( + label=_('Organization'), queryset=Organization.objects.all(), required=True, source='org' + ) + + class Meta: + model = OrganizationMember + fields = ('id', 'organization', 'user', 'role') + + +class OrgMemberUserSerializer(BulkModelSerializer): + role = serializers.HiddenField(default=ROLE.USER) + organization = serializers.PrimaryKeyRelatedField( + label=_('Organization'), queryset=Organization.objects.all(), required=True, source='org' + ) + + class Meta: + model = OrganizationMember + fields = ('id', 'organization', 'user', 'role') + + class OrgRetrieveSerializer(OrgReadSerializer): admins = serializers.PrimaryKeyRelatedField(many=True, read_only=True) auditors = serializers.PrimaryKeyRelatedField(many=True, read_only=True) diff --git a/apps/orgs/urls/api_urls.py b/apps/orgs/urls/api_urls.py index 93192ef2a..d8533bb87 100644 --- a/apps/orgs/urls/api_urls.py +++ b/apps/orgs/urls/api_urls.py @@ -16,6 +16,11 @@ bulk_router = BulkRouter() router.register(r'orgs', api.OrgViewSet, 'org') bulk_router.register(r'org-member-relation', api.OrgMemberRelationBulkViewSet, 'org-member-relation') +router.register(r'orgs/(?P[0-9a-zA-Z\-]{36})/membership/admins', + api.OrgMemberAdminRelationBulkViewSet, 'membership-admins') +router.register(r'orgs/(?P[0-9a-zA-Z\-]{36})/membership/users', + api.OrgMemberUserRelationBulkViewSet, 'membership-users'), + old_version_urlpatterns = [ re_path('(?Porg)/.*', capi.redirect_plural_name_api) ]