OnlineJudge/contest/models.py
virusdefender 31356da9d1 Merge branch 'dev' into virusdefender-dev
* dev: (21 commits)
  [前端]整理格式,去掉tab(以前用vim,它自己给加的),去掉调试用的console.log[CI SKIP]
  [前端]统一admin中js命名方式.  为提交列表添加返回按钮[CI SKIP]
  [前端]修复bug,更正了不恰当的foreach循环,(js里for(var key in array)不仅遍历了数组元素,还将遍历数组其他的属性以及成员方法),修复了显示编辑区函数对选中小组错误的清除方法.(原来的做法将导致某些情况下旧的小组无法移除编辑区域.  增添了切换编辑比赛的提示,防止用户丢失为保存的信息.    添加问题列表对可见比赛的筛选[CI SKIP]
  [前端-BUG]修复比赛编辑区可见状态显示错误,(忘记加vm.),增加编辑成功隐藏编辑框的行为,更加方便[CI SKIP]
  [前端]添加比赛题目列表可见字段的显示,方便比赛管理[CI SKIP]
  [BUG-fix]返回按钮提示确认,修复不能弹出的问题[CI SKIP]
  修复typo in submission/views.py   Swagger UI docs中的拼写错误[CI SKIP]
  [前端]修复userList.js中关于翻页按钮状态控制函数参数的错误. 修复刚刚提交的bug[CI SKIP]
  [前端]修复userList页面avalon重定义问题[CI SKIP]
  [前端]修复问题管理(后台)页面的avalon重复定义的问题[CI SKIP]
  [前端]整理js格式.  修复小bugs,关于比赛密码修改变量名称的错误,小组修改变量名称错误(以上都是在修改比赛页面内)[CI SKIP]
  [后台]修复contestAdmin,比赛和问题API的逻辑问题,主要针对超级管理员和普通管理员的差别.写了测试,是两个api测试覆盖率达100%
  [migration]改model漏了一个.....[CI SKIP]
  [前端-后台]比赛管理,对添加,编辑,列表页面的avalon使用方法做了统一的改变,防止出现页内模板改变但页面不刷新的情况下导致avalon功能间歇性异常的问题,但是代码量变大了一些,还算是整洁.具体是所有页面的avalon只在页面第一次加载的时候初始化,再次加载时只对vm内部变量重新初始化,而不调用avalon.define了[CI SKIP]
  [后端]添加修改比赛题目添加对题目分数的支持
  [后端]为比赛problem model添加分数(score)字段,用于记分模式的比赛
  [后端]修复typo,工作正常,没写测试还
  [前端]修改比赛列表页面,添加了编辑比赛,编辑比赛题目[CI SKIP]
  [前端]把添加比赛和添加比赛问题分开了,就是把添加问题模块从添加比赛页面删除了
  [前端]添加了后台比赛列表对问题的添加修改页面[CI SKIP]
  ...

Conflicts:
	static/src/js/app/admin/problem/editProblem.js
	static/src/js/app/admin/problem/submissionList.js
	submission/views.py
2015-08-25 12:49:05 +08:00

92 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# coding=utf-8
from django.db import models
from django.utils.timezone import now
from account.models import User
from problem.models import AbstractProblem
from group.models import Group
class Contest(models.Model):
title = models.CharField(max_length=40, unique=True)
description = models.TextField()
# 比赛模式0 即为是acm模式1 即为是按照总的 ac 题目数量排名模式
mode = models.IntegerField()
# 是否显示排名结果
show_rank = models.BooleanField()
# 是否显示别人的提交记录
show_user_submission = models.BooleanField()
# 只能超级管理员创建公开赛,管理员只能创建小组内部的比赛
# 如果这一项不为空,即为有密码的公开赛,没有密码的可以为小组赛或者是公开赛(此时用比赛的类型来表示)
password = models.CharField(max_length=30, blank=True, null=True)
# 比赛的类型: 0 即为是小组赛1 即为是无密码的公开赛2 即为是有密码的公开赛
contest_type = models.IntegerField()
# 开始时间
start_time = models.DateTimeField()
# 结束时间
end_time = models.DateTimeField()
# 创建时间
create_time = models.DateTimeField(auto_now_add=True)
# 最后修改时间
last_updated_time = models.DateTimeField(auto_now=True)
# 这个比赛是谁创建的
created_by = models.ForeignKey(User)
groups = models.ManyToManyField(Group)
# 是否可见 false的话相当于删除
visible = models.BooleanField(default=True)
@property
def status(self):
if self.start_time > now():
# 没有开始 返回1
return 1
elif self.end_time < now():
# 已经结束 返回0
return -1
else:
# 正在进行 返回0
return 0
class Meta:
db_table = "contest"
class ContestProblem(AbstractProblem):
contest = models.ForeignKey(Contest)
# 比如A B 或者1 2 或者 a b 将按照这个排序
sort_index = models.CharField(max_length=30)
score = models.IntegerField(default=0)
class Meta:
db_table = "contest_problem"
class ContestProblemTestCase(models.Model):
"""
如果比赛是按照通过的测试用例总分计算的话就需要这个model 记录每个测试用例的分数
"""
# 测试用例的id 这个还在测试用例的配置文件里面有对应
id = models.CharField(max_length=40, primary_key=True, db_index=True)
problem = models.ForeignKey(ContestProblem)
score = models.IntegerField()
class Meta:
db_table = "contest_problem_test_case"
class ContestSubmission(models.Model):
"""
用于保存比赛提交和排名的一些数据,加快检索速度
"""
user = models.ForeignKey(User)
problem = models.ForeignKey(ContestProblem)
contest = models.ForeignKey(Contest)
total_submission_number = models.IntegerField(default=1)
# 这道题是 AC 还是没过
ac = models.BooleanField()
# 总的时间用于acm 类型的,也需要保存罚时
total_time = models.IntegerField(default=0)
class Meta:
db_table = "contest_submission"