mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2025-11-04 14:49:58 +08:00
与dev合并,修复urls.py的冲突
This commit is contained in:
commit
43840dba15
@ -27,6 +27,7 @@ class UserRegisterSerializer(serializers.Serializer):
|
||||
class UserChangePasswordSerializer(serializers.Serializer):
|
||||
old_password = serializers.CharField()
|
||||
new_password = serializers.CharField(max_length=30, min_length=6)
|
||||
captcha = serializers.CharField(max_length=4, min_length=4)
|
||||
|
||||
|
||||
class UserSerializer(serializers.ModelSerializer):
|
||||
|
||||
@ -7,6 +7,7 @@ from django.db.models import Q
|
||||
from rest_framework.views import APIView
|
||||
|
||||
from utils.shortcuts import serializer_invalid_response, error_response, success_response, paginate
|
||||
from utils.captcha import Captcha
|
||||
|
||||
from .decorators import login_required
|
||||
from .models import User
|
||||
@ -79,6 +80,9 @@ class UserChangePasswordAPIView(APIView):
|
||||
serializer = UserChangePasswordSerializer(data=request.data)
|
||||
if serializer.is_valid():
|
||||
data = serializer.data
|
||||
captcha = Captcha(request)
|
||||
if not captcha.check(data["captcha"]):
|
||||
return error_response(u"验证码错误")
|
||||
username = request.user.username
|
||||
user = auth.authenticate(username=username, password=data["old_password"])
|
||||
if user:
|
||||
|
||||
19
contest/migrations/0007_contestsubmission_ac_time.py
Normal file
19
contest/migrations/0007_contestsubmission_ac_time.py
Normal file
@ -0,0 +1,19 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('contest', '0006_merge'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='contestsubmission',
|
||||
name='ac_time',
|
||||
field=models.IntegerField(default=0),
|
||||
),
|
||||
]
|
||||
@ -84,6 +84,8 @@ class ContestSubmission(models.Model):
|
||||
total_submission_number = models.IntegerField(default=1)
|
||||
# 这道题是 AC 还是没过
|
||||
ac = models.BooleanField()
|
||||
# ac 用时
|
||||
ac_time = models.IntegerField(default=0)
|
||||
# 总的时间,用于acm 类型的,也需要保存罚时
|
||||
total_time = models.IntegerField(default=0)
|
||||
|
||||
|
||||
@ -402,8 +402,8 @@ def _cmp(x, y):
|
||||
def contest_rank_page(request, contest_id):
|
||||
contest = Contest.objects.get(id=contest_id)
|
||||
contest_problems = ContestProblem.objects.filter(contest=contest).order_by("sort_index")
|
||||
result = ContestSubmission.objects.filter(contest=contest).values("user_id").annotate(
|
||||
total_submit=Sum("total_submission_number"))
|
||||
result = ContestSubmission.objects.filter(contest=contest).values("user_id").\
|
||||
annotate(total_submit=Sum("total_submission_number"))
|
||||
for i in range(0, len(result)):
|
||||
# 这个人所有的提交
|
||||
submissions = ContestSubmission.objects.filter(user_id=result[i]["user_id"], contest_id=contest_id)
|
||||
|
||||
@ -60,11 +60,12 @@ class MessageQueue(object):
|
||||
# 避免这道题已经 ac 了,但是又重新提交了一遍
|
||||
if not contest_submission.ac:
|
||||
# 这种情况是这个题目前处于错误状态,就使用已经存储了的罚时加上这道题的实际用时
|
||||
logger.debug(contest.start_time)
|
||||
logger.debug(submission.create_time)
|
||||
logger.debug((submission.create_time - contest.start_time).total_seconds())
|
||||
logger.debug(int((submission.create_time - contest.start_time).total_seconds() / 60))
|
||||
contest_submission.total_time += int((submission.create_time - contest.start_time).total_seconds() / 60)
|
||||
# logger.debug(contest.start_time)
|
||||
# logger.debug(submission.create_time)
|
||||
# logger.debug((submission.create_time - contest.start_time).total_seconds())
|
||||
# logger.debug(int((submission.create_time - contest.start_time).total_seconds() / 60))
|
||||
contest_submission.ac_time = int((submission.create_time - contest.start_time).total_seconds() / 60)
|
||||
contest_submission.total_time += contest_submission.ac_time
|
||||
# 标记为已经通过
|
||||
contest_submission.ac = True
|
||||
# contest problem ac 计数器加1
|
||||
|
||||
@ -54,6 +54,7 @@ urlpatterns = [
|
||||
url(r'^api/submission/$', SubmissionAPIView.as_view(), name="submission_api"),
|
||||
url(r'^api/group_join/$', JoinGroupAPIView.as_view(), name="group_join_api"),
|
||||
|
||||
url(r'^api/admin/up_load_image/$', SimditorImageUploadAPIView.as_view(), name="simditor_upload_image"),
|
||||
url(r'^api/admin/announcement/$', AnnouncementAdminAPIView.as_view(), name="announcement_admin_api"),
|
||||
url(r'^api/admin/contest/$', ContestAdminAPIView.as_view(), name="contest_admin_api"),
|
||||
url(r'^api/admin/user/$', UserAdminAPIView.as_view(), name="user_admin_api"),
|
||||
@ -113,5 +114,6 @@ urlpatterns = [
|
||||
url(r'^help/$', TemplateView.as_view(template_name="utils/help.html"), name="help_page"),
|
||||
|
||||
url(r'^api/submission/share/$', SubmissionShareAPIView.as_view(), name="submission_share_api"),
|
||||
url(r'^api/admin/up_load_image/$', SimditorImageUploadAPIView.as_view(), name="simditor_upload_image"),
|
||||
|
||||
url(r'^captcha/$', "utils.captcha.views.show_captcha", name="show_captcha"),
|
||||
]
|
||||
|
||||
@ -8,4 +8,5 @@ celery
|
||||
gunicorn
|
||||
coverage
|
||||
django-extensions
|
||||
supervisor
|
||||
supervisor
|
||||
pillow
|
||||
BIN
static/src/img/ZeroClipboard.swf
Executable file
BIN
static/src/img/ZeroClipboard.swf
Executable file
Binary file not shown.
BIN
static/src/img/favicon.ico
Normal file
BIN
static/src/img/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
@ -1,13 +1,22 @@
|
||||
require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, csrfTokenHeader) {
|
||||
|
||||
function refresh_captcha(){
|
||||
$("#captcha-img")[0].src = "/captcha/?" + Math.random();
|
||||
$("#captcha")[0].value = "";
|
||||
}
|
||||
$("#captcha-img").click(function(){
|
||||
refresh_captcha();
|
||||
});
|
||||
|
||||
$('form').validator().on('submit', function (e) {
|
||||
e.preventDefault();
|
||||
var newPassword = $("#new_password ").val();
|
||||
var password = $("#password").val();
|
||||
var captcha = $("#captcha").val();
|
||||
$.ajax({
|
||||
beforeSend: csrfTokenHeader,
|
||||
url: "/api/change_password/",
|
||||
data: {new_password: newPassword, old_password: password},
|
||||
data: {new_password: newPassword, old_password: password, captcha: captcha},
|
||||
dataType: "json",
|
||||
method: "post",
|
||||
success: function (data) {
|
||||
@ -15,6 +24,7 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c
|
||||
window.location.href = "/login/";
|
||||
}
|
||||
else {
|
||||
refresh_captcha();
|
||||
bsAlert(data.data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,183 +1,189 @@
|
||||
require(["jquery", "codeMirror", "csrfToken", "bsAlert"], function ($, codeMirror, csrfTokenHeader, bsAlert) {
|
||||
var codeEditorSelector = $("#code-editor")[0];
|
||||
// 部分界面逻辑会隐藏代码输入框,先判断有没有。
|
||||
if (codeEditorSelector == undefined) {
|
||||
return;
|
||||
}
|
||||
var codeEditor = codeMirror(codeEditorSelector, "text/x-csrc");
|
||||
var language = $("input[name='language'][checked]").val();
|
||||
var submissionId;
|
||||
|
||||
$("input[name='language']").change(function () {
|
||||
language = this.value;
|
||||
var languageTypes = {"1": "text/x-csrc", "2": "text/x-c++src", "3": "text/x-java"};
|
||||
codeEditor.setOption("mode", languageTypes[language]);
|
||||
});
|
||||
|
||||
$("#show-more-btn").click(function () {
|
||||
$(".hide").attr("class", "problem-section");
|
||||
$("#show-more-btn").hide();
|
||||
});
|
||||
|
||||
function showLoading() {
|
||||
$("#submit-code-button").attr("disabled", "disabled");
|
||||
$("#loading-gif").show();
|
||||
}
|
||||
|
||||
function hideLoading() {
|
||||
$("#submit-code-button").removeAttr("disabled");
|
||||
$("#loading-gif").hide();
|
||||
}
|
||||
|
||||
function getResultHtml(data) {
|
||||
// 0 结果正确 1 运行错误 2 超时 3 超内存 4 编译错误
|
||||
// 5 格式错误 6 结果错误 7 系统错误 8 等待判题
|
||||
var results = {
|
||||
0: {"alert_class": "success", message: "Accepted"},
|
||||
1: {"alert_class": "danger", message: "Runtime Error"},
|
||||
2: {"alert_class": "warning", message: "Time Limit Exceeded"},
|
||||
3: {"alert_class": "warning", message: "Memory Limit Exceeded"},
|
||||
4: {"alert_class": "danger", message: "Compile Error"},
|
||||
5: {"alert_class": "warning", message: "Format Error"},
|
||||
6: {"alert_class": "danger", message: "Wrong Answer"},
|
||||
7: {"alert_class": "danger", message: "System Error"},
|
||||
8: {"alert_class": "info", message: "Waiting"}
|
||||
};
|
||||
|
||||
var html = '<div class="alert alert-' +
|
||||
results[data.result].alert_class + ' result"' +
|
||||
' role="alert">' +
|
||||
'<div class="alert-link">' +
|
||||
results[data.result].message +
|
||||
'! ';
|
||||
if (!data.result) {
|
||||
html += "CPU time: " + data.accepted_answer_time + "ms ";
|
||||
}
|
||||
html += ('<a href="/submission/' + submissionId + '/" target="_blank">查看详情</a></div> </div>');
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
var counter = 0;
|
||||
|
||||
function getResult() {
|
||||
if (counter++ > 10) {
|
||||
hideLoading();
|
||||
bsAlert("抱歉,服务器可能出现了故障,请稍后到我的提交列表中查看");
|
||||
counter = 0;
|
||||
require(["jquery", "codeMirror", "csrfToken", "bsAlert", "ZeroClipboard"],
|
||||
function ($, codeMirror, csrfTokenHeader, bsAlert, ZeroClipboard) {
|
||||
var codeEditorSelector = $("#code-editor")[0];
|
||||
// 部分界面逻辑会隐藏代码输入框,先判断有没有。
|
||||
if (codeEditorSelector == undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 提供点击复制到剪切板的功能
|
||||
ZeroClipboard.config({swfPath: "/static/img/ZeroClipboard.swf"});
|
||||
new ZeroClipboard($(".copy-sample"));
|
||||
|
||||
var codeEditor = codeMirror(codeEditorSelector, "text/x-csrc");
|
||||
var language = $("input[name='language'][checked]").val();
|
||||
var submissionId;
|
||||
|
||||
$("input[name='language']").change(function () {
|
||||
language = this.value;
|
||||
var languageTypes = {"1": "text/x-csrc", "2": "text/x-c++src", "3": "text/x-java"};
|
||||
codeEditor.setOption("mode", languageTypes[language]);
|
||||
});
|
||||
|
||||
$("#show-more-btn").click(function () {
|
||||
$(".hide").attr("class", "problem-section");
|
||||
$("#show-more-btn").hide();
|
||||
});
|
||||
|
||||
function showLoading() {
|
||||
$("#submit-code-button").attr("disabled", "disabled");
|
||||
$("#loading-gif").show();
|
||||
}
|
||||
|
||||
function hideLoading() {
|
||||
$("#submit-code-button").removeAttr("disabled");
|
||||
$("#loading-gif").hide();
|
||||
}
|
||||
|
||||
function getResultHtml(data) {
|
||||
// 0 结果正确 1 运行错误 2 超时 3 超内存 4 编译错误
|
||||
// 5 格式错误 6 结果错误 7 系统错误 8 等待判题
|
||||
var results = {
|
||||
0: {"alert_class": "success", message: "Accepted"},
|
||||
1: {"alert_class": "danger", message: "Runtime Error"},
|
||||
2: {"alert_class": "warning", message: "Time Limit Exceeded"},
|
||||
3: {"alert_class": "warning", message: "Memory Limit Exceeded"},
|
||||
4: {"alert_class": "danger", message: "Compile Error"},
|
||||
5: {"alert_class": "warning", message: "Format Error"},
|
||||
6: {"alert_class": "danger", message: "Wrong Answer"},
|
||||
7: {"alert_class": "danger", message: "System Error"},
|
||||
8: {"alert_class": "info", message: "Waiting"}
|
||||
};
|
||||
|
||||
var html = '<div class="alert alert-' +
|
||||
results[data.result].alert_class + ' result"' +
|
||||
' role="alert">' +
|
||||
'<div class="alert-link">' +
|
||||
results[data.result].message +
|
||||
'! ';
|
||||
if (!data.result) {
|
||||
html += "CPU time: " + data.accepted_answer_time + "ms ";
|
||||
}
|
||||
html += ('<a href="/submission/' + submissionId + '/" target="_blank">查看详情</a></div> </div>');
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
var counter = 0;
|
||||
|
||||
function getResult() {
|
||||
if (counter++ > 10) {
|
||||
hideLoading();
|
||||
bsAlert("抱歉,服务器可能出现了故障,请稍后到我的提交列表中查看");
|
||||
counter = 0;
|
||||
return;
|
||||
}
|
||||
$.ajax({
|
||||
url: "/api/submission/?submission_id=" + submissionId,
|
||||
method: "get",
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (!data.code) {
|
||||
// 8是还没有完成判题
|
||||
if (data.data.result == 8) {
|
||||
// 1秒之后重新去获取
|
||||
setTimeout(getResult, 1000);
|
||||
}
|
||||
else {
|
||||
counter = 0;
|
||||
hideLoading();
|
||||
$("#result").html(getResultHtml(data.data));
|
||||
}
|
||||
}
|
||||
else {
|
||||
bsAlert(data.data);
|
||||
hideLoading();
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function guessLanguage(code) {
|
||||
//cpp
|
||||
if (code.indexOf("using namespace std") > -1) {
|
||||
return "2";
|
||||
}
|
||||
//c
|
||||
if (code.indexOf("printf") > -1) {
|
||||
return "1";
|
||||
}
|
||||
//java
|
||||
if (code.indexOf("public class Main")) {
|
||||
return "3";
|
||||
}
|
||||
}
|
||||
|
||||
$("#submit-code-button").click(function () {
|
||||
|
||||
var code = codeEditor.getValue();
|
||||
|
||||
if (!code.trim()) {
|
||||
bsAlert("请填写代码!");
|
||||
hideLoading();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (guessLanguage(code) != language) {
|
||||
if (!confirm("您选择的代码语言可能存在错误,是否继续提交?")) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (location.href.indexOf("contest") > -1) {
|
||||
var problemId = location.pathname.split("/")[4];
|
||||
var contestId = location.pathname.split("/")[2];
|
||||
var url = "/api/contest/submission/";
|
||||
var data = {
|
||||
problem_id: problemId,
|
||||
language: language,
|
||||
code: code,
|
||||
contest_id: contestId
|
||||
};
|
||||
}
|
||||
else {
|
||||
var problemId = window.location.pathname.split("/")[2];
|
||||
var url = "/api/submission/";
|
||||
var data = {
|
||||
problem_id: problemId,
|
||||
language: language,
|
||||
code: code
|
||||
};
|
||||
}
|
||||
|
||||
showLoading();
|
||||
|
||||
$("#result").html("");
|
||||
|
||||
$.ajax({
|
||||
beforeSend: csrfTokenHeader,
|
||||
url: url,
|
||||
method: "post",
|
||||
data: JSON.stringify(data),
|
||||
contentType: "application/json",
|
||||
success: function (data) {
|
||||
if (!data.code) {
|
||||
submissionId = data.data.submission_id;
|
||||
// 获取到id 之后2秒去查询一下判题结果
|
||||
setTimeout(getResult, 2000);
|
||||
}
|
||||
else {
|
||||
bsAlert(data.data);
|
||||
hideLoading();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
$.ajax({
|
||||
url: "/api/submission/?submission_id=" + submissionId,
|
||||
url: "/api/user/",
|
||||
method: "get",
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (!data.code) {
|
||||
// 8是还没有完成判题
|
||||
if (data.data.result == 8) {
|
||||
// 1秒之后重新去获取
|
||||
setTimeout(getResult, 1000);
|
||||
}
|
||||
else {
|
||||
counter = 0;
|
||||
hideLoading();
|
||||
$("#result").html(getResultHtml(data.data));
|
||||
}
|
||||
}
|
||||
else {
|
||||
bsAlert(data.data);
|
||||
hideLoading();
|
||||
if (data.code) {
|
||||
$("#submit-code-button").attr("disabled", "disabled");
|
||||
$("#result").html('<div class="alert alert-danger" role="alert"><div class="alert-link">请先<a href="/login/" target="_blank">登录</a>!</div> </div>');
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function guessLanguage(code) {
|
||||
//cpp
|
||||
if (code.indexOf("using namespace std") > -1) {
|
||||
return "2";
|
||||
}
|
||||
//c
|
||||
if (code.indexOf("printf") > -1) {
|
||||
return "1";
|
||||
}
|
||||
//java
|
||||
if (code.indexOf("public class Main")) {
|
||||
return "3";
|
||||
}
|
||||
}
|
||||
|
||||
$("#submit-code-button").click(function () {
|
||||
|
||||
var code = codeEditor.getValue();
|
||||
|
||||
if (!code.trim()) {
|
||||
bsAlert("请填写代码!");
|
||||
hideLoading();
|
||||
return false;
|
||||
}
|
||||
|
||||
if(guessLanguage(code) != language){
|
||||
if(!confirm("您选择的代码语言可能存在错误,是否继续提交?")){
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (location.href.indexOf("contest") > -1) {
|
||||
var problemId = location.pathname.split("/")[4];
|
||||
var contestId = location.pathname.split("/")[2];
|
||||
var url = "/api/contest/submission/";
|
||||
var data = {
|
||||
problem_id: problemId,
|
||||
language: language,
|
||||
code: code,
|
||||
contest_id: contestId
|
||||
};
|
||||
}
|
||||
else {
|
||||
var problemId = window.location.pathname.split("/")[2];
|
||||
var url = "/api/submission/";
|
||||
var data = {
|
||||
problem_id: problemId,
|
||||
language: language,
|
||||
code: code
|
||||
};
|
||||
}
|
||||
|
||||
showLoading();
|
||||
|
||||
$("#result").html("");
|
||||
|
||||
$.ajax({
|
||||
beforeSend: csrfTokenHeader,
|
||||
url: url,
|
||||
method: "post",
|
||||
data: JSON.stringify(data),
|
||||
contentType: "application/json",
|
||||
success: function (data) {
|
||||
if (!data.code) {
|
||||
submissionId = data.data.submission_id;
|
||||
// 获取到id 之后2秒去查询一下判题结果
|
||||
setTimeout(getResult, 2000);
|
||||
}
|
||||
else {
|
||||
bsAlert(data.data);
|
||||
hideLoading();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
$.ajax({
|
||||
url: "/api/user/",
|
||||
method: "get",
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.code) {
|
||||
$("#submit-code-button").attr("disabled", "disabled");
|
||||
$("#result").html('<div class="alert alert-danger" role="alert"><div class="alert-link">请先<a href="/login/" target="_blank">登录</a>!</div> </div>');
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
@ -20,6 +20,7 @@ var require = {
|
||||
bootstrap: "lib/bootstrap/bootstrap",
|
||||
datetimePicker: "lib/datetime_picker/bootstrap-datetimepicker.zh-CN",
|
||||
validator: "lib/validator/validator",
|
||||
ZeroClipboard: "lib/ZeroClipboard/ZeroClipboard",
|
||||
|
||||
|
||||
// ------ 下面写的都不要直接用,而是使用上面的封装版本 ------
|
||||
|
||||
2610
static/src/js/lib/ZeroClipboard/ZeroClipboard.js
Executable file
2610
static/src/js/lib/ZeroClipboard/ZeroClipboard.js
Executable file
File diff suppressed because it is too large
Load Diff
@ -17,7 +17,13 @@
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="confirm_password">确认密码</label>
|
||||
<input type="password" class="form-control input-lg" id="confirm_password" name="confirm_password" placeholder="确认密码" maxlength="30" data-match="#new_password" data-match-error="两个密码不一致" require>
|
||||
<input type="password" class="form-control input-lg" id="confirm_password" name="confirm_password" placeholder="确认密码" maxlength="30" data-match="#new_password" data-match-error="两个密码不一致" required>
|
||||
<div class="help-block with-errors"></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="confirm_password">验证码</label>
|
||||
<img src="/captcha/" id="captcha-img">
|
||||
<input type="text" class="form-control input-lg" id="captcha" name="captcha" placeholder="验证码" maxlength="4" required>
|
||||
<div class="help-block with-errors"></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
<title>青岛大学在线评测平台 - 首页</title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/static/css/fullpage/jquery.fullPage.css">
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico">
|
||||
<style>
|
||||
html, textarea, input, option, select, button {
|
||||
font: 1em "Helvetica Neue", Helvetica, "Lantinghei SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑",
|
||||
|
||||
@ -71,7 +71,7 @@
|
||||
<button class="btn btn-primary" id="share-code-btn">分享我的代码</button>
|
||||
{% endif %}
|
||||
<textarea class="form-control" id="share-code-textarea"
|
||||
{% if not submission.shared %}style="display: none" {% endif %}>【{{ problem.title }}】- {{ request.user.username }}的提交
|
||||
{% if not submission.shared %}style="display: none" {% endif %}>{{ problem.title }}
|
||||
{{ request.build_absolute_uri }}</textarea>
|
||||
</div>
|
||||
{% endifequal %}
|
||||
|
||||
@ -34,6 +34,7 @@
|
||||
{% for item in samples %}
|
||||
<div class="problem-section">
|
||||
<label class="problem-label">样例输入{{ forloop.counter }}</label>
|
||||
<a href="javascript:void(0)" class="copy-sample" data-clipboard-text="{{ item.input }}">复制</a>
|
||||
<pre>
|
||||
{{ item.input }}</pre>
|
||||
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="renderer" content="webkit">
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico">
|
||||
|
||||
<title>在线评测系统</title>
|
||||
|
||||
|
||||
8
utils/captcha/views.py
Normal file
8
utils/captcha/views.py
Normal file
@ -0,0 +1,8 @@
|
||||
# coding=utf-8
|
||||
from django.http import HttpResponse
|
||||
|
||||
from utils.captcha import Captcha
|
||||
|
||||
|
||||
def show_captcha(request):
|
||||
return HttpResponse(Captcha(request).display(), content_type="image/gif")
|
||||
@ -33,8 +33,14 @@ def get_contest_submission_problem_detail(contest_problem, my_submission):
|
||||
if contest_problem.id in my_submission:
|
||||
submission = my_submission[contest_problem.id]
|
||||
if submission.ac:
|
||||
return u"\n 时间: " + str(submission.total_time) + u" min"
|
||||
return ""
|
||||
# 只提交了一次就AC
|
||||
if submission.total_submission_number == 1:
|
||||
return str(submission.ac_time) + " min"
|
||||
else:
|
||||
return "20 min × " + str(submission.total_submission_number - 1) + " WA + " + str(submission.ac_time) + " min"
|
||||
return str(submission.total_submission_number) + " WA"
|
||||
else:
|
||||
return ""
|
||||
|
||||
|
||||
def get_submission_problem_result_class(contest_problem, my_submission):
|
||||
|
||||
Loading…
Reference in New Issue
Block a user