mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 08:23:20 +00:00
Merge branch 'dev' of git.coding.net:virusdefender/qduoj into dev
update dev
This commit is contained in:
commit
60f911e421
@ -16,7 +16,7 @@ from group.views import (GroupAdminAPIView, GroupMemberAdminAPIView,
|
|||||||
from admin.views import AdminTemplateView
|
from admin.views import AdminTemplateView
|
||||||
|
|
||||||
from problem.views import TestCaseUploadAPIView, ProblemTagAdminAPIView, ProblemAdminAPIView
|
from problem.views import TestCaseUploadAPIView, ProblemTagAdminAPIView, ProblemAdminAPIView
|
||||||
from submission.views import SubmissionAPIView, SubmissionAdminAPIView
|
from submission.views import SubmissionAPIView, SubmissionAdminAPIView, SubmissionShareAPIView
|
||||||
from contest_submission.views import ContestSubmissionAPIView, ContestSubmissionAdminAPIView
|
from contest_submission.views import ContestSubmissionAPIView, ContestSubmissionAdminAPIView
|
||||||
from monitor.views import QueueLengthMonitorAPIView
|
from monitor.views import QueueLengthMonitorAPIView
|
||||||
|
|
||||||
@ -110,4 +110,6 @@ urlpatterns = [
|
|||||||
|
|
||||||
url(r'^about/$', TemplateView.as_view(template_name="utils/about.html"), name="about_page"),
|
url(r'^about/$', TemplateView.as_view(template_name="utils/about.html"), name="about_page"),
|
||||||
url(r'^help/$', TemplateView.as_view(template_name="utils/help.html"), name="help_page"),
|
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"),
|
||||||
]
|
]
|
||||||
|
@ -95,4 +95,12 @@ li.list-group-item {
|
|||||||
|
|
||||||
.contest-tab{
|
.contest-tab{
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#share-code{
|
||||||
|
margin-top: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#share-code textarea {
|
||||||
|
margin-top: 15px;
|
||||||
}
|
}
|
@ -22,3 +22,7 @@ class SubmissionSerializer(serializers.ModelSerializer):
|
|||||||
return User.objects.get(id=obj.user_id).username
|
return User.objects.get(id=obj.user_id).username
|
||||||
|
|
||||||
|
|
||||||
|
class SubmissionhareSerializer(serializers.Serializer):
|
||||||
|
submission_id = serializers.CharField(max_length=40)
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,14 +12,15 @@ from judge.judger_controller.settings import redis_config
|
|||||||
from account.decorators import login_required
|
from account.decorators import login_required
|
||||||
from account.models import SUPER_ADMIN
|
from account.models import SUPER_ADMIN
|
||||||
|
|
||||||
|
|
||||||
from problem.models import Problem
|
from problem.models import Problem
|
||||||
from contest.models import ContestProblem
|
from contest.models import ContestProblem, Contest
|
||||||
|
|
||||||
from utils.shortcuts import serializer_invalid_response, error_response, success_response, error_page, paginate
|
|
||||||
from .models import Submission
|
|
||||||
from .serializers import CreateSubmissionSerializer, SubmissionSerializer
|
|
||||||
from announcement.models import Announcement
|
from announcement.models import Announcement
|
||||||
|
from utils.shortcuts import serializer_invalid_response, error_response, success_response, error_page, paginate
|
||||||
|
|
||||||
|
from .models import Submission
|
||||||
|
from .serializers import CreateSubmissionSerializer, SubmissionSerializer, SubmissionhareSerializer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SubmissionAPIView(APIView):
|
class SubmissionAPIView(APIView):
|
||||||
@login_required
|
@login_required
|
||||||
@ -87,20 +88,35 @@ def problem_my_submissions_list_page(request, problem_id):
|
|||||||
{"submissions": submissions, "problem": problem})
|
{"submissions": submissions, "problem": problem})
|
||||||
|
|
||||||
|
|
||||||
|
def _get_submission(submission_id, user):
|
||||||
|
"""
|
||||||
|
判断用户权限 看能否获取这个提交详情页面
|
||||||
|
"""
|
||||||
|
submission = Submission.objects.get(id=submission_id)
|
||||||
|
# 超级管理员或者提交者自己或者是一个分享的提交
|
||||||
|
if user.admin_type == SUPER_ADMIN or submission.user_id == user.id or submission.shared:
|
||||||
|
return submission
|
||||||
|
if submission.contest_id:
|
||||||
|
contest = Contest.objects.get(id=submission.contest_id)
|
||||||
|
# 比赛提交的话,比赛创建者也可见
|
||||||
|
if contest.created_by == user:
|
||||||
|
return submission
|
||||||
|
raise Submission.DoesNotExist
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def my_submission(request, submission_id):
|
def my_submission(request, submission_id):
|
||||||
"""
|
"""
|
||||||
单个题目的提交详情页
|
单个题目的提交详情页
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
# 超级管理员可以查看所有的提交
|
submission = _get_submission(submission_id, request.user)
|
||||||
if request.user.admin_type != SUPER_ADMIN:
|
|
||||||
submission = Submission.objects.get(id=submission_id, user_id=request.user.id)
|
|
||||||
else:
|
|
||||||
submission = Submission.objects.get(id=submission_id)
|
|
||||||
except Submission.DoesNotExist:
|
except Submission.DoesNotExist:
|
||||||
return error_page(request, u"提交不存在")
|
return error_page(request, u"提交不存在")
|
||||||
|
|
||||||
|
if submission.user_id != request.user.id and not submission.shared:
|
||||||
|
return error_page(request, u"提交不存在")
|
||||||
|
|
||||||
if submission.contest_id:
|
if submission.contest_id:
|
||||||
try:
|
try:
|
||||||
problem = ContestProblem.objects.get(id=submission.problem_id,
|
problem = ContestProblem.objects.get(id=submission.problem_id,
|
||||||
@ -170,4 +186,20 @@ def my_submission_list_page(request, page=1):
|
|||||||
return render(request, "oj/submission/my_submissions_list.html",
|
return render(request, "oj/submission/my_submissions_list.html",
|
||||||
{"submissions": current_page, "page": int(page),
|
{"submissions": current_page, "page": int(page),
|
||||||
"previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20,
|
"previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20,
|
||||||
"announcements": announcements, "filter":filter})
|
"announcements": announcements, "filter":filter})
|
||||||
|
|
||||||
|
|
||||||
|
class SubmissionShareAPIView(APIView):
|
||||||
|
def post(self, request):
|
||||||
|
serializer = SubmissionhareSerializer(data=request.data)
|
||||||
|
if serializer.is_valid():
|
||||||
|
submission_id = serializer.data["submission_id"]
|
||||||
|
try:
|
||||||
|
submission = _get_submission(submission_id, request.user)
|
||||||
|
except Submission.DoesNotExist:
|
||||||
|
return error_response(u"提交不存在")
|
||||||
|
submission.shared = not submission.shared
|
||||||
|
submission.save()
|
||||||
|
return success_response(submission.shared)
|
||||||
|
else:
|
||||||
|
return serializer_invalid_response(serializer)
|
@ -62,12 +62,26 @@
|
|||||||
<div id="code-field">
|
<div id="code-field">
|
||||||
<textarea id="code-editor">{{ submission.code }}</textarea>
|
<textarea id="code-editor">{{ submission.code }}</textarea>
|
||||||
</div>
|
</div>
|
||||||
|
{% ifequal request.user.id submission.user_id %}
|
||||||
|
|
||||||
|
<div id="share-code" class="col-lg-6 col-md-6">
|
||||||
|
{% if submission.shared %}
|
||||||
|
<button class="btn btn-warning" id="share-code-btn">取消分享</button>
|
||||||
|
{% else %}
|
||||||
|
<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 }}的提交
|
||||||
|
{{ request.build_absolute_uri }}</textarea>
|
||||||
|
</div>
|
||||||
|
{% endifequal %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block js_block %}
|
{% block js_block %}
|
||||||
<script>
|
<script>
|
||||||
require(["jquery", "codeMirror"], function ($, codeMirror) {
|
require(["jquery", "codeMirror", "csrfToken"], function ($, codeMirror, csrfTokenHeader) {
|
||||||
{% ifequal submission.language 1 %}
|
{% ifequal submission.language 1 %}
|
||||||
var language = "text/x-csrc";
|
var language = "text/x-csrc";
|
||||||
{% else %}
|
{% else %}
|
||||||
@ -79,6 +93,18 @@
|
|||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
var codeEditor = codeMirror($("#code-editor")[0], language);
|
var codeEditor = codeMirror($("#code-editor")[0], language);
|
||||||
codeEditor.setOption("readOnly", true);
|
codeEditor.setOption("readOnly", true);
|
||||||
|
|
||||||
|
$("#share-code-btn").click(function () {
|
||||||
|
$.ajax({
|
||||||
|
beforeSend: csrfTokenHeader,
|
||||||
|
url: "/api/submission/share/",
|
||||||
|
method: "post",
|
||||||
|
data: {submission_id: location.href.split("/")[4]},
|
||||||
|
success: function(data){
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
Loading…
Reference in New Issue
Block a user