mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2025-01-07 21:12:02 +00:00
31356da9d1
* 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
92 lines
3.1 KiB
Python
92 lines
3.1 KiB
Python
# 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"
|