diff --git a/oj/custom_settings.example.py b/oj/custom_settings.example.py index 174e6945..4607c0c9 100644 --- a/oj/custom_settings.example.py +++ b/oj/custom_settings.example.py @@ -14,6 +14,11 @@ SMTP_CONFIG = {"smtp_server": "smtp.domain.com", "password": "your_password", "tls": False} + +# 是否显示所有人的提交, False就只显示自己的 +SHOW_ALL_SUBMISSIONS_LIST = False + + # please set your own SECRET_KEY to a long random string # SECRET_KEY = "" diff --git a/oj/settings.py b/oj/settings.py index 0d120afc..847c19e5 100644 --- a/oj/settings.py +++ b/oj/settings.py @@ -189,6 +189,3 @@ TOKEN_BUCKET_DEFAULT_CAPACITY = 50 # 单位:每分钟 TOKEN_BUCKET_FILL_RATE = 2 - -# 是否显示所有人的提交, False就只显示自己的 -SHOW_ALL_SUBMISSIONS_LIST = False diff --git a/oj/urls.py b/oj/urls.py index 388f0cf4..171ebd06 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -104,8 +104,8 @@ urlpatterns = [ url(r'^api/open/submission/$', OpenAPISubmitCodeAPI.as_view(), name="openapi_submit_code"), url(r'^submission/(?P\w+)/$', "submission.views.my_submission", name="my_submission_page"), - url(r'^submissions/$', "submission.views.my_submission_list_page", name="my_submission_list_page"), - url(r'^submissions/(?P\d+)/$', "submission.views.my_submission_list_page", name="my_submission_list_page"), + url(r'^submissions/$', "submission.views.submission_list_page", name="submission_list_page"), + url(r'^submissions/(?P\d+)/$', "submission.views.submission_list_page", name="my_submission_list_page"), url(r'^contest/(?P\d+)/rank/$', "contest.views.contest_rank_page", name="contest_rank_page"), diff --git a/submission/views.py b/submission/views.py index 701f8051..a617f6e9 100644 --- a/submission/views.py +++ b/submission/views.py @@ -15,7 +15,8 @@ from account.models import SUPER_ADMIN, User from problem.models import Problem from contest.models import ContestProblem, Contest from contest.decorators import check_user_contest_permission -from utils.shortcuts import serializer_invalid_response, error_response, success_response, error_page, paginate +from utils.shortcuts import (serializer_invalid_response, error_response, + success_response, error_page, paginate, build_query_string) from utils.throttling import TokenBucket, BucketController from judge.result import result as judge_result from .tasks import _judge @@ -238,28 +239,42 @@ class SubmissionAdminAPIView(APIView): @login_required -def my_submission_list_page(request, page=1): +def submission_list_page(request, page=1): """ - 我的所有提交的列表页 + 所有提交的列表页 """ # 是否显示所有人的提交 - show_all = settings.SHOW_ALL_SUBMISSIONS_LIST or request.GET.get("show_all", False) == "true" + show_all = False + submission_filter = {"my": None} + + # 兼容部分版本,设置中没有这一项 + try: + show_all = settings.SHOW_ALL_SUBMISSIONS_LIST + except Exception: + pass + + # url中my=true可以只显示自己的 + if request.GET.get("my", None) == "true": + submission_filter["my"] = "true" + show_all = False + if show_all: submissions = Submission.objects.filter(contest_id__isnull=True) else: submissions = Submission.objects.filter(user_id=request.user.id, contest_id__isnull=True) + submissions = submissions.values("id", "user_id", "problem_id", "result", "create_time", "accepted_answer_time", "language").order_by("-create_time") language = request.GET.get("language", None) - filter = None if language: submissions = submissions.filter(language=int(language)) - filter = {"name": "language", "content": language} + submission_filter["language"] = language + result = request.GET.get("result", None) if result: submissions = submissions.filter(result=int(result)) - filter = {"name": "result", "content": result} + submission_filter["result"] = result paginator = Paginator(submissions, 20) try: @@ -298,10 +313,12 @@ def my_submission_list_page(request, page=1): except Exception: pass - return render(request, "oj/submission/my_submissions_list.html", + return render(request, "oj/submission/submissions_list.html", {"submissions": submissions, "page": int(page), "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, - "filter": filter, "show_all": show_all}) + "query": build_query_string(submission_filter), + "submission_filter": submission_filter, + "show_all": show_all}) class SubmissionShareAPIView(APIView): diff --git a/template/src/oj/submission/my_submissions_list.html b/template/src/oj/submission/submissions_list.html similarity index 76% rename from template/src/oj/submission/my_submissions_list.html rename to template/src/oj/submission/submissions_list.html index 2bce9726..e67ab684 100644 --- a/template/src/oj/submission/my_submissions_list.html +++ b/template/src/oj/submission/submissions_list.html @@ -20,9 +20,9 @@ 语言 @@ -35,13 +35,13 @@ 结果 @@ -86,12 +86,12 @@ diff --git a/template/src/oj_base.html b/template/src/oj_base.html index c7dace8c..3f709f24 100644 --- a/template/src/oj_base.html +++ b/template/src/oj_base.html @@ -70,7 +70,7 @@ {% endif %}
  • 我的主页
  • -
  • 我的提交
  • +
  • 我的提交
  • 设置
  • 退出
  • diff --git a/utils/shortcuts.py b/utils/shortcuts.py index 83b95673..2f5906bb 100644 --- a/utils/shortcuts.py +++ b/utils/shortcuts.py @@ -110,4 +110,18 @@ def paginate(request, query_set, object_serializer=None): def rand_str(length=32): if length > 128: raise ValueError("length must <= 128") - return hashlib.sha512(os.urandom(128)).hexdigest()[0:length] \ No newline at end of file + return hashlib.sha512(os.urandom(128)).hexdigest()[0:length] + + +def build_query_string(kv_data, ignore_none=True): + # {"a": 1, "b": "test"} -> "?a=1&b=test" + query_string = "" + for k, v in kv_data.iteritems(): + if ignore_none is True and kv_data[k] is None: + continue + if query_string != "": + query_string += "&" + else: + query_string = "?" + query_string += (k + "=" + str(v)) + return query_string