diff --git a/contest/views.py b/contest/views.py index 4763bd8..2153f95 100644 --- a/contest/views.py +++ b/contest/views.py @@ -343,7 +343,7 @@ def contest_list_page(request, page=1): # 搜索的情况 keyword = request.GET.get("keyword", None) if keyword: - contests = contests.filter(title__contains=keyword) + contests = contests.filter(Q(title__contains=keyword) | Q(description__contains=keyword)) # 筛选我能参加的比赛 join = request.GET.get("join", None) diff --git a/group/tests.py b/group/tests.py index f62dfa5..50e7168 100644 --- a/group/tests.py +++ b/group/tests.py @@ -8,6 +8,8 @@ from rest_framework.test import APITestCase, APIClient from account.models import User, REGULAR_USER, ADMIN, SUPER_ADMIN from group.models import Group, UserGroupRelation, JoinGroupRequest +from django.test import TestCase, Client + class GroupAPITest(APITestCase): pass @@ -254,3 +256,28 @@ class JoinGroupRequestAdminAPITest(APITestCase): response = self.client.put(self.url, data=data) self.assertEqual(response.data, {"code": 1, "data": u"加入失败,已经在本小组内"}) + +class ProblemListPageTest(TestCase): + def setUp(self): + self.client = Client() + self.url = reverse('group_list_page') + self.url = reverse('problem_list_page', kwargs={"page": 1}) + self.user = User.objects.create(username="test", admin_type=SUPER_ADMIN) + self.user.set_password("testaa") + self.user.save() + self.group = Group.objects.create(name="group1", + description="description1", + # 0是公开 1是需要申请后加入 2是不允许任何人加入 + join_group_setting = 1, + admin=User.objects.get(username="test")) + + def get_group_list_page_successful(self): + self.client.login(username="test", password="testaa") + response = self.client.get(self.url) + self.assertEqual(response.status_coed, 200) + + def get_group_list_page_successful_with_keyword(self): + self.client.login(username="test", password="testaa") + response = self.client.get(self.url+"?keyword=gro") + self.assertEqual(response.status_coed, 200) + diff --git a/group/views.py b/group/views.py index ff1cbde..6a9d2d1 100644 --- a/group/views.py +++ b/group/views.py @@ -4,7 +4,7 @@ from django.db import IntegrityError from rest_framework.views import APIView -from utils.shortcuts import error_response, serializer_invalid_response, success_response, paginate +from utils.shortcuts import error_response, serializer_invalid_response, success_response, paginate, error_page from account.models import REGULAR_USER, ADMIN, SUPER_ADMIN from account.decorators import login_required @@ -13,6 +13,9 @@ from .serializers import (CreateGroupSerializer, EditGroupSerializer, CreateJoinGroupRequestSerializer, GroupSerializer, GroupMemberSerializer, EditGroupMemberSerializer, JoinGroupRequestSerializer, PutJoinGroupRequestSerializer) +from announcement.models import Announcement +from django.core.paginator import Paginator +from django.db.models import Q class GroupAPIViewBase(object): @@ -26,7 +29,7 @@ class GroupAPIViewBase(object): else: group = Group.objects.get(id=group_id, visible=True, admin=request.user) return group - + def get_groups(self, request): """ 如果是超级管理员,就返回全部的小组 @@ -113,8 +116,8 @@ class GroupAdminAPIView(APIView, GroupAPIViewBase): elif request.GET.get("admin_id", None): groups = groups.filter(admin__id=request.GET["admin_id"]) return paginate(request, groups, GroupSerializer) - - + + class GroupMemberAdminAPIView(APIView, GroupAPIViewBase): def get(self, request): """ @@ -129,9 +132,9 @@ class GroupMemberAdminAPIView(APIView, GroupAPIViewBase): group = self.get_group(request, group_id) except Group.DoesNotExist: return error_response(u"小组不存在") - + return paginate(request, UserGroupRelation.objects.filter(group=group), GroupMemberSerializer) - + def put(self, request): """ 删除小组成员的api接口 @@ -190,7 +193,7 @@ class JoinGroupAPIView(APIView): return error_response(u"该小组不允许任何人加入") else: return serializer_invalid_response(serializer) - + def get(self, request): """ 搜索小组的api,需要传递keyword参数 @@ -244,3 +247,39 @@ class JoinGroupRequestAdminAPIView(APIView, GroupAPIViewBase): else: return serializer_invalid_response(serializer) + +@login_required +def group_list_page(request, page=1): + # 右侧的公告列表 + announcements = Announcement.objects.filter(is_global=True, visible=True).order_by("-create_time") + + groups = Group.objects.filter(visible=True, join_group_setting__lte=2) + # 搜索的情况 + keyword = request.GET.get("keyword", None) + if keyword: + groups = groups.filter(Q(name__contains=keyword) | Q(description__contains=keyword)) + + paginator = Paginator(groups, 20) + try: + current_page = paginator.page(int(page)) + except Exception: + return error_page(request, u"不存在的页码") + + previous_page = next_page = None + + try: + previous_page = current_page.previous_page_number() + except Exception: + pass + next_page = None + try: + next_page = current_page.next_page_number() + except Exception: + pass + + return render(request, "oj/group/group_list.html", { + "groups": groups, "announcements": announcements, + "contests": current_page, "page": int(page), + "previous_page": previous_page, "next_page": next_page, + "keyword": keyword, "announcements": announcements, + }) diff --git a/oj/urls.py b/oj/urls.py index b3f6929..08937c4 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -100,6 +100,9 @@ urlpatterns = [ 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'^contest/(?P\d+)/rank/$', "contest.views.contest_rank_page", name="contest_rank_page") + url(r'^contest/(?P\d+)/rank/$', "contest.views.contest_rank_page", name="contest_rank_page"), + + url(r'^groups/$', "group.views.group_list_page", name="group_list_page"), + url(r'^groups/(?P\d+)/$', "group.views.group_list_page", name="group_list_page") ] diff --git a/problem/views.py b/problem/views.py index 2e9d172..6052ea9 100644 --- a/problem/views.py +++ b/problem/views.py @@ -222,7 +222,7 @@ def problem_list_page(request, page=1): # 搜索的情况 keyword = request.GET.get("keyword", None) if keyword: - problems = problems.filter(title__contains=keyword) + problems = problems.filter(Q(title__contains=keyword) | Q(description__contains=keyword)) # 按照标签筛选 tag_text = request.GET.get("tag", None) diff --git a/submission/tests.py b/submission/tests.py index 3aab246..0d374ee 100644 --- a/submission/tests.py +++ b/submission/tests.py @@ -18,7 +18,6 @@ class SubmissionsListPageTest(TestCase): self.user.set_password("666666") self.user.save() self.user2.save() - # self.client.login(username="gogoing", password="666666") self.submission = Submission.objects.create(user_id=self.user.id, language=1, code='#include "stdio.h"\nint main(){\n\treturn 0;\n}', diff --git a/submission/views.py b/submission/views.py index 5c90aca..0925e13 100644 --- a/submission/views.py +++ b/submission/views.py @@ -138,7 +138,7 @@ def my_submission_list_page(request, page=1): """ 我的所有提交的列表页 """ - submissions = Submission.objects.filter(user_id=request.user.id). \ + submissions = Submission.objects.filter(user_id=request.user.id, contest_id__isnull=True). \ values("id", "result", "create_time", "accepted_answer_time", "language").order_by("-create_time") language = request.GET.get("language", None) filter = None diff --git a/template/src/admin/contest/contest_list.html b/template/src/admin/contest/contest_list.html index 7418a56..945d1f5 100644 --- a/template/src/admin/contest/contest_list.html +++ b/template/src/admin/contest/contest_list.html @@ -173,7 +173,7 @@ {{ el.sort_index }} {{ el.title }} {{ el.score}} - {{ getYesOrNo(el.visible) }} + {{ el.create_time|date("yyyy-MM-dd HH:mm:ss") }} {{ el.title }} {{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.created_by.username }} - {{ getYesOrNo(el.visible) }} + {{ el.total_accepted_number }}/{{ el.total_submit_number }} diff --git a/template/src/oj/group/group_list.html b/template/src/oj/group/group_list.html new file mode 100644 index 0000000..d499e1a --- /dev/null +++ b/template/src/oj/group/group_list.html @@ -0,0 +1,71 @@ +{% extends "oj_base.html" %} +{% block body %} + {% load problem %} + +{% endblock %} diff --git a/template/src/oj/index.html b/template/src/oj/index.html index 520f753..af54f1d 100644 --- a/template/src/oj/index.html +++ b/template/src/oj/index.html @@ -8,64 +8,71 @@ @@ -84,13 +91,34 @@ loopBottom: true }); }); + +
diff --git a/template/src/oj/problem/my_submissions_list.html b/template/src/oj/problem/my_submissions_list.html index 03d7e8c..3bf7ac5 100644 --- a/template/src/oj/problem/my_submissions_list.html +++ b/template/src/oj/problem/my_submissions_list.html @@ -17,17 +17,19 @@ # 提交时间 - 结果 - 运行时间 语言 + 运行时间 + 结果 {% for item in submissions %} - + {{ forloop.counter }} {{ item.create_time }} - {{ item.result|translate_result }} + + {{ item.language|translate_language }} + {% if item.accepted_answer_time %} {{ item.accepted_answer_time }}ms @@ -35,8 +37,8 @@ -- {% endif %} - - {{ item.language|translate_language }} + + {{ item.result|translate_result }} {% endfor %} diff --git a/template/src/oj/submission/my_submissions_list.html b/template/src/oj/submission/my_submissions_list.html index e048ab9..d3c0844 100644 --- a/template/src/oj/submission/my_submissions_list.html +++ b/template/src/oj/submission/my_submissions_list.html @@ -5,47 +5,55 @@ {% load submission %}
- +
- - {% for item in submissions %} - + - + - + {% endfor %} diff --git a/template/src/oj_base.html b/template/src/oj_base.html index be8f3b0..f39fea0 100644 --- a/template/src/oj_base.html +++ b/template/src/oj_base.html @@ -45,6 +45,7 @@
  • 题目
  • 提交
  • 比赛
  • +
  • 小组
  • 关于
  • {% if request.user.is_authenticated %}
    # 提交时间 + + 运行时间 + +
    {{ forloop.counter |add:start_id }} {{ item.create_time }}{{ item.result|translate_result }} + {{ item.language|translate_language }} + {% if item.accepted_answer_time %} {{ item.accepted_answer_time }}ms @@ -53,9 +61,10 @@ -- {% endif %} - {{ item.language|translate_language }} + + {{ item.result|translate_result }}