Merge branch 'dev' into hohoTT-dev

This commit is contained in:
hohoTT 2015-09-10 12:25:41 +08:00
commit 94ba74d9ee
5 changed files with 86 additions and 14 deletions

View File

@ -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"),
] ]

View File

@ -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;
} }

View File

@ -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)

View File

@ -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)

View File

@ -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 %}