From f7b6a354b335dbd026326591058f5a3c00fc09da Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sun, 9 Aug 2015 12:57:13 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0/admin/=E5=92=8C/api/admi?= =?UTF-8?q?n/=E7=9A=84=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6middleware?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/middleware.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 admin/middleware.py diff --git a/admin/middleware.py b/admin/middleware.py new file mode 100644 index 0000000..515a889 --- /dev/null +++ b/admin/middleware.py @@ -0,0 +1,16 @@ +# coding=utf-8 +import json + +from django.http import HttpResponse, HttpResponseRedirect + + +class AdminRequiredMiddleware(object): + def process_request(self, request): + path = request.path_info + if path.startswith("/admin/") or path.startswith("/api/admin/"): + if not request.user.is_authenticated(): + if request.is_ajax(): + return HttpResponse(json.dumps({"code": 1, "data": u"请先登录"}), + content_type="application/json") + else: + return HttpResponseRedirect("/login/") \ No newline at end of file From c4b02270cbaa4bfd0f8a3c8c613a7c7b2ac25f6a Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sun, 9 Aug 2015 12:57:59 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=88=9B=E5=BB=BAgroup=20app=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=9B=B8=E5=85=B3=E7=9A=84models=E5=92=8Cviews=20?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group/__init__.py | 0 group/admin.py | 3 ++ group/migrations/0001_initial.py | 45 ++++++++++++++++++++ group/migrations/__init__.py | 0 group/models.py | 31 ++++++++++++++ group/serializers.py | 27 ++++++++++++ group/tests.py | 3 ++ group/views.py | 72 ++++++++++++++++++++++++++++++++ 8 files changed, 181 insertions(+) create mode 100644 group/__init__.py create mode 100644 group/admin.py create mode 100644 group/migrations/0001_initial.py create mode 100644 group/migrations/__init__.py create mode 100644 group/models.py create mode 100644 group/serializers.py create mode 100644 group/tests.py create mode 100644 group/views.py diff --git a/group/__init__.py b/group/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/group/admin.py b/group/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/group/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/group/migrations/0001_initial.py b/group/migrations/0001_initial.py new file mode 100644 index 0000000..f996a63 --- /dev/null +++ b/group/migrations/0001_initial.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Group', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=30)), + ('description', models.TextField()), + ('create_time', models.DateTimeField(auto_now_add=True)), + ('join_group_setting', models.IntegerField()), + ('visible', models.BooleanField(default=True)), + ('admin', models.ForeignKey(related_name='my_groups', to=settings.AUTH_USER_MODEL)), + ('members', models.ManyToManyField(to=settings.AUTH_USER_MODEL)), + ], + options={ + 'db_table': 'group', + }, + ), + migrations.CreateModel( + name='JoinGroupRequest', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('message', models.TextField()), + ('create_time', models.DateTimeField(auto_now_add=True)), + ('status', models.BooleanField(default=False)), + ('group', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(related_name='my_join_group_requests', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'db_table': 'join_group_request', + }, + ), + ] diff --git a/group/migrations/__init__.py b/group/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/group/models.py b/group/models.py new file mode 100644 index 0000000..aa255f4 --- /dev/null +++ b/group/models.py @@ -0,0 +1,31 @@ +# coding=utf-8 +from django.db import models + +from account.models import User + + +class Group(models.Model): + name = models.CharField(max_length=30) + description = models.TextField() + create_time = models.DateTimeField(auto_now_add=True) + admin = models.ForeignKey(User, related_name="my_groups") + # 0是公开 1是需要申请后加入 2是不允许任何人加入 + join_group_setting = models.IntegerField() + members = models.ManyToManyField(User) + # 解散小组后,这一项改为False + visible = models.BooleanField(default=True) + + class Meta: + db_table = "group" + + +class JoinGroupRequest(models.Model): + group = models.ForeignKey(User) + user = models.ForeignKey(User, related_name="my_join_group_requests") + message = models.TextField() + create_time = models.DateTimeField(auto_now_add=True) + # 是否处理 + status = models.BooleanField(default=False) + + class Meta: + db_table = "join_group_request" diff --git a/group/serializers.py b/group/serializers.py new file mode 100644 index 0000000..bd655ed --- /dev/null +++ b/group/serializers.py @@ -0,0 +1,27 @@ +# coding=utf-8 +from rest_framework import serializers + +from .models import Group + + +class CreateGroupSerializer(serializers.Serializer): + name = serializers.CharField(max_length=20) + description = serializers.CharField(max_length=300) + join_group_setting = serializers.IntegerField(min_value=0, max_value=2) + + +class EditGroupSerializer(serializers.Serializer): + name = serializers.CharField(max_length=20) + description = serializers.CharField(max_length=300) + join_group_setting = serializers.IntegerField() + + +class JoinGroupRequestSerializer(serializers.Serializer): + group = serializers.IntegerField() + message = serializers.CharField(max_length=30) + + +class GroupSerializer(serializers.ModelSerializer): + class Meta: + model = Group + exclude = ["members"] \ No newline at end of file diff --git a/group/tests.py b/group/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/group/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/group/views.py b/group/views.py new file mode 100644 index 0000000..5ccdcd9 --- /dev/null +++ b/group/views.py @@ -0,0 +1,72 @@ +# coding=utf-8 +from django.shortcuts import render + +from rest_framework.views import APIView + +from utils.shortcuts import error_response, serializer_invalid_response, success_response, paginate +from account.models import REGULAR_USER, ADMIN, SUPER_ADMIN + +from .models import Group, JoinGroupRequest +from .serializers import (CreateGroupSerializer, EditGroupSerializer, + JoinGroupRequestSerializer, GroupSerializer) + + +class GroupAdminAPIView(APIView): + def post(self, request): + """ + 创建小组的api + --- + request_serializer: CreateGroupSerializer + """ + serializer = CreateGroupSerializer(data=request.data) + if serializer.is_valid(): + data = serializer.data + group = Group.objects.create(name=data["name"], + description=data["description"], + join_group_setting=data["join_group_setting"], + admin=request.user) + return success_response(GroupSerializer(group).data) + else: + return serializer_invalid_response(serializer) + + def put(self, request): + """ + 修改小组信息的api + --- + request_serializer: EditGroupSerializer + """ + serializer = EditGroupSerializer(data=request.data) + if serializer.is_valid(): + data = serializer.data + try: + group = Group.objects.get(id=data["id"], admin=request.user) + except Group.DoesNotExist: + return error_response(u"小组不存在") + group.name = data["name"] + group.description = data["description"] + group.join_group_setting = data["join_group_setting"] + group.save() + return success_response(GroupSerializer(group).data) + else: + return serializer_invalid_response(serializer) + + def get(self, request): + """ + 查询小组列表或者单个小组的信息 + """ + group_id = request.GET.get("group_id", None) + if group_id: + try: + if request.user.admin_type == SUPER_ADMIN: + group = Group.object.get(id=group_id) + else: + group = Group.object.get(id=group_id, admin=request.user) + return success_response(GroupSerializer(group).data) + except Group.DoesNotExist: + return error_response(u"小组不存在") + else: + if request.user.admin_type == SUPER_ADMIN: + groups = Group.objects.filter(visible=True) + else: + groups = Group.objects.filter(admin=request.user, visible=True) + return paginate(request, groups, GroupSerializer) \ No newline at end of file From 6f5c9b165702111644ceaf62cb8ae3826cfc15bb Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sun, 9 Aug 2015 12:58:31 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E7=9A=84=E5=B8=B8=E9=87=8F=E7=9A=84=E5=AE=9A=E4=B9=89=E4=BB=A5?= =?UTF-8?q?=E5=8F=8Aurl=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/models.py | 5 +++++ oj/settings.py | 2 ++ oj/urls.py | 9 ++++++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/account/models.py b/account/models.py index a724f5a..df25329 100644 --- a/account/models.py +++ b/account/models.py @@ -14,6 +14,11 @@ class UserManager(models.Manager): return self.get(**{self.model.USERNAME_FIELD: username}) +REGULAR_USER = 0 +ADMIN = 1 +SUPER_ADMIN = 2 + + class User(AbstractBaseUser): # 用户名 username = models.CharField(max_length=30, unique=True) diff --git a/oj/settings.py b/oj/settings.py index 910914c..c8a07ec 100644 --- a/oj/settings.py +++ b/oj/settings.py @@ -49,6 +49,7 @@ INSTALLED_APPS = ( 'account', 'announcement', 'utils', + 'group', 'rest_framework', 'rest_framework_swagger', @@ -63,6 +64,7 @@ MIDDLEWARE_CLASSES = ( 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', + 'admin.middleware.AdminRequiredMiddleware' ) ROOT_URLCONF = 'oj.urls' diff --git a/oj/urls.py b/oj/urls.py index a69c8ee..b2eecb9 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -3,9 +3,11 @@ from django.conf.urls import include, url from django.contrib import admin from django.views.generic import TemplateView -from account.views import UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView, \ - EmailCheckAPIView, UserAPIView, UserAdminAPIView +from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, + UserChangePasswordAPIView, EmailCheckAPIView, + UserAPIView, UserAdminAPIView) from announcement.views import AnnouncementAPIView, AnnouncementAdminAPIView +from group.views import GroupAdminAPIView from admin.views import AdminTemplateView urlpatterns = [ @@ -29,5 +31,6 @@ urlpatterns = [ url(r'^admin/contest/$', TemplateView.as_view(template_name="admin/contest/add_contest.html"), name="add_contest_page"), url(r'^problems/$', TemplateView.as_view(template_name="oj/problem/problem_list.html"), name="problem_list_page"), - url(r'^admin/template/(?P\w+)/(?P\w+).html', AdminTemplateView.as_view(), name="admin_template") + url(r'^admin/template/(?P\w+)/(?P\w+).html', AdminTemplateView.as_view(), name="admin_template"), + url(r'^api/admin/group/$', GroupAdminAPIView.as_view(), name="group_admin_api"), ]