Files
OnlineJudge/problem/models.py

114 lines
3.8 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.

from django.db import models
from account.models import User
from contest.models import Contest
from utils.models import RichTextField
from utils.constants import Choices
class ProblemTag(models.Model):
name = models.TextField()
class Meta:
db_table = "problem_tag"
class ProblemRuleType(Choices):
ACM = "ACM"
OI = "OI"
class ProblemDifficulty(object):
High = "High"
Mid = "Mid"
Low = "Low"
class ProblemIOMode(Choices):
standard = "Standard IO"
file = "File IO"
def _default_io_mode():
return {
"io_mode": ProblemIOMode.standard,
"input": "input.txt",
"output": "output.txt",
}
class Problem(models.Model):
# display ID
_id = models.TextField(db_index=True)
contest = models.ForeignKey(Contest, null=True, on_delete=models.CASCADE)
# for contest problem
is_public = models.BooleanField(default=False)
title = models.TextField()
# HTML
description = RichTextField()
input_description = RichTextField()
output_description = RichTextField()
# [{input: "test", output: "123"}, {input: "test123", output: "456"}]
samples = models.JSONField()
test_case_id = models.TextField()
# [{"input_name": "1.in", "output_name": "1.out", "score": 0}]
test_case_score = models.JSONField()
hint = RichTextField(null=True)
languages = models.JSONField()
template = models.JSONField()
create_time = models.DateTimeField(auto_now_add=True)
# we can not use auto_now here
last_update_time = models.DateTimeField(auto_now=True, null=True)
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
# ms
time_limit = models.IntegerField()
# MB
memory_limit = models.IntegerField()
# io mode
io_mode = models.JSONField(default=_default_io_mode)
rule_type = models.TextField()
visible = models.BooleanField(default=True)
difficulty = models.TextField()
tags = models.ManyToManyField(ProblemTag)
source = models.TextField(null=True)
prompt = models.TextField(null=True)
# [{language: "python", code: "..."}]
answers = models.JSONField(null=True)
# for OI mode
total_score = models.IntegerField(default=0)
submission_number = models.BigIntegerField(default=0)
accepted_number = models.BigIntegerField(default=0)
# {JudgeStatus.ACCEPTED: 3, JudgeStatus.WRONG_ANSWER: 11}, the number means count
statistic_info = models.JSONField(default=dict)
share_submission = models.BooleanField(default=False)
# 流程图相关字段
allow_flowchart = models.BooleanField(default=False) # 是否允许/需要提交流程图
mermaid_code = models.TextField(null=True, blank=True) # 流程图答案(Mermaid代码)
flowchart_data = models.JSONField(default=dict) # 流程图答案元数据(JSON格式)
flowchart_hint = models.TextField(null=True, blank=True) # 流程图提示信息
show_flowchart = models.BooleanField(default=False) # 是否显示流程图答案数据如果True这样就不需要提交流程图了说明就是给学生看的
class Meta:
db_table = "problem"
unique_together = (("_id", "contest"),)
ordering = ("create_time",)
def add_submission_number(self):
self.submission_number = models.F("submission_number") + 1
self.save(update_fields=["submission_number"])
def add_ac_number(self):
self.accepted_number = models.F("accepted_number") + 1
self.save(update_fields=["accepted_number"])
# class ProblemSet(models):
# title = models.CharField(max_length=20)
# subtitle = models.CharField(max_length=50)
# problems = models.ManyToManyField(Problem)
# badge = models.FilePathField(path=settings.UPLOAD_DIR)
# overviews = models.JSONField()
# create_time = models.DateTimeField(auto_now_add=True)
# update_time = models.DateTimeField(auto_now=True)