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 e23b50e..4763bd8 100644 --- a/contest/views.py +++ b/contest/views.py @@ -348,7 +348,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/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 04f0a86..3aab246 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/') @@ -137,10 +147,3 @@ class ContestSubmissionAPITest(APITestCase): data = {"language": 1} response = self.client.post(self.url, data=data) pass - - - - - - - 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 %} -
{{ forloop.counter }}. {{ item.title }}
- {% endfor %} + {% if announcements %} + {% for item in announcements %} +{{ forloop.counter }}. {{ item.title }} +
+ {% endfor %} + {% else %} +暂无可显示的公告
+ {% endif %}还没有结果
+ {% endif %}你还没有提交该题目
+ {% 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 %}| # | -提交时间 | -结果 | -运行时间 | -语言 | -
|---|---|---|---|---|
| - {{ 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 }} - | -
| # | +提交时间 | +
+
+ 结果
+
+
+ |
+ 运行时间 | +
+
+ 语言
+
+
+ |
+
|---|---|---|---|---|
| + {{ 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 }} + | +
你还没有提交记录!
- {% endif %} +你还没有提交记录!
+ {% endif %}