From cb0e7cf9382b94299b2df3b9c00d0e3d68aa98aa Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Mon, 21 Sep 2015 12:32:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=AC=E5=91=8A=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E4=B8=AD=E7=94=A8=E6=88=B7=E6=9D=83=E9=99=90=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E9=94=99=E8=AF=AF=E7=9A=84=E6=83=85=E5=86=B5=EF=BC=8C?= =?UTF-8?q?=E6=8A=BD=E5=8F=96=E4=BB=A3=E7=A0=81=E4=B8=BA=20decorator?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- announcement/decorators.py | 43 +++++++++++++++++++++++++ announcement/models.py | 2 +- announcement/views.py | 22 +++---------- utils/templatetags/announcement_list.py | 1 + 4 files changed, 49 insertions(+), 19 deletions(-) create mode 100644 announcement/decorators.py diff --git a/announcement/decorators.py b/announcement/decorators.py new file mode 100644 index 0000000..96df987 --- /dev/null +++ b/announcement/decorators.py @@ -0,0 +1,43 @@ +# coding=utf-8 +from functools import wraps + +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import render + +from utils.shortcuts import error_response, error_page + +from account.models import SUPER_ADMIN +from .models import Announcement + + +def check_user_announcement_permission(func): + @wraps(func) + def _check_user_announcement_permission(*args, **kwargs): + """ + 这个函数检测当前用户能否查看这个公告 + """ + # CBV 的情况,第一个参数是self,第二个参数是request + if len(args) == 2: + request = args[-1] + else: + request = args[0] + + if "announcement_id" not in kwargs: + return error_page(request, u"参数错误") + announcement_id = kwargs["announcement_id"] + + try: + announcement = Announcement.objects.get(id=announcement_id, visible=True) + except Announcement.DoesNotExist: + return error_page(request, u"公告不存在") + + # 如果公告是只有部分小组可见的 + if not announcement.is_global: + # 用户必须是登录状态的 + if not request.user.is_authenticated(): + return HttpResponseRedirect("/login/") + if not announcement.groups.filter(id__in=request.user.group_set.all()).exists(): + return error_page(request, u"公告不存在") + return func(*args, **kwargs) + + return _check_user_announcement_permission diff --git a/announcement/models.py b/announcement/models.py index 1dfa606..c3267f1 100644 --- a/announcement/models.py +++ b/announcement/models.py @@ -18,7 +18,7 @@ class Announcement(models.Model): last_update_time = models.DateTimeField(auto_now=True) # 是否可见 false的话相当于删除 visible = models.BooleanField(default=True) - # 公告可见范围 0是全局可见 1是部分小组可见,需要在下面的字段中存储可见的小组 + # 公告可见范围 True 是全局可见 False 是部分小组可见,需要在下面的字段中存储可见的小组 is_global = models.BooleanField() groups = models.ManyToManyField(Group) diff --git a/announcement/views.py b/announcement/views.py index 6790e8c..3160d9e 100644 --- a/announcement/views.py +++ b/announcement/views.py @@ -10,27 +10,13 @@ from group.models import Group from .models import Announcement from .serializers import (CreateAnnouncementSerializer, AnnouncementSerializer, EditAnnouncementSerializer) +from .decorators import check_user_announcement_permission +@check_user_announcement_permission def announcement_page(request, announcement_id): - try: - announcement = Announcement.objects.get(id=announcement_id, visible=True) - except Announcement.DoesNotExist: - return error_page(request, u"公告不存在") - # 公开的公告 - if announcement.is_global == 0: - return render(request, "oj/announcement/announcement.html", {"announcement": announcement}) - else: - if not request.user.is_authenticated(): - return error_page(request, u"公告不存在") - # 判断是不是在组里面 - if request.user.admin_type == SUPER_ADMIN or request.user == announcement.created_by: - return render(request, "oj/announcement/announcement.html", {"announcement": announcement}) - else: - if request.user.groups.filter(id__in=[item.id for item in announcement.groups.all()]).exists(): - return render(request, "oj/announcement/announcement.html", {"announcement": announcement}) - else: - return error_page(request, u"公告不存在") + announcement = Announcement.objects.get(id=announcement_id, visible=True) + return render(request, "oj/announcement/announcement.html", {"announcement": announcement}) class AnnouncementAdminAPIView(APIView): diff --git a/utils/templatetags/announcement_list.py b/utils/templatetags/announcement_list.py index acf38d9..1b2f331 100644 --- a/utils/templatetags/announcement_list.py +++ b/utils/templatetags/announcement_list.py @@ -3,6 +3,7 @@ from django import template from announcement.models import Announcement + def public_announcement_list(): return Announcement.objects.filter(is_global=True, visible=True).order_by("-create_time")