diff --git a/contest/views.py b/contest/views.py index ac175394..ef616f1a 100644 --- a/contest/views.py +++ b/contest/views.py @@ -337,7 +337,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 f62dfa57..50e71681 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 ff1cbde4..6a9d2d11 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 b3f69298..08937c45 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 2e9d172b..6052ea90 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/static/src/js/app/admin/contest/contestList.js b/static/src/js/app/admin/contest/contestList.js index f63cdccd..4135fceb 100644 --- a/static/src/js/app/admin/contest/contestList.js +++ b/static/src/js/app/admin/contest/contestList.js @@ -149,8 +149,16 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", vm.editingContestId = contestId; vm.editTitle = vm.contestList[contestId-1].title; vm.editPassword = vm.contestList[contestId-1].password; - vm.editStartTime = vm.contestList[contestId-1].start_time.substring(0,16).replace("T"," "); - vm.editEndTime = vm.contestList[contestId-1].end_time.substring(0,16).replace("T"," "); + //var startTime = new Date(), endTime = new Date(); + //startTime.setFullYear(parseInt(vm.contestList[contestId-1].start_time.substring(0,4))) + //startTime.setMonth(parseInt(vm.contestList[contestId-1].start_time.substring(5,7))) + //startTime.setDate(parseInt(vm.contestList[contestId-1].start_time.substring(8,10))) + //startTime.setHours(parseInt(vm.contestList[contestId-1].start_time.substring(11,13))) + //startTime.setMinutes(parseInt(vm.contestList[contestId-1].start_time.substring(14,16))) + //startTime = new Date(startTime + 8 * 60 * 60 * 1000) + + vm.editStartTime = add8Hours(vm.contestList[contestId-1].start_time); + vm.editEndTime = add8Hours(vm.contestList[contestId-1].end_time);//.substring(0,16).replace("T"," "); vm.editMode = vm.contestList[contestId-1].mode; vm.editVisible = vm.contestList[contestId-1].visible; if (vm.contestList[contestId-1].contest_type == 0) { //contest type == 0, contest in group @@ -291,6 +299,40 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", } }); } + + function add8Hours(UtcString) { + console.log(UtcString); + var M = [31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + /*time.setFullYear(parseInt(UtcString.substring(0,4))) + time.setMonth(parseInt(UtcString.substring(5,7))) + time.setDate(parseInt(UtcString.substring(8,10))) + time.setHours(parseInt(UtcString.substring(11,13))) + time.setMinutes(parseInt(UtcString.substring(14,16))) + time = new Date(time + 8 * 60 * 60 * 1000)*/ + var year =UtcString.substring(0,4); + var month =UtcString.substring(5,7); + var day =UtcString.substring(8,10); + var hour =parseInt(UtcString.substring(11,13)) + 8; + var minute = UtcString.substring(14,16); + if (hour > 23) { + hour -= 24; day = parseInt(day)+1; month = parseInt(month); + if (month == 2) if (!(year%400)||(!(year%4)&&year%100)) M[2] = 29; + if (day > M[month]) { + day = 1; + month = parseInt(month)+1; + if (month > 12) { + year=parseInt(year)+1; month = 1; + } + } + month = month.toString(); + day = day.toString(); + if (month.length==1) month = "0"+month; + if (day.length==1) day = "0"+day; + } + hour = hour.toString(); + if (hour.length==1) hour="0"+hour; + return year+"-"+month+"-"+day+" "+hour+":"+minute; + } // Get group list $.ajax({ // Get current user type url: "/api/user/", diff --git a/submission/tests.py b/submission/tests.py index bb1d46de..ad3b85a8 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 5c90acac..0925e131 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 7418a569..945d1f52 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 00000000..d499e1af --- /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 520f7534..af54f1db 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 03d7e8c1..3bf7ac5f 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 41784302..c1204bed 100644 --- a/template/src/oj/submission/my_submissions_list.html +++ b/template/src/oj/submission/my_submissions_list.html @@ -4,37 +4,43 @@ {% load submission %}
- +
- - @@ -44,7 +50,9 @@ - + - + {% endfor %} diff --git a/template/src/oj_base.html b/template/src/oj_base.html index be8f3b0e..f39fea0c 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 @@ -52,9 +60,10 @@ -- {% endif %} - {{ item.language|translate_language }} + + {{ item.result|translate_result }}