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 @@
-
-
-
- 页数:{{ 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 @@
|