Files
OnlineJudge/submission/models.py
2025-09-25 18:41:23 +08:00

69 lines
2.1 KiB
Python

from django.db import models
from utils.constants import ContestStatus
from utils.models import JSONField
from problem.models import Problem
from contest.models import Contest
from utils.shortcuts import rand_str
class JudgeStatus:
COMPILE_ERROR = -2
WRONG_ANSWER = -1
ACCEPTED = 0
CPU_TIME_LIMIT_EXCEEDED = 1
REAL_TIME_LIMIT_EXCEEDED = 2
MEMORY_LIMIT_EXCEEDED = 3
RUNTIME_ERROR = 4
SYSTEM_ERROR = 5
PENDING = 6
JUDGING = 7
PARTIALLY_ACCEPTED = 8
class Submission(models.Model):
id = models.TextField(default=rand_str, primary_key=True, db_index=True)
contest = models.ForeignKey(Contest, null=True, on_delete=models.CASCADE)
problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
create_time = models.DateTimeField(auto_now_add=True)
user_id = models.IntegerField(db_index=True)
username = models.TextField()
code = models.TextField()
result = models.IntegerField(db_index=True, default=JudgeStatus.PENDING)
# 从JudgeServer返回的判题详情
info = JSONField(default=dict)
language = models.TextField()
shared = models.BooleanField(default=False)
# 存储该提交所用时间和内存值,方便提交列表显示
# {time_cost: "", memory_cost: "", err_info: "", score: 0}
statistic_info = JSONField(default=dict)
ip = models.TextField(null=True)
def check_user_permission(self, user, check_share=True):
if (
self.user_id == user.id
or not user.is_regular_user()
or self.problem.created_by_id == user.id
):
return True
if check_share:
if self.contest and self.contest.status != ContestStatus.CONTEST_ENDED:
return False
if self.problem.share_submission or self.shared:
return True
return False
class Meta:
db_table = "submission"
ordering = ("-create_time",)
indexes = [
models.Index(
fields=["user_id", "create_time"], name="user_create_time_idx"
),
]
def __str__(self):
return self.id