From 6284638b49cd5069884636d751f4e5553387f9f9 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 11 Aug 2015 19:14:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B0=8F=E7=BB=84=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group/migrations/0002_auto_20150811_1456.py | 28 ++++++++++ group/migrations/0003_auto_20150811_1906.py | 19 +++++++ group/models.py | 2 +- group/serializers.py | 42 +++++++++++++-- group/views.py | 59 ++++++++++++++++++--- 5 files changed, 139 insertions(+), 11 deletions(-) create mode 100644 group/migrations/0002_auto_20150811_1456.py create mode 100644 group/migrations/0003_auto_20150811_1906.py diff --git a/group/migrations/0002_auto_20150811_1456.py b/group/migrations/0002_auto_20150811_1456.py new file mode 100644 index 0000000..2b6a65e --- /dev/null +++ b/group/migrations/0002_auto_20150811_1456.py @@ -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')]), + ), + ] diff --git a/group/migrations/0003_auto_20150811_1906.py b/group/migrations/0003_auto_20150811_1906.py new file mode 100644 index 0000000..242a62e --- /dev/null +++ b/group/migrations/0003_auto_20150811_1906.py @@ -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), + ), + ] diff --git a/group/models.py b/group/models.py index 8b15644..b7f49c1 100644 --- a/group/models.py +++ b/group/models.py @@ -10,7 +10,7 @@ class Group(models.Model): create_time = models.DateTimeField(auto_now_add=True) admin = models.ForeignKey(User, related_name="my_groups") # 0是公开 1是需要申请后加入 2是不允许任何人加入 - join_group_setting = models.IntegerField() + join_group_setting = models.IntegerField(default=1) members = models.ManyToManyField(User, through="UserGroupRelation") # 解散小组后,这一项改为False visible = models.BooleanField(default=True) diff --git a/group/serializers.py b/group/serializers.py index 6c40eae..065baf9 100644 --- a/group/serializers.py +++ b/group/serializers.py @@ -1,8 +1,9 @@ # coding=utf-8 from rest_framework import serializers +from account.models import User from account.serializers import UserSerializer -from .models import Group, UserGroupRelation +from .models import Group, UserGroupRelation, JoinGroupRequest class CreateGroupSerializer(serializers.Serializer): @@ -18,25 +19,58 @@ class EditGroupSerializer(serializers.Serializer): join_group_setting = serializers.IntegerField() -class JoinGroupRequestSerializer(serializers.Serializer): +class CreateJoinGroupRequestSerializer(serializers.Serializer): group_id = serializers.IntegerField() message = serializers.CharField(max_length=30) +class JoinGroupRequestSerializer(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: model = Group exclude = ["members"] class GroupMemberSerializer(serializers.ModelSerializer): + class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ["id", "username", "real_name"] + user = UserSerializer() class Meta: model = UserGroupRelation - exclude = ["id", "group"] + exclude = ["id"] class EditGroupMemberSerializer(serializers.Serializer): group_id = serializers.IntegerField() - members = serializers.ListField(child=serializers.IntegerField()) \ No newline at end of file + members = serializers.ListField(child=serializers.IntegerField()) + + +class PutJoinGroupRequestSerializer(serializers.Serializer): + request_id = serializers.IntegerField() + status = serializers.BooleanField() \ No newline at end of file diff --git a/group/views.py b/group/views.py index 54c1ec2..9edb9c6 100644 --- a/group/views.py +++ b/group/views.py @@ -10,8 +10,9 @@ from account.decorators import login_required from .models import Group, JoinGroupRequest, UserGroupRelation from .serializers import (CreateGroupSerializer, EditGroupSerializer, - JoinGroupRequestSerializer, GroupSerializer, - GroupMemberSerializer, EditGroupMemberSerializer) + CreateJoinGroupRequestSerializer, GroupSerializer, + GroupMemberSerializer, EditGroupMemberSerializer, + JoinGroupRequestSerializer, PutJoinGroupRequestSerializer) class GroupAPIViewBase(object): @@ -101,6 +102,8 @@ class GroupAdminAPIView(APIView, GroupAPIViewBase): return error_response(u"小组不存在") else: groups = self.get_groups(request) + if request.GET.get("keyword", None): + groups = groups.filter(name__contains=request.GET["keyword"]) return paginate(request, groups, GroupSerializer) @@ -149,14 +152,14 @@ def join_group(user, group): class JoinGroupAPIView(APIView): - @login_required + # @login_required def post(self, request): """ 加入某个小组的api --- - request_serializer: JoinGroupRequestSerializer + request_serializer: CreateJoinGroupRequestSerializer """ - serializer = JoinGroupRequestSerializer(data=request.data) + serializer = CreateJoinGroupRequestSerializer(data=request.data) if serializer.is_valid(): data = serializer.data try: @@ -169,7 +172,11 @@ class JoinGroupAPIView(APIView): else: return error_response(u"你已经是小组成员了") elif group.join_group_setting == 1: - JoinGroupRequest.objects.create(user=request.user, group=group, message=data["message"]) + 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"]) return success_response(u"申请提交成功,请等待审核") elif group.join_group_setting == 2: return error_response(u"该小组不允许任何人加入") @@ -188,3 +195,43 @@ class JoinGroupAPIView(APIView): # 搜索包含这个关键词的 没有解散的 而且允许加入的小组 groups = Group.objects.filter(name__contains=keyword, visible=True, join_group_setting__lte=2) 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)