From da54a1245bdabf11abed658ea54551d0b94f0e6e Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 20 Oct 2015 20:07:35 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E4=B9=8B=E5=90=8E=E7=9A=84=E9=87=8D=E5=AE=9A=E5=90=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/decorators.py | 3 ++- contest/decorators.py | 3 ++- contest/test_urls.py | 9 ------- static/src/js/app/oj/account/login.js | 25 ++++++++----------- .../src/oj/account/{oauth.html => sso.html} | 0 5 files changed, 15 insertions(+), 25 deletions(-) delete mode 100644 contest/test_urls.py rename template/src/oj/account/{oauth.html => sso.html} (100%) diff --git a/account/decorators.py b/account/decorators.py index 2646c025..b0dbecbc 100644 --- a/account/decorators.py +++ b/account/decorators.py @@ -1,4 +1,5 @@ # coding=utf-8 +import urllib import functools from functools import wraps @@ -27,7 +28,7 @@ class BasePermissionDecorator(object): if self.request.is_ajax(): return error_response(u"请先登录") else: - return HttpResponseRedirect("/login/") + return HttpResponseRedirect("/login/?__from=" + urllib.quote(self.request.build_absolute_uri())) def check_permission(self): raise NotImplementedError() diff --git a/contest/decorators.py b/contest/decorators.py index d08783c0..2f5e3ba3 100644 --- a/contest/decorators.py +++ b/contest/decorators.py @@ -1,4 +1,5 @@ # coding=utf-8 +import urllib from functools import wraps from django.http import HttpResponse, HttpResponseRedirect @@ -30,7 +31,7 @@ def check_user_contest_permission(func): if request.is_ajax(): return error_response(u"请先登录") else: - return HttpResponseRedirect("/login/") + return HttpResponseRedirect("/login/?__from=" + urllib.quote(request.build_absolute_uri())) # kwargs 就包含了 url 里面的参数 if "contest_id" in kwargs: diff --git a/contest/test_urls.py b/contest/test_urls.py deleted file mode 100644 index 234c600f..00000000 --- a/contest/test_urls.py +++ /dev/null @@ -1,9 +0,0 @@ -# coding=utf-8 -from django.conf.urls import include, url -from django.views.generic import TemplateView - - -urlpatterns = [ - - url(r'^login/$', TemplateView.as_view(template_name="oj/account/login.html"), name="user_login_page"), -] diff --git a/static/src/js/app/oj/account/login.js b/static/src/js/app/oj/account/login.js index 42b8d684..8e1351d9 100644 --- a/static/src/js/app/oj/account/login.js +++ b/static/src/js/app/oj/account/login.js @@ -14,21 +14,18 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c method: "post", success: function (data) { if (!data.code) { - //成功登陆 - var ref = document.referrer; - if (ref) { - // 注册页和本页的来源的跳转回首页,防止死循环 - if (ref.indexOf("register") > -1 || ref.indexOf("login") > -1) { - location.href = "/"; - return; - } - // 判断来源,只有同域下才跳转 - if (ref.split("/")[2].split(":")[0] == location.hostname) { - location.href = ref; - return; - } + function getLocationVal(id){ + var temp = unescape(location.search).split(id+"=")[1] || ""; + return temp.indexOf("&")>=0 ? temp.split("&")[0] : temp; + } + var from = getLocationVal("__from"); + if(from != ""){ + console.log(from); + window.location.href = from; + } + else{ + location.href = "/"; } - location.href = "/"; } else { refresh_captcha(); diff --git a/template/src/oj/account/oauth.html b/template/src/oj/account/sso.html similarity index 100% rename from template/src/oj/account/oauth.html rename to template/src/oj/account/sso.html From 17f18209559f8e1236e10458a18f56f436a784d8 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 20 Oct 2015 20:09:23 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E8=AE=A8?= =?UTF-8?q?=E8=AE=BA=E5=8C=BA=E7=9A=84=20SSO=20=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/serializers.py | 6 +++++- account/views.py | 34 ++++++++++++++++++++++---------- oj/local_settings.py | 15 ++++++-------- oj/server_settings.py | 2 ++ oj/urls.py | 4 ++-- template/src/oj/account/sso.html | 12 ++++------- 6 files changed, 43 insertions(+), 30 deletions(-) diff --git a/account/serializers.py b/account/serializers.py index 13f3e24b..5004ee1d 100644 --- a/account/serializers.py +++ b/account/serializers.py @@ -57,4 +57,8 @@ class ApplyResetPasswordSerializer(serializers.Serializer): class ResetPasswordSerializer(serializers.Serializer): token = serializers.CharField(min_length=1, max_length=40) password = serializers.CharField(min_length=6, max_length=30) - captcha = serializers.CharField(max_length=4, min_length=4) \ No newline at end of file + captcha = serializers.CharField(max_length=4, min_length=4) + + +class SSOSerializer(serializers.Serializer): + token = serializers.CharField(max_length=40) \ No newline at end of file diff --git a/account/views.py b/account/views.py index b50e0a3a..5a43e9cb 100644 --- a/account/views.py +++ b/account/views.py @@ -5,6 +5,7 @@ from django.contrib import auth from django.shortcuts import render from django.db.models import Q from django.conf import settings +from django.http import HttpResponseRedirect from django.core.exceptions import MultipleObjectsReturned from django.utils.timezone import now @@ -20,7 +21,8 @@ from .models import User from .serializers import (UserLoginSerializer, UsernameCheckSerializer, UserRegisterSerializer, UserChangePasswordSerializer, EmailCheckSerializer, UserSerializer, EditUserSerializer, - ApplyResetPasswordSerializer, ResetPasswordSerializer) + ApplyResetPasswordSerializer, ResetPasswordSerializer, + SSOSerializer) from .decorators import super_admin_required @@ -287,12 +289,24 @@ def user_index_page(request, username): return render(request, "oj/account/user_index.html") -def auth_page(request): - if not request.user.is_authenticated(): - return render(request, "oj/account/oauth.html") - callback = request.GET.get("callback", None) - if not callback: - return error_page(request, u"参数错误") - token = rand_str() - request.user.auth_token = token - return render(request, "oj/account/oauth.html", {"callback": callback, "token": token}) +class SSOAPIView(APIView): + def post(self, request): + serializer = SSOSerializer(data=request.data) + if serializer.is_valid(): + try: + user = User.objects.get(auth_token=serializer.data["token"]) + return success_response({"username": user.username}) + except User.DoesNotExist: + return error_response(u"用户不存在") + else: + return serializer_invalid_response(serializer) + + @login_required + def get(self, request): + callback = request.GET.get("callback", None) + if not callback or callback != settings.SSO["callback"]: + return error_page(request, u"参数错误") + token = rand_str() + request.user.auth_token = token + request.user.save() + return render(request, "oj/account/sso.html", {"redirect_url": callback + "?token=" + token, "callback": callback}) \ No newline at end of file diff --git a/oj/local_settings.py b/oj/local_settings.py index 074b1b01..a08ae7e2 100644 --- a/oj/local_settings.py +++ b/oj/local_settings.py @@ -11,18 +11,13 @@ DATABASES = { }, # submission 的 name 和 engine 请勿修改,其他代码会用到 'submission': { - 'NAME': 'oj_submission', - 'ENGINE': 'django.db.backends.mysql', - 'CONN_MAX_AGE': 0.1, - 'HOST': "127.0.0.1", - 'PORT': 3306, - 'USER': 'root', - 'PASSWORD': 'root', + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db1.sqlite3'), } } REDIS_CACHE = { - "host": "121.42.32.129", + "host": "127.0.0.1", "port": 6379, "db": 1 } @@ -36,4 +31,6 @@ ALLOWED_HOSTS = [] STATICFILES_DIRS = [os.path.join(BASE_DIR, "static/src/"), BASE_DIR] # 模板文件夹 -TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'template/src/')] \ No newline at end of file +TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'template/src/')] + +SSO = {"callback": "http://localhost:8765/login"} \ No newline at end of file diff --git a/oj/server_settings.py b/oj/server_settings.py index 9f8f084e..bba27c6f 100644 --- a/oj/server_settings.py +++ b/oj/server_settings.py @@ -43,3 +43,5 @@ STATICFILES_DIRS = [os.path.join(BASE_DIR, "static/release/"), os.path.join(BASE TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'template/release/')] SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') + +SSO = {"callback": "https://discuss.acmer.site/login"} diff --git a/oj/urls.py b/oj/urls.py index f95fa2bb..2b6047d5 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -6,7 +6,7 @@ from django.views.generic import TemplateView from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView, EmailCheckAPIView, UserAdminAPIView, UserInfoAPIView, - ApplyResetPasswordAPIView) + ApplyResetPasswordAPIView, SSOAPIView) from announcement.views import AnnouncementAdminAPIView @@ -127,7 +127,7 @@ urlpatterns = [ url(r'^account/settings/$', TemplateView.as_view(template_name="oj/account/settings.html"), name="account_setting_page"), url(r'^account/settings/avatar/$', TemplateView.as_view(template_name="oj/account/avatar.html"), name="avatar_settings_page"), - url(r'^account/auth/$', "account.views.auth_page", name="auth_login_page"), + url(r'^account/sso/$', SSOAPIView.as_view(), name="sso_api"), ] diff --git a/template/src/oj/account/sso.html b/template/src/oj/account/sso.html index 2713d19c..23f04455 100644 --- a/template/src/oj/account/sso.html +++ b/template/src/oj/account/sso.html @@ -5,17 +5,13 @@ {% block body %}
- {% if request.user.is_authenticated %} -

3秒钟后将跳转到{{ callback }}

+

3秒钟后将使用账号{{ request.user.username }}登录{{ callback }}

+ + - {% else %} - - {% endif %} - -
{% endblock %} From 0ae51dce235774bcf5d0392be6afe284d46c893e Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 21 Oct 2015 10:33:56 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=93=E5=8C=85?= =?UTF-8?q?=E9=94=99=E8=AF=AF=EF=BC=9B=E7=BC=BA=E5=B0=91=20js=20=E8=B7=AF?= =?UTF-8?q?=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/build.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/static/src/js/build.js b/static/src/js/build.js index 96247c12..69049461 100644 --- a/static/src/js/build.js +++ b/static/src/js/build.js @@ -25,6 +25,7 @@ // ------ admin web 组件 ---------- pager: "components/pager", + editorComponent: "components/editorComponent", // ------ 下面写的都不要直接用,而是使用上面的封装版本 ------ //富文本编辑器simditor -> editor @@ -153,7 +154,7 @@ }, { name: "submissionList_21_pack" - } + }, ], optimizeCss: "standard", }) \ No newline at end of file From 84e776a8b4a2c04cf90e4e4d8c86e51787108dc6 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sat, 24 Oct 2015 13:14:51 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20contest=20model=20?= =?UTF-8?q?=E5=8F=98=E5=8C=96=E5=B8=A6=E6=9D=A5=E7=9A=84=E9=83=A8=E5=88=86?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/serializers.py | 4 ---- contest/views.py | 6 ++---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/contest/serializers.py b/contest/serializers.py index 8f3bf0bc..e0fde2a4 100644 --- a/contest/serializers.py +++ b/contest/serializers.py @@ -11,10 +11,8 @@ from .models import Contest, ContestProblem class CreateContestSerializer(serializers.Serializer): title = serializers.CharField(max_length=40) description = serializers.CharField(max_length=5000) - mode = serializers.IntegerField() contest_type = serializers.IntegerField() real_time_rank = serializers.BooleanField() - show_user_submission = serializers.BooleanField() password = serializers.CharField(max_length=30, required=False, default=None) start_time = serializers.DateTimeField() end_time = serializers.DateTimeField() @@ -45,10 +43,8 @@ class EditContestSerializer(serializers.Serializer): id = serializers.IntegerField() title = serializers.CharField(max_length=40) description = serializers.CharField(max_length=10000) - mode = serializers.IntegerField() contest_type = serializers.IntegerField() real_time_rank = serializers.BooleanField() - show_user_submission = serializers.BooleanField() password = serializers.CharField(max_length=30, required=False, default=None) start_time = serializers.DateTimeField() end_time = serializers.DateTimeField() diff --git a/contest/views.py b/contest/views.py index d9eee7b3..fe893e63 100644 --- a/contest/views.py +++ b/contest/views.py @@ -64,9 +64,8 @@ class ContestAdminAPIView(APIView): return error_response(u"比赛的开始时间必须早于比赛结束的时间") try: contest = Contest.objects.create(title=data["title"], description=data["description"], - mode=data["mode"], contest_type=data["contest_type"], + contest_type=data["contest_type"], real_time_rank=data["real_time_rank"], password=data["password"], - show_user_submission=data["show_user_submission"], start_time=dateparse.parse_datetime(data["start_time"]), end_time=dateparse.parse_datetime(data["end_time"]), created_by=request.user, visible=data["visible"]) @@ -125,10 +124,8 @@ class ContestAdminAPIView(APIView): contest.title = data["title"] contest.description = data["description"] - contest.mode = data["mode"] contest.contest_type = data["contest_type"] contest.real_time_rank = data["real_time_rank"] - contest.show_user_submission = data["show_user_submission"] contest.start_time = dateparse.parse_datetime(data["start_time"]) contest.end_time = dateparse.parse_datetime(data["end_time"]) contest.visible = data["visible"] @@ -225,6 +222,7 @@ class ContestProblemAdminAPIView(APIView): contest_problem.visible = data["visible"] contest_problem.sort_index = data["sort_index"] contest_problem.score = data["score"] + contest_problem.last_update_time = now() contest_problem.save() return success_response(ContestProblemSerializer(contest_problem).data) else: From f5953d64a55b1bd21f45431f6d0aca88ae43f7cc Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sat, 24 Oct 2015 14:57:30 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=AF=94=E8=B5=9B=E7=9A=84=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/contest/addContest.js | 34 ++++++------------- template/src/admin/contest/add_contest.html | 29 +++------------- template/src/admin/contest/contest_list.html | 10 +++--- 3 files changed, 22 insertions(+), 51 deletions(-) diff --git a/static/src/js/app/admin/contest/addContest.js b/static/src/js/app/admin/contest/addContest.js index e2059b86..b05ba4ee 100644 --- a/static/src/js/app/admin/contest/addContest.js +++ b/static/src/js/app/admin/contest/addContest.js @@ -1,5 +1,5 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "datetimePicker", - "validator"], + "validator", "editorComponent"], function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { $("#add-contest-form").validator().on('submit', function (e) { @@ -7,11 +7,9 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date e.preventDefault(); var ajaxData = { title: vm.title, - description: vm.description, - mode: vm.mode, + description: avalon.vmodels.contestDescriptionEditor.content, contest_type: 0, real_time_rank: vm.realTimeRank, - show_user_submission: vm.showSubmission, start_time: vm.startTime, end_time: vm.endTime, visible: false @@ -38,12 +36,11 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date bsAlert("你没有选择参赛用户!"); return false; } - if (vm.editDescription == "") { + if (ajaxData.description.trim() == "") { bsAlert("比赛描述不能为空!"); return false; } - $.ajax({ // Add contest - beforeSend: csrfTokenHeader, + $.ajax({ url: "/api/admin/contest/", dataType: "json", contentType: "application/json;charset=UTF-8", @@ -52,17 +49,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date success: function (data) { if (!data.code) { bsAlert("添加成功!将转到比赛列表页以便为比赛添加问题(注意比赛当前状态为:隐藏)"); - vm.title = ""; - vm.description = ""; - vm.startTime = ""; - vm.endTime = ""; - vm.password = ""; - vm.mode = "0"; - vm.showSubmission = true; location.hash = "#contest/contest_list"; - vm.isGlobal = true; - vm.allGroups = []; - vm.showGlobalViewRadio = true; } else { bsAlert(data.data); @@ -73,23 +60,25 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date return false; }); - editor("#editor"); + //editor("#editor"); if (avalon.vmodels.add_contest) var vm = avalon.vmodels.add_contest; else var vm = avalon.define({ $id: "add_contest", title: "", - description: "", startTime: "", endTime: "", password: "", - mode: "0", - showSubmission: true, isGlobal: true, allGroups: [], showGlobalViewRadio: true, - realTimeRank: true + realTimeRank: true, + + contestDescriptionEditor: { + editorId: "contest-description-editor", + placeholder: "比赛介绍内容" + } }); $.ajax({ @@ -102,7 +91,6 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date if (data.data.admin_type == 1) { vm.isGlobal = false; vm.showGlobalViewRadio = false; - } } $.ajax({ diff --git a/template/src/admin/contest/add_contest.html b/template/src/admin/contest/add_contest.html index 54d16d8f..ce8fd14f 100644 --- a/template/src/admin/contest/add_contest.html +++ b/template/src/admin/contest/add_contest.html @@ -17,8 +17,7 @@
- -

请填写比赛描述

+
@@ -39,7 +38,7 @@
- +
@@ -70,30 +69,12 @@   {{ el.name }}
-
- -
- - -
-
-
- -
- -
-
-
+ +
diff --git a/template/src/admin/contest/contest_list.html b/template/src/admin/contest/contest_list.html index cf027c75..cc3073fb 100644 --- a/template/src/admin/contest/contest_list.html +++ b/template/src/admin/contest/contest_list.html @@ -38,10 +38,10 @@
- 页数:{{ page }}/{{ totalPage }}   - - +
+ + +
  {{ el.name }}
@@ -186,6 +186,8 @@
+ --> + From 6426497f1159f8a0c911b559a10683b9851930b2 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sat, 24 Oct 2015 16:52:39 +0800 Subject: [PATCH 06/11] =?UTF-8?q?0=20ac=20=E7=9A=84=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=8E=92=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contest/{contestList.js => contestList1.js} | 17 ----------------- template/src/admin/contest/contest_list.html | 2 +- 2 files changed, 1 insertion(+), 18 deletions(-) rename static/src/js/app/admin/contest/{contestList.js => contestList1.js} (95%) diff --git a/static/src/js/app/admin/contest/contestList.js b/static/src/js/app/admin/contest/contestList1.js similarity index 95% rename from static/src/js/app/admin/contest/contestList.js rename to static/src/js/app/admin/contest/contestList1.js index 4951979c..07ddc1e1 100644 --- a/static/src/js/app/admin/contest/contestList.js +++ b/static/src/js/app/admin/contest/contestList1.js @@ -70,23 +70,6 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", // this page has been loaded before, so set the default value var vm = avalon.vmodels.contestList; vm.contestList = []; - vm.previousPage = 0; - vm.nextPage = 0; - vm.page = 1; - vm.totalPage = 1; - vm.keyword = ""; - vm.editingContestId = 0; - vm.editTitle = ""; - vm.editDescription = ""; - vm.editProblemList = []; - vm.editPassword = ""; - vm.editStartTime = ""; - vm.editEndTime = ""; - vm.editMode = ""; - vm.editShowSubmission = false; - vm.editVisible = false; - vm.editingProblemContestIndex = 0; - vm.editRealTimeRank = true; } else { var vm = avalon.define({ diff --git a/template/src/admin/contest/contest_list.html b/template/src/admin/contest/contest_list.html index cc3073fb..0a1eeb42 100644 --- a/template/src/admin/contest/contest_list.html +++ b/template/src/admin/contest/contest_list.html @@ -6,7 +6,7 @@
- +

From 336cb8b79d29bdefdc9ac32c30a2f398ca996adb Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sat, 24 Oct 2015 16:59:56 +0800 Subject: [PATCH 07/11] =?UTF-8?q?contest=20list=20admin=20=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=20js=20=E7=B2=BE=E7=AE=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/js/app/admin/contest/contestList.js | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 static/src/js/app/admin/contest/contestList.js diff --git a/static/src/js/app/admin/contest/contestList.js b/static/src/js/app/admin/contest/contestList.js new file mode 100644 index 00000000..7eb47fad --- /dev/null +++ b/static/src/js/app/admin/contest/contestList.js @@ -0,0 +1,57 @@ +require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", "validator", "pager"], function ($, avalon, csrfTokenHeader, bsAlert, editor) { + + avalon.ready(function () { + if (avalon.vmodels.contestList) { + var vm = avalon.vmodels.contestList; + vm.contestList = []; + } + else { + var vm = avalon.define({ + $id: "contestList", + contestList: [], + keyword: "", + showVisibleOnly: false, + pager: { + getPage: function(page){ + getPage(page); + } + }, + + search: function () { + getPage(1); + avalon.vmodels.contestListPager.currentPage = 1; + } + }) + } + + vm.$watch("showVisibleOnly", function () { + getPage(1); + avalon.vmodels.contestListPager.currentPage = 1; + }); + + function getPage(page) { + var url = "/api/admin/contest/?paging=true&page=" + page + "&page_size=20"; + if (vm.showVisibleOnly) + url += "&visible=true"; + if (vm.keyword != "") + url += "&keyword=" + vm.keyword; + $.ajax({ + url: url, + dataType: "json", + method: "get", + success: function (data) { + if (!data.code) { + vm.contestList = data.data.results; + vm.announcementList = data.data.results; + avalon.vmodels.contestListPager.totalPage = data.data.total_page; + } + else { + bsAlert(data.data); + } + } + }); + } + + }); + avalon.scan(); +}); \ No newline at end of file From fb892e6ab6a570c24802a7c91a1d299ae01c9dde Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sat, 24 Oct 2015 17:00:37 +0800 Subject: [PATCH 08/11] =?UTF-8?q?0=20ac=20=E7=9A=84=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=8E=92=E5=90=8D=EF=BC=9B=E5=A2=9E=E5=8A=A0=E6=9F=90?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E6=9F=90=E4=B8=AA=E9=A2=98=E7=9A=84=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 4 ++++ template/src/oj/contest/contest_rank.html | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/contest/views.py b/contest/views.py index fe893e63..ae6f9348 100644 --- a/contest/views.py +++ b/contest/views.py @@ -484,6 +484,10 @@ def contest_problem_submissions_list_page(request, contest_id, page=1): if user_id: submissions = submissions.filter(user_id=request.GET.get("user_id")) + problem_id = request.GET.get("problem_id", None) + if problem_id: + submissions = submissions.filter(problem_id=problem_id) + # 封榜的时候只能看到自己的提交 if not contest.real_time_rank: if not (request.user.admin_type == SUPER_ADMIN or request.user == contest.created_by): diff --git a/template/src/oj/contest/contest_rank.html b/template/src/oj/contest/contest_rank.html index b14eb287..0236365e 100644 --- a/template/src/oj/contest/contest_rank.html +++ b/template/src/oj/contest/contest_rank.html @@ -40,7 +40,7 @@ 用时 + 罚时 {% for item in contest_problems %} - {{ item.sort_index }} + {{ item.sort_index }} {% endfor %} @@ -48,7 +48,7 @@ {% for item in rank %} - {{ forloop.counter|add:paging_info.offset}} + {% if item.total_ac_number %}{{ forloop.counter|add:paging_info.offset}}{% else %}-{% endif %} {{ item.user__username }} From 30bfe5bef2161931dd3e5814416fc352cd8d2c56 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sun, 25 Oct 2015 11:35:45 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=AF=94=E8=B5=9B?= =?UTF-8?q?=E6=89=80=E6=9C=89=E6=8F=90=E4=BA=A4=E7=BF=BB=E9=A1=B5=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 2 +- template/src/oj/contest/submissions_list.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contest/views.py b/contest/views.py index ae6f9348..29c943a7 100644 --- a/contest/views.py +++ b/contest/views.py @@ -537,4 +537,4 @@ def contest_problem_submissions_list_page(request, contest_id, page=1): return render(request, "oj/contest/submissions_list.html", {"submissions": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, - "contest": contest, "filter": filter, "user_id": user_id}) \ No newline at end of file + "contest": contest, "filter": filter, "user_id": user_id, "problem_id": problem_id}) \ No newline at end of file diff --git a/template/src/oj/contest/submissions_list.html b/template/src/oj/contest/submissions_list.html index 3646c243..354ce1d8 100644 --- a/template/src/oj/contest/submissions_list.html +++ b/template/src/oj/contest/submissions_list.html @@ -107,14 +107,14 @@