From e913d407fe86e703dd9ccf3806779d65538988b9 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 10 Sep 2015 09:11:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=88=86=E4=BA=AB=E6=88=91?= =?UTF-8?q?=E7=9A=84=E6=8F=90=E4=BA=A4=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oj/urls.py | 4 +- static/src/css/oj.css | 8 ++++ submission/serializers.py | 4 ++ submission/views.py | 56 +++++++++++++++++----- template/src/oj/problem/my_submission.html | 28 ++++++++++- 5 files changed, 86 insertions(+), 14 deletions(-) diff --git a/oj/urls.py b/oj/urls.py index d7bbd6f3..a5582d26 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -16,7 +16,7 @@ from group.views import (GroupAdminAPIView, GroupMemberAdminAPIView, from admin.views import AdminTemplateView 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 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'^help/$', TemplateView.as_view(template_name="utils/help.html"), name="help_page"), + + url(r'^api/submission/share/$', SubmissionShareAPIView.as_view(), name="submission_share_api"), ] diff --git a/static/src/css/oj.css b/static/src/css/oj.css index a5dc8928..f75723be 100644 --- a/static/src/css/oj.css +++ b/static/src/css/oj.css @@ -95,4 +95,12 @@ li.list-group-item { .contest-tab{ margin-bottom: 15px; +} + +#share-code{ + margin-top: 15px; +} + +#share-code textarea { + margin-top: 15px; } \ No newline at end of file diff --git a/submission/serializers.py b/submission/serializers.py index 81704860..8fd62787 100644 --- a/submission/serializers.py +++ b/submission/serializers.py @@ -22,3 +22,7 @@ class SubmissionSerializer(serializers.ModelSerializer): return User.objects.get(id=obj.user_id).username +class SubmissionhareSerializer(serializers.Serializer): + submission_id = serializers.CharField(max_length=40) + + diff --git a/submission/views.py b/submission/views.py index 6180f8e2..984cb724 100644 --- a/submission/views.py +++ b/submission/views.py @@ -12,14 +12,15 @@ from judge.judger_controller.settings import redis_config from account.decorators import login_required from account.models import SUPER_ADMIN - from problem.models import Problem -from contest.models import ContestProblem - -from utils.shortcuts import serializer_invalid_response, error_response, success_response, error_page, paginate -from .models import Submission -from .serializers import CreateSubmissionSerializer, SubmissionSerializer +from contest.models import ContestProblem, Contest 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): @login_required @@ -87,20 +88,35 @@ def problem_my_submissions_list_page(request, problem_id): {"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 def my_submission(request, submission_id): """ 单个题目的提交详情页 """ try: - # 超级管理员可以查看所有的提交 - 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) + submission = _get_submission(submission_id, request.user) except Submission.DoesNotExist: 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: try: 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", {"submissions": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, - "announcements": announcements, "filter":filter}) \ No newline at end of file + "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) \ No newline at end of file diff --git a/template/src/oj/problem/my_submission.html b/template/src/oj/problem/my_submission.html index c60c146d..cb7df853 100644 --- a/template/src/oj/problem/my_submission.html +++ b/template/src/oj/problem/my_submission.html @@ -62,12 +62,26 @@
+ {% ifequal request.user.id submission.user_id %} + +
+ {% if submission.shared %} + + {% else %} + + {% endif %} + +
+ {% endifequal %} + {% endblock %} {% block js_block %} {% endblock %} \ No newline at end of file