Merge branch 'dev' into virusdefender-dev

* dev:
  增加了比赛列表页
  [后端]去掉了用于生产序号的javascript,改为使用模板过滤器实现(我的所有提交)
  [前端]修改完善了添加比赛页面,  比赛列表功能仍不全面,稍后改进[CI SKIP]
  修改了css引用方式[CI SKIP]
  [后端]修改了contest中 api-docs 的小bug[CI SKIP]
  创建前台比赛列表
  去掉冗余语句,因为page变量已经有默认值了,不能为空
  [后端]前台我的提交页面 增强提交序号的显示,原来是显示真实id即随机的散列值,不好看,现在改成自然数序列,但需要结合javascript生成,且是相对值,因为数据库里没有这个字段,有点别扭了.   第二,添加了用户没有提交记录的反馈.   第三,本打算增加筛选功能,但因为URL难以统一作罢,只有在增加新的url才能较好的处理,下次再说拜
  [前端]比赛列表页面(后台)的进一步完善,不包含api
  [后端]修改了我的提交列表的模板样式,整理格式
  [后端]修改我的提交页面,去掉了冗余语句,并添加测试
  [后端-前台]添加了submissions分页显示(只显示当前用户的提交),调用已有的view完成单个submission的显示.显示界面与问题分页显示统一.问题是id的显示.url:http://127.0.0.1:8000/my_submissions/
  [前端]修改添加比赛页面,新增了使用小组api查询该用户所创建的所有的小组的功能[CI SKIP]
  [ÂâçÁ´Ø]Ê∑ªÂä†ÊØî˵õȰµÈù¢Ëøõ‰∏ÄÊ≠•ÂÆåÂñÑ,Ê∑ªÂä†Â≠óÊÆµÂåÖÊã¨ÊòØÂê¶ÊòæÁ§∫Êèê‰∫§,ÊØî˵õÊ®°Âºè,ÈóÆÈ¢òÂàÜÂĺ,ÂÖÅËÆ∏ÂèÇÂä†ÊØî˵õÁöÑÁî®Êà∑ÁªÑ,Âπ∂ÂÆåÂñÑÂÜÖÈÉ®ÈÄªËæë,Âü∫Êú¨ÂèØÁ∫Ü,Âè™ÊòØÊ≤°ÂÜôajaxÊèê‰∫§Êï∞ÊçÆ,ÂíåÂïÊãâÂÂèñÂ∞èÁªÑ‰ø°ÊÅØÁöÑÈÉ®ÂàÜ[CI SKIP]
  [前端]修改了添加比赛页的形式结构,仍有bug[CI SKIP]
  Ê∑[ÂâçÁ´Ø]Ê∑ªÂä†ÊØîËÂêéÂè∞ÊØî˵õÂàó˰®[CI SKIP]
  [ÂâçÁ´Ø]Áªü‰∏ÄÈóÆÈ¢òÈá,ÊØî˵õÂàó˰®jsÁöÑÊñቪ∂Âêç_list.js.  Ê∑ªÂ䆉∫ÜÊØî˵õÂàó˰®ÂíåÁºñËæëÊØî˵õÁöÑȰµÈù¢(§߉Ωì§ʆ∑ºè)[CI SKIP]

Conflicts:
	contest/views.py
This commit is contained in:
virusdefender
2015-08-22 20:49:42 +08:00
16 changed files with 964 additions and 336 deletions

View File

@@ -1,9 +1,12 @@
# coding=utf-8
import json
import datetime
from django.utils.timezone import localtime
from django.shortcuts import render
from django.db import IntegrityError
from django.utils import dateparse
from django.db.models import Q
from django.core.paginator import Paginator
from rest_framework.views import APIView
from utils.shortcuts import (serializer_invalid_response, error_response,
success_response, paginate, rand_str, error_page)
@@ -11,11 +14,13 @@ from utils.shortcuts import (serializer_invalid_response, error_response,
from account.models import REGULAR_USER, ADMIN, SUPER_ADMIN
from account.decorators import login_required
from group.models import Group
from announcement.models import Announcement
from .models import Contest, ContestProblem
from .serializers import (CreateContestSerializer, ContestSerializer, EditContestSerializer,
CreateContestProblemSerializer, ContestProblemSerializer,
EditContestProblemSerializer, ContestPasswordVerifySerializer)
EditContestProblemSerializer, ContestPasswordVerifySerializer,
EditContestProblemSerializer)
class ContestAdminAPIView(APIView):
@@ -200,7 +205,7 @@ class ContestProblemAdminAPIView(APIView):
"""
比赛题目分页json api接口
---
response_serializer: ProblemSerializer
response_serializer: ContestProblemSerializer
"""
contest_problem_id = request.GET.get("contest_problem_id", None)
if contest_problem_id:
@@ -274,4 +279,47 @@ def contest_page(request, contest_id):
if not result["result"]:
return render(request, "oj/contest/contest_no_privilege.html", {"contenst": contest, "reason": result["reason"]})
return render(request, "oj/contest/contest_index.html", {"contest": contest})
return render(request, "oj/contest/contest_index.html", {"contest": contest})
def contest_list_page(request, page=1):
# 正常情况
contests = Contest.objects.filter(visible=True)
# 搜索的情况
keyword = request.GET.get("keyword", None)
if keyword:
contests = contests.filter(title__contains=keyword)
# 筛选我能参加的比赛
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()))
paginator = Paginator(contests, 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
try:
next_page = current_page.next_page_number()
except Exception:
pass
# 右侧的公告列表
announcements = Announcement.objects.filter(is_global=True, visible=True).order_by("-create_time")
# 系统当前时间
now = datetime.datetime.now()
return render(request, "oj/contest/contest_list.html",
{"contests": current_page, "page": int(page),
"previous_page": previous_page, "next_page": next_page,
"keyword": keyword, "announcements": announcements,
"join": join, "now": now})