增加小组管理功能

This commit is contained in:
virusdefender
2015-08-11 19:14:41 +08:00
parent eda566c1a2
commit 6284638b49
5 changed files with 139 additions and 11 deletions

View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('group', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='group',
name='name',
field=models.CharField(unique=True, max_length=30),
),
migrations.AlterField(
model_name='joingrouprequest',
name='group',
field=models.ForeignKey(to='group.Group'),
),
migrations.AlterUniqueTogether(
name='usergrouprelation',
unique_together=set([('group', 'user')]),
),
]

View File

@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('group', '0002_auto_20150811_1456'),
]
operations = [
migrations.AlterField(
model_name='group',
name='join_group_setting',
field=models.IntegerField(default=1),
),
]

View File

@@ -10,7 +10,7 @@ class Group(models.Model):
create_time = models.DateTimeField(auto_now_add=True) create_time = models.DateTimeField(auto_now_add=True)
admin = models.ForeignKey(User, related_name="my_groups") admin = models.ForeignKey(User, related_name="my_groups")
# 0是公开 1是需要申请后加入 2是不允许任何人加入 # 0是公开 1是需要申请后加入 2是不允许任何人加入
join_group_setting = models.IntegerField() join_group_setting = models.IntegerField(default=1)
members = models.ManyToManyField(User, through="UserGroupRelation") members = models.ManyToManyField(User, through="UserGroupRelation")
# 解散小组后这一项改为False # 解散小组后这一项改为False
visible = models.BooleanField(default=True) visible = models.BooleanField(default=True)

View File

@@ -1,8 +1,9 @@
# coding=utf-8 # coding=utf-8
from rest_framework import serializers from rest_framework import serializers
from account.models import User
from account.serializers import UserSerializer from account.serializers import UserSerializer
from .models import Group, UserGroupRelation from .models import Group, UserGroupRelation, JoinGroupRequest
class CreateGroupSerializer(serializers.Serializer): class CreateGroupSerializer(serializers.Serializer):
@@ -18,25 +19,58 @@ class EditGroupSerializer(serializers.Serializer):
join_group_setting = serializers.IntegerField() join_group_setting = serializers.IntegerField()
class JoinGroupRequestSerializer(serializers.Serializer): class CreateJoinGroupRequestSerializer(serializers.Serializer):
group_id = serializers.IntegerField() group_id = serializers.IntegerField()
message = serializers.CharField(max_length=30) message = serializers.CharField(max_length=30)
class JoinGroupRequestSerializer(serializers.ModelSerializer):
class GroupSerializer(serializers.ModelSerializer): class GroupSerializer(serializers.ModelSerializer):
class Meta:
model = Group
fields = ["id", "name"]
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ["username"]
group = GroupSerializer()
user = UserSerializer()
class Meta:
model = JoinGroupRequest
class GroupSerializer(serializers.ModelSerializer):
members_number = serializers.SerializerMethodField("_get_group_members_number")
def _get_group_members_number(self, group):
return group.members.all().count()
class Meta: class Meta:
model = Group model = Group
exclude = ["members"] exclude = ["members"]
class GroupMemberSerializer(serializers.ModelSerializer): class GroupMemberSerializer(serializers.ModelSerializer):
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ["id", "username", "real_name"]
user = UserSerializer() user = UserSerializer()
class Meta: class Meta:
model = UserGroupRelation model = UserGroupRelation
exclude = ["id", "group"] exclude = ["id"]
class EditGroupMemberSerializer(serializers.Serializer): class EditGroupMemberSerializer(serializers.Serializer):
group_id = serializers.IntegerField() group_id = serializers.IntegerField()
members = serializers.ListField(child=serializers.IntegerField()) members = serializers.ListField(child=serializers.IntegerField())
class PutJoinGroupRequestSerializer(serializers.Serializer):
request_id = serializers.IntegerField()
status = serializers.BooleanField()

View File

@@ -10,8 +10,9 @@ 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, CreateJoinGroupRequestSerializer, GroupSerializer,
GroupMemberSerializer, EditGroupMemberSerializer) GroupMemberSerializer, EditGroupMemberSerializer,
JoinGroupRequestSerializer, PutJoinGroupRequestSerializer)
class GroupAPIViewBase(object): class GroupAPIViewBase(object):
@@ -101,6 +102,8 @@ class GroupAdminAPIView(APIView, GroupAPIViewBase):
return error_response(u"小组不存在") return error_response(u"小组不存在")
else: else:
groups = self.get_groups(request) groups = self.get_groups(request)
if request.GET.get("keyword", None):
groups = groups.filter(name__contains=request.GET["keyword"])
return paginate(request, groups, GroupSerializer) return paginate(request, groups, GroupSerializer)
@@ -149,14 +152,14 @@ def join_group(user, group):
class JoinGroupAPIView(APIView): class JoinGroupAPIView(APIView):
@login_required # @login_required
def post(self, request): def post(self, request):
""" """
加入某个小组的api 加入某个小组的api
--- ---
request_serializer: JoinGroupRequestSerializer request_serializer: CreateJoinGroupRequestSerializer
""" """
serializer = JoinGroupRequestSerializer(data=request.data) serializer = CreateJoinGroupRequestSerializer(data=request.data)
if serializer.is_valid(): if serializer.is_valid():
data = serializer.data data = serializer.data
try: try:
@@ -169,6 +172,10 @@ class JoinGroupAPIView(APIView):
else: else:
return error_response(u"你已经是小组成员了") return error_response(u"你已经是小组成员了")
elif group.join_group_setting == 1: elif group.join_group_setting == 1:
try:
JoinGroupRequest.objects.get(user=request.user, group=group, status=False)
return error_response(u"你已经提交过申请了,请等待审核")
except JoinGroupRequest.DoesNotExist:
JoinGroupRequest.objects.create(user=request.user, group=group, message=data["message"]) JoinGroupRequest.objects.create(user=request.user, group=group, message=data["message"])
return success_response(u"申请提交成功,请等待审核") return success_response(u"申请提交成功,请等待审核")
elif group.join_group_setting == 2: elif group.join_group_setting == 2:
@@ -188,3 +195,43 @@ class JoinGroupAPIView(APIView):
# 搜索包含这个关键词的 没有解散的 而且允许加入的小组 # 搜索包含这个关键词的 没有解散的 而且允许加入的小组
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)
class JoinGroupRequestAdminAPIView(APIView, GroupAPIViewBase):
def get(self, request):
"""
返回管理的群的加群请求
---
response_serializer: JoinGroupRequestSerializer
"""
requests = JoinGroupRequest.objects.filter(group=Group.objects.filter(admin=request.user, visible=True),
status=False)
return paginate(request, requests, JoinGroupRequestSerializer)
def put(self, request):
"""
同意或者拒绝加入小组请求
---
request_serializer: PutJoinGroupRequestSerializer
"""
serializer = PutJoinGroupRequestSerializer(data=request.data)
if serializer.is_valid():
data = serializer.data
try:
join_request = JoinGroupRequest.objects.get(id=data["request_id"], group__admin=request.user, status=False)
except JoinGroupRequest.DoesNotExist:
return error_response(u"小组不存在")
join_request.status = True
join_request.save()
if data["status"]:
if join_group(join_request.user, join_request.group):
return success_response(u"加入成功")
else:
return error_response(u"加入失败,已经在本小组内")
else:
return success_response(u"已拒绝")
else:
return serializer_invalid_response(serializer)