diff --git a/account/tests.py b/account/tests.py index a75d2c5..f8cc9d0 100644 --- a/account/tests.py +++ b/account/tests.py @@ -369,3 +369,18 @@ class AdminRequiredDecoratorTest(TestCase): self.client.login(username="test", password="test") response = self.client.get("/admin_required_test/cbv/1024/") self.assertEqual(response.content, "1024") + + +class UserLogoutTest(TestCase): + def setUp(self): + self.client = Client() + user = User.objects.create(username="test") + user.admin_type = 1 + user.set_password("1") + user.save() + + def logout_success(self): + self.client = Client() + self.client.login(username="test", password="1") + response = self.client.get("/logout/") + self.assertEqual(response.status_code, 302) diff --git a/account/views.py b/account/views.py index f2c6ca3..89197ae 100644 --- a/account/views.py +++ b/account/views.py @@ -1,4 +1,5 @@ # coding=utf-8 +from django import http from django.contrib import auth from django.shortcuts import render from django.db.models import Q @@ -35,6 +36,10 @@ class UserLoginAPIView(APIView): return serializer_invalid_response(serializer) +def logout(request): + auth.logout(request) + return http.HttpResponseRedirect("/") + class UserRegisterAPIView(APIView): def post(self, request): """ diff --git a/contest/views.py b/contest/views.py index 32db995..ac17539 100644 --- a/contest/views.py +++ b/contest/views.py @@ -342,7 +342,7 @@ def contest_list_page(request, page=1): # 筛选我能参加的比赛 join = request.GET.get("join", None) if join: - contests = Contest.objects.filter(Q(contest_type__in=[1, 2]) | Q(groups__in=request.user.group_set.all())).\ + contests = contests.filter(Q(contest_type__in=[1, 2]) | Q(groups__in=request.user.group_set.all())).\ filter(end_time__gt=datetime.datetime.now(), start_time__lt=datetime.datetime.now()) paginator = Paginator(contests, 20) diff --git a/contest_submission/tests.py b/contest_submission/tests.py index a67a045..debd64b 100644 --- a/contest_submission/tests.py +++ b/contest_submission/tests.py @@ -87,3 +87,76 @@ class ContestProblemMySubmissionListTest(TestCase): contest=self.global_contest, sort_index="a") + +class SubmissionAPITest(APITestCase): + def setUp(self): + self.client = APIClient() + self.url = reverse('contest_submission_admin_api_view') + self.userA = User.objects.create(username="test1", admin_type=ADMIN) + self.userA.set_password("testaa") + self.userA.save() + self.userS = User.objects.create(username="test2", admin_type=SUPER_ADMIN) + self.userS.set_password("testbb") + self.userS.save() + self.global_contest = Contest.objects.create(title="titlex", description="descriptionx", mode=1, + contest_type=2, show_rank=True, show_user_submission=True, + start_time="2015-08-15T10:00:00.000Z", + end_time="2015-08-15T12:00:00.000Z", + password="aacc", created_by=self.userS + ) + self.problem = ContestProblem.objects.create(title="title1", + description="description1", + input_description="input1_description", + output_description="output1_description", + test_case_id="1", + sort_index="1", + samples=json.dumps([{"input": "1 1", "output": "2"}]), + time_limit=100, + memory_limit=1000, + hint="hint1", + contest=self.global_contest, + created_by=self.userS) + self.submission = Submission.objects.create(user_id=self.userA.id, + language=1, + code='#include "stdio.h"\nint main(){\n\treturn 0;\n}', + problem_id=self.problem.id) + self.submissionS = Submission.objects.create(user_id=self.userS.id, + language=2, + code='#include "stdio.h"\nint main(){\n\treturn 0;\n}', + problem_id=self.problem.id) + + def test_submission_contest_does_not_exist(self): + self.client.login(username="test2", password="testbb") + response = self.client.get(self.url + "?contest_id=99") + self.assertEqual(response.data["code"], 1) + + def test_submission_contest_parameter_error(self): + self.client.login(username="test2", password="testbb") + response = self.client.get(self.url) + self.assertEqual(response.data["code"], 1) + + def test_submission_access_denied(self): + self.client.login(username="test1", password="testaa") + response = self.client.get(self.url + "?problem_id=" + str(self.problem.id)) + self.assertEqual(response.data["code"], 1) + + def test_submission_access_denied_with_contest_id(self): + self.client.login(username="test1", password="testaa") + response = self.client.get(self.url + "?contest_id=" + str(self.global_contest.id)) + self.assertEqual(response.data["code"], 1) + + def test_get_submission_successfully(self): + self.client.login(username="test2", password="testbb") + response = self.client.get( + self.url + "?contest_id=" + str(self.global_contest.id) + "&problem_id=" + str(self.problem.id)) + self.assertEqual(response.data["code"], 0) + + def test_get_submission_successfully_problem(self): + self.client.login(username="test2", password="testbb") + response = self.client.get(self.url + "?problem_id=" + str(self.problem.id)) + self.assertEqual(response.data["code"], 0) + + def test_get_submission_problem_do_not_exist(self): + self.client.login(username="test2", password="testbb") + response = self.client.get(self.url + "?problem_id=9999") + self.assertEqual(response.data["code"], 1) diff --git a/contest_submission/views.py b/contest_submission/views.py index f871536..d749fcf 100644 --- a/contest_submission/views.py +++ b/contest_submission/views.py @@ -4,15 +4,13 @@ import json import redis from django.shortcuts import render from django.core.paginator import Paginator -from django.core.urlresolvers import reverse from rest_framework.views import APIView -from rest_framework.test import APITestCase, APIClient from judge.judger_controller.tasks import judge from judge.judger_controller.settings import redis_config from account.decorators import login_required -from account.models import User, ADMIN, SUPER_ADMIN +from account.models import SUPER_ADMIN from contest.decorators import check_user_contest_permission @@ -149,76 +147,3 @@ class ContestSubmissionAdminAPIView(APIView): return paginate(request, submissions, SubmissionSerializer) - -class SubmissionAPITest(APITestCase): - def setUp(self): - self.client = APIClient() - self.url = reverse('contest_submission_admin_api_view') - self.userA = User.objects.create(username="test1", admin_type=ADMIN) - self.userA.set_password("testaa") - self.userA.save() - self.userS = User.objects.create(username="test2", admin_type=SUPER_ADMIN) - self.userS.set_password("testbb") - self.userS.save() - self.global_contest = Contest.objects.create(title="titlex", description="descriptionx", mode=1, - contest_type=2, show_rank=True, show_user_submission=True, - start_time="2015-08-15T10:00:00.000Z", - end_time="2015-08-15T12:00:00.000Z", - password="aacc", created_by=self.userS - ) - self.problem = ContestProblem.objects.create(title="title1", - description="description1", - input_description="input1_description", - output_description="output1_description", - test_case_id="1", - sort_index="1", - samples=json.dumps([{"input": "1 1", "output": "2"}]), - time_limit=100, - memory_limit=1000, - hint="hint1", - contest=self.global_contest, - created_by=self.userS) - self.submission = Submission.objects.create(user_id=self.userA.id, - language=1, - code='#include "stdio.h"\nint main(){\n\treturn 0;\n}', - problem_id=self.problem.id) - self.submissionS = Submission.objects.create(user_id=self.userS.id, - language=2, - code='#include "stdio.h"\nint main(){\n\treturn 0;\n}', - problem_id=self.problem.id) - - def test_submission_contest_does_not_exist(self): - self.client.login(username="test2", password="testbb") - response = self.client.get(self.url + "?contest_id=99") - self.assertEqual(response.data["code"], 1) - - def test_submission_contest_parameter_error(self): - self.client.login(username="test2", password="testbb") - response = self.client.get(self.url) - self.assertEqual(response.data["code"], 1) - - def test_submission_access_denied(self): - self.client.login(username="test1", password="testaa") - response = self.client.get(self.url + "?problem_id=" + str(self.problem.id)) - self.assertEqual(response.data["code"], 1) - - def test_submission_access_denied_with_contest_id(self): - self.client.login(username="test1", password="testaa") - response = self.client.get(self.url + "?contest_id=" + str(self.global_contest.id)) - self.assertEqual(response.data["code"], 1) - - def test_get_submission_successfully(self): - self.client.login(username="test2", password="testbb") - response = self.client.get( - self.url + "?contest_id=" + str(self.global_contest.id) + "&problem_id=" + str(self.problem.id)) - self.assertEqual(response.data["code"], 0) - - def test_get_submission_successfully_problem(self): - self.client.login(username="test2", password="testbb") - response = self.client.get(self.url + "?problem_id=" + str(self.problem.id)) - self.assertEqual(response.data["code"], 0) - - def test_get_submission_problem_do_not_exist(self): - self.client.login(username="test2", password="testbb") - response = self.client.get(self.url + "?problem_id=9999") - self.assertEqual(response.data["code"], 1) diff --git a/oj/urls.py b/oj/urls.py index 74a44c2..b3f6929 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -1,11 +1,11 @@ # coding=utf-8 from django.conf.urls import include, url -from django.contrib import admin from django.views.generic import TemplateView from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView, EmailCheckAPIView, UserAdminAPIView, UserInfoAPIView) + from announcement.views import AnnouncementAdminAPIView from contest.views import ContestAdminAPIView, ContestProblemAdminAPIView, ContestPasswordVerifyAPIView @@ -34,6 +34,7 @@ urlpatterns = [ name="admin_template"), url(r'^login/$', TemplateView.as_view(template_name="oj/account/login.html"), name="user_login_page"), + url(r'^logout/$', "account.views.logout", name="user_logout_api"), url(r'^register/$', TemplateView.as_view(template_name="oj/account/register.html"), name="user_register_page"), url(r'^change_password/$', TemplateView.as_view(template_name="oj/account/change_password.html"), diff --git a/submission/tests.py b/submission/tests.py index 16066aa..80fd111 100644 --- a/submission/tests.py +++ b/submission/tests.py @@ -29,6 +29,16 @@ class SubmissionsListPageTest(TestCase): response = self.client.get('/submissions/1/') self.assertEqual(response.status_code, 200) + def test_visit_submissionsListPage_successfully_language_filter(self): + self.client.login(username="gogoing", password="666666") + response = self.client.get('/submissions/?language=1') + self.assertEqual(response.status_code, 200) + + def test_visit_submissionsListPage_successfully_result_filter(self): + self.client.login(username="gogoing", password="666666") + response = self.client.get('/submissions/?result=1') + self.assertEqual(response.status_code, 200) + def test_visit_submissionsListPage_without_page_successfully(self): self.client.login(username="gogoing", password="666666") response = self.client.get('/submissions/') @@ -156,7 +166,7 @@ class SubmissionAdminAPITest(APITestCase): response = self.client.get(self.url) self.assertEqual(response.data, {"code": 1, "data": u"参数错误"}) - def test_problem_does_not_exist(self): + def test_submission_successfully(self): data = {"problem_id": self.problem.id} response = self.client.get(self.url, data=data) self.assertEqual(response.data["code"], 0) @@ -195,5 +205,3 @@ class SubmissionPageTest(TestCase): language=1, code='#include "stdio.h"\nint main(){\n\treturn 0;\n}', problem_id=self.problem.id) - - diff --git a/submission/views.py b/submission/views.py index 17c1615..5c90aca 100644 --- a/submission/views.py +++ b/submission/views.py @@ -12,15 +12,14 @@ from judge.judger_controller.settings import redis_config from account.decorators import login_required from account.models import SUPER_ADMIN -from contest.decorators import check_user_contest_permission from problem.models import Problem -from contest.models import Contest, ContestProblem +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 announcement.models import Announcement class SubmissionAPIView(APIView): @login_required @@ -80,8 +79,10 @@ def problem_my_submissions_list_page(request, problem_id): problem = Problem.objects.get(id=problem_id, visible=True) except Problem.DoesNotExist: return error_page(request, u"问题不存在") + submissions = Submission.objects.filter(user_id=request.user.id, problem_id=problem.id, contest_id__isnull=True).order_by("-create_time"). \ values("id", "result", "create_time", "accepted_answer_time", "language") + return render(request, "oj/problem/my_submissions_list.html", {"submissions": submissions, "problem": problem}) @@ -139,6 +140,15 @@ def my_submission_list_page(request, page=1): """ submissions = Submission.objects.filter(user_id=request.user.id). \ values("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} + result = request.GET.get("result", None) + if result: + submissions = submissions.filter(result=int(result)) + filter = {"name": "result", "content": result} paginator = Paginator(submissions, 20) try: current_page = paginator.page(int(page)) @@ -154,6 +164,10 @@ def my_submission_list_page(request, page=1): except Exception: pass + # 右侧的公告列表 + announcements = Announcement.objects.filter(is_global=True, visible=True).order_by("-create_time") + 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}) \ No newline at end of file + "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, + "announcements": announcements, "filter":filter}) \ No newline at end of file diff --git a/template/src/oj/account/login.html b/template/src/oj/account/login.html index 2f5f7cf..5777fd3 100644 --- a/template/src/oj/account/login.html +++ b/template/src/oj/account/login.html @@ -1,27 +1,33 @@ {% extends "oj_base.html" %} {% block body %} -
-
-

用户登录

+
+
+

用户登录

-
-
- - -
-
-
- - -
-
-
- -
-
-
+
+
+ + + +
+
+
+ + + +
+
+
+ +
+ 还没有帐号?点击注册 + +
+
{% endblock %} {% block js_block %} - + {% endblock %} \ No newline at end of file diff --git a/template/src/oj/announcement/_announcement_panel.html b/template/src/oj/announcement/_announcement_panel.html index f17a9ce..d593626 100644 --- a/template/src/oj/announcement/_announcement_panel.html +++ b/template/src/oj/announcement/_announcement_panel.html @@ -5,8 +5,13 @@ 公告
- {% for item in announcements %} -

{{ forloop.counter }}.  {{ item.title }}

- {% endfor %} + {% if announcements %} + {% for item in announcements %} +

{{ forloop.counter }}.  {{ item.title }} +

+ {% endfor %} + {% else %} +

暂无可显示的公告

+ {% endif %}
\ No newline at end of file diff --git a/template/src/oj/contest/contest_list.html b/template/src/oj/contest/contest_list.html index 1689cee..68d939b 100644 --- a/template/src/oj/contest/contest_list.html +++ b/template/src/oj/contest/contest_list.html @@ -3,7 +3,7 @@ {% load contest %}
-
+
@@ -15,6 +15,7 @@
+ {% if contests %} @@ -47,6 +48,7 @@ {% endfor %}
+
-
+
{% include "oj/announcement/_announcement_panel.html" %}
diff --git a/template/src/oj/contest/contest_problems_list.html b/template/src/oj/contest/contest_problems_list.html index 2a863dd..0289592 100644 --- a/template/src/oj/contest/contest_problems_list.html +++ b/template/src/oj/contest/contest_problems_list.html @@ -26,7 +26,7 @@
-
+
@@ -55,7 +55,7 @@ -
+
{% include "oj/announcement/_announcement_panel.html" %}
diff --git a/template/src/oj/contest/contest_rank.html b/template/src/oj/contest/contest_rank.html index 823b021..7d17134 100644 --- a/template/src/oj/contest/contest_rank.html +++ b/template/src/oj/contest/contest_rank.html @@ -20,6 +20,7 @@
+ {% if result %}
@@ -49,6 +50,9 @@ {% endfor %}
+ {% else %} +

还没有结果

+ {% endif %}
diff --git a/template/src/oj/problem/my_submissions_list.html b/template/src/oj/problem/my_submissions_list.html index fb07a4c..03d7e8c 100644 --- a/template/src/oj/problem/my_submissions_list.html +++ b/template/src/oj/problem/my_submissions_list.html @@ -11,6 +11,7 @@ 我的提交 {% include "oj/problem/_problem_header.html" %} + {% if submissions %} @@ -42,5 +43,8 @@
+ {% else %} +

你还没有提交该题目

+ {% endif %}
{% endblock %} \ No newline at end of file diff --git a/template/src/oj/problem/problem_list.html b/template/src/oj/problem/problem_list.html index a26ae80..247b07f 100644 --- a/template/src/oj/problem/problem_list.html +++ b/template/src/oj/problem/problem_list.html @@ -3,7 +3,7 @@ {% load problem %}
-
+
@@ -54,7 +54,7 @@
-
+
{% include "oj/announcement/_announcement_panel.html" %}
diff --git a/template/src/oj/submission/my_submissions_list.html b/template/src/oj/submission/my_submissions_list.html index ce9f063..2ee5b68 100644 --- a/template/src/oj/submission/my_submissions_list.html +++ b/template/src/oj/submission/my_submissions_list.html @@ -1,58 +1,85 @@ {% extends 'oj_base.html' %} {% block body %} +{% load submission %} +
+
+ + + + + + + + + + + + {% for item in submissions %} + + + + + + + + {% endfor %} - {% load submission %} -
- {% if submissions %} -
#提交时间 + 运行时间 +
+ {{ forloop.counter |add:start_id }}{{ item.create_time }}{{ item.result|translate_result }} + {% if item.accepted_answer_time %} + {{ item.accepted_answer_time }}ms + {% else %} + -- + {% endif %} + + {{ item.language|translate_language }} +
- - - - - - - - - - - {% for item in submissions %} - - - - - - - - {% endfor %} - - -
#提交时间结果运行时间语言
- {{ forloop.counter |add:start_id }}{{ item.create_time }}{{ item.result|translate_result }} - {% if item.accepted_answer_time %} - {{ item.accepted_answer_time }}ms - {% else %} - -- - {% endif %} - - {{ item.language|translate_language }} -
- {% else %} -

你还没有提交记录!

- {% endif %} + + + {% if not submissions %} +

你还没有提交记录!

+ {% endif %}
+
+ {% include "oj/announcement/_announcement_panel.html" %} +
+
{% endblock %} diff --git a/template/src/oj_base.html b/template/src/oj_base.html index 082cad5..be8f3b0 100644 --- a/template/src/oj_base.html +++ b/template/src/oj_base.html @@ -48,28 +48,28 @@
  • 关于
  • {% if request.user.is_authenticated %} - + {% else %} - + {% endif %}
    @@ -84,6 +84,10 @@ {% block js_block %}{% endblock %}