增加小组成员管理的api;优化权限判断逻辑和精简代码

This commit is contained in:
virusdefender 2015-08-09 19:59:25 +08:00
parent a586aec451
commit c772a4bcdc
2 changed files with 71 additions and 12 deletions

View File

@ -1,7 +1,8 @@
# coding=utf-8 # coding=utf-8
from rest_framework import serializers from rest_framework import serializers
from .models import Group from account.serializers import UserSerializer
from .models import Group, UserGroupRelation
class CreateGroupSerializer(serializers.Serializer): class CreateGroupSerializer(serializers.Serializer):
@ -25,3 +26,16 @@ class GroupSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Group model = Group
exclude = ["members"] exclude = ["members"]
class GroupMemberSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = UserGroupRelation
exclude = ["id", "group"]
class EditGroupMemberSerializer(serializers.Serializer):
group_id = serializers.IntegerField()
members = serializers.ListField(child=serializers.IntegerField())

View File

@ -9,10 +9,34 @@ from account.decorators import login_required
from .models import Group, JoinGroupRequest, UserGroupRelation from .models import Group, JoinGroupRequest, UserGroupRelation
from .serializers import (CreateGroupSerializer, EditGroupSerializer, from .serializers import (CreateGroupSerializer, EditGroupSerializer,
JoinGroupRequestSerializer, GroupSerializer) JoinGroupRequestSerializer, GroupSerializer,
GroupMemberSerializer, EditGroupMemberSerializer)
class GroupAdminAPIView(APIView): class GroupAPIViewBase(object):
def get_group(request, group_id):
"""
根据group_id查询指定的小组的信息结合判断用户权限
管理员可以查询所有的小组其他用户查询自己创建的自傲组
"""
if request.user.admin_type == SUPER_ADMIN:
group = Group.object.get(id=group_id, visible=True)
else:
group = Group.object.get(id=group_id, visible=True, admin=request.user)
return group
def get_groups(request):
"""
如果是超级管理员就返回全部的小组
如果是管理员就返回他创建的全部小组
"""
if request.user.admin_type == SUPER_ADMIN:
groups = Group.objects.filter(visible=True)
else:
groups = Group.objects.filter(admin=request.user, visible=True)
class GroupAdminAPIView(APIView, GroupAPIViewBase):
def post(self, request): def post(self, request):
""" """
创建小组的api 创建小组的api
@ -40,7 +64,7 @@ class GroupAdminAPIView(APIView):
if serializer.is_valid(): if serializer.is_valid():
data = serializer.data data = serializer.data
try: try:
group = Group.objects.get(id=data["id"], admin=request.user) group = self.get_group(request, data["group_id"])
except Group.DoesNotExist: except Group.DoesNotExist:
return error_response(u"小组不存在") return error_response(u"小组不存在")
group.name = data["name"] group.name = data["name"]
@ -60,21 +84,41 @@ class GroupAdminAPIView(APIView):
group_id = request.GET.get("group_id", None) group_id = request.GET.get("group_id", None)
if group_id: if group_id:
try: try:
if request.user.admin_type == SUPER_ADMIN: group = self.get_group(request, group_id)
group = Group.object.get(id=group_id)
else:
group = Group.object.get(id=group_id, admin=request.user)
return success_response(GroupSerializer(group).data) return success_response(GroupSerializer(group).data)
except Group.DoesNotExist: except Group.DoesNotExist:
return error_response(u"小组不存在") return error_response(u"小组不存在")
else: else:
if request.user.admin_type == SUPER_ADMIN: groups = self.get_groups(request)
groups = Group.objects.filter(visible=True)
else:
groups = Group.objects.filter(admin=request.user, visible=True)
return paginate(request, groups, GroupSerializer) return paginate(request, groups, GroupSerializer)
class GroupMemberAdminAPIView(APIView, GroupAPIViewBase):
def get(self, request):
group_id = request.GET.get("group_id", None)
if not group_id:
return error_response(u"参数错误")
try:
group = self.get_group(request, group_id)
except Group.DoesNotExist:
return error_response(u"小组不存在")
return paginate(request, UserGroupRelation.objects.filter(group=group), GroupMemberSerializer)
def put(self, request):
serializer = EditGroupMemberSerializer(data=request.data)
if serializer.is_valid():
try:
group = self.get_group(request, group_id)
except Group.DoesNotExist:
return error_response(u"小组不存在")
user_id_list = serializer.data["members"]
UserGroupRelation.objects.delete(group=group, user__id__in=user_id_list)
return success_response(u"删除成功")
else:
return serializer_invalid_response(serializer)
def join_group(user, group): def join_group(user, group):
return UserGroupRelation.objects.create(user=user, group=group) return UserGroupRelation.objects.create(user=user, group=group)
@ -103,5 +147,6 @@ class JoinGroupAPIView(APIView):
keyword = request.GET.get("keyword", None) keyword = request.GET.get("keyword", None)
if not keyword: if not keyword:
return error_response(u"参数错误") return error_response(u"参数错误")
# 搜索包含这个关键词的 没有解散的 而且允许加入的小组
groups = Group.objects.filter(name__contains=keyword, visible=True, join_group_setting__lte=2) groups = Group.objects.filter(name__contains=keyword, visible=True, join_group_setting__lte=2)
return paginate(request, groups, GroupSerializer) return paginate(request, groups, GroupSerializer)