Exemplo n.º 1
0
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 = JSONField()
    test_case_id = models.TextField()
    # [{"input_name": "1.in", "output_name": "1.out", "score": 0}]
    test_case_score = JSONField()
    hint = RichTextField(null=True)
    languages = JSONField()
    template = JSONField()
    create_time = models.DateTimeField(auto_now_add=True)
    # we can not use auto_now here
    last_update_time = models.DateTimeField(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 = JSONField(default=_default_io_mode)
    # special judge related
    spj = models.BooleanField(default=False)
    spj_language = models.TextField(null=True)
    spj_code = models.TextField(null=True)
    spj_version = models.TextField(null=True)
    spj_compile_ok = models.BooleanField(default=False)
    rule_type = models.TextField()
    visible = models.BooleanField(default=True)
    difficulty = models.TextField()
    tags = models.ManyToManyField(ProblemTag)
    source = models.TextField(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, JudgeStaus.WRONG_ANSWER: 11}, the number means count
    statistic_info = JSONField(default=dict)
    share_submission = models.BooleanField(default=False)

    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"])
Exemplo n.º 2
0
class AbstractProblem(models.Model):
    # 标题
    title = models.CharField(max_length=50)
    # 问题描述 HTML 格式
    description = RichTextField()
    # 输入描述
    input_description = models.CharField(max_length=10000)
    # 输出描述
    output_description = models.CharField(max_length=10000)
    # 样例输入 可能会存储 json 格式的数据
    samples = models.TextField(blank=True)
    # 测试用例id 这个id 可以用来拼接得到测试用例的文件存储位置
    test_case_id = models.CharField(max_length=40)
    # 提示
    hint = RichTextField(blank=True, null=True)
    # 创建时间
    create_time = models.DateTimeField(auto_now_add=True)
    # 最后更新时间,不适用auto_now,因为本 model 里面的提交数量是变化的,导致每次 last_update_time 也更新了
    # 需要每次编辑后手动赋值
    last_update_time = models.DateTimeField(blank=True, null=True)
    # 这个题是谁创建的
    created_by = models.ForeignKey(User)
    # 时间限制 单位是毫秒
    time_limit = models.IntegerField()
    # 内存限制 单位是MB
    memory_limit = models.IntegerField()
    # special judge
    spj = models.BooleanField(default=False)
    spj_language = models.IntegerField(blank=True, null=True)
    spj_code = models.TextField(blank=True, null=True)
    spj_version = models.CharField(max_length=32, blank=True, null=True)
    # 是否可见 false的话相当于删除
    visible = models.BooleanField(default=True)
    # 总共提交数量
    total_submit_number = models.IntegerField(default=0)
    # 通过数量
    total_accepted_number = models.IntegerField(default=0)

    class Meta:
        db_table = "problem"
        abstract = True

    def add_submission_number(self):
        self.total_submit_number += 1
        self.save(update_fields=["total_submit_number"])
    def sub_submission_number(self):
        self.total_submit_number += 1
        self.save(update_fields=["total_submit_number"])

    def add_ac_number(self):
        self.total_accepted_number += 1
        self.save(update_fields=["total_accepted_number"])
Exemplo n.º 3
0
class Problem(models.Model):
    # contest = models.ForeignKey()
    is_public = models.BooleanField(default=True, verbose_name='公开')
    title = models.TextField(verbose_name='题目')
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    # 题目内容
    description = RichTextField(verbose_name='描述')
    description_input = RichTextField(verbose_name='输入描述')
    description_output = RichTextField(verbose_name='输出描述')
    hint = RichTextField(null=True, verbose_name='提示')
    source = RichTextField(null=True, verbose_name='来源')

    # 题目具体内容
    # [{input: "test", output: "123"}, {input: "test123", output: "456"}]
    samples = models.TextField(verbose_name='样例')
    # [{input: "test", output: "123", "score": 0}]
    test_case = models.TextField(verbose_name='测试例')

    # 默认数据
    create_time = models.IntegerField(default=time.time,
                                      blank=True,
                                      verbose_name='创建时间')
    last_update_time = models.IntegerField(default=time.time,
                                           verbose_name="最后修改事件")

    # 题目限制
    time_limit = models.IntegerField()
    memory_limit = models.IntegerField()

    # 其他功能
    submission_number = models.BigIntegerField(default=0, verbose_name="提交次数")
    ac_number = models.BigIntegerField(default=0, verbose_name="Accept次数")

    # 用户评价
    stars = models.IntegerField(default=0, verbose_name="评价人数")
    stars_number = models.BigIntegerField(default=0, verbose_name="题目星数")

    class Meta:
        unique_together = ("display_id", )
        ordering = ("create_time", )

    def __str__(self):
        return f"id:{self.id} 标题: {self.title}"

    def add_submission_number(self):
        self.submission_number += 1
        self.save(update_fields=["submission_number"])

    def add_ac_number(self):
        self.ac_number += 1
        self.save(update_fields=["ac_number"])
Exemplo n.º 4
0
class SimpleProblem(models.Model):
    lang_type = models.TextField()
    problem_type = models.TextField()
    problem_title = models.TextField()
    problem_content = RichTextField()
    # 问题是学校私有的还是公开的,默认是私有的,这个字段只有在school不为null时才生效
    private = models.BooleanField(default=False)
    # 问题所属学校
    school = models.ForeignKey(School, models.CASCADE, null=True, blank=True)
    # 不会真的有答案超过120个字符吧?不会吧?不会吧?
    options = ArrayField(models.CharField(max_length=120))
    answers = ArrayField(models.CharField(max_length=120))
    # 问题创建者
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)

    def save(self, *args, **kwargs):
        if not (self.lang_type in ['CPP', 'python', 'contest', 'innovation']):
            raise ValidationError('lang_type参数错误!')

        if not (self.problem_type
                in ['choice', 'question', 'comprehend', 'complete']):
            raise ValidationError('problem_type参数错误!')
        super().save(*args, **kwargs)

    class Meta:
        unique_together = (("lang_type", "problem_type", "problem_title",
                            "created_by"), ("lang_type", "problem_type",
                                            "problem_content", "created_by"))
Exemplo n.º 5
0
class CodeSrc(models.Model):
    code_id = models.IntegerField(primary_key=True)
    #src=models.CharField(max_length=1000,default='')   #代码
    src = RichTextField(default='')

    def __unicode__(self):
        return u'%d %s' % (self.code_id, self.src)
Exemplo n.º 6
0
class AboutUs(models.Model):
    # HTML
    content = RichTextField()
    last_update_time = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "aboutus"
Exemplo n.º 7
0
class LevelTestProblem(models.Model):

    title = models.TextField()
    description = RichTextField()
    answer = models.IntegerField() # 1~5 숫자중 하나
    choices = JSONField() # key: 1~5 / value: 선택지
    ordering = models.IntegerField()
    difficulty = models.TextField()

    class Meta:
        db_table = 'level_test_problem'
Exemplo n.º 8
0
class ContestAnnouncement(models.Model):
    contest = models.ForeignKey(Contest, on_delete=models.CASCADE)
    title = models.TextField()
    content = RichTextField()
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
    visible = models.BooleanField(default=True)
    create_time = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = "contest_announcement"
        ordering = ("-create_time", )
Exemplo n.º 9
0
class ContestAnnouncement(models.Model):
    contest = models.ForeignKey(Contest)
    title = models.CharField(max_length=128)
    content = RichTextField()
    created_by = models.ForeignKey(User)
    visible = models.BooleanField(default=True)
    create_time = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = "contest_announcement"
        ordering = ("-create_time", )
Exemplo n.º 10
0
class ForumReply(models.Model):
    fa_id = models.IntegerField()
    # HTML
    content = RichTextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    create_time = models.DateTimeField(auto_now_add=True)
    floor = models.IntegerField()

    class Meta:
        db_table = "forumReply"
        ordering = ("floor", )
Exemplo n.º 11
0
class Announcement(models.Model):
    title = models.CharField(max_length=64)
    # HTML
    content = RichTextField()
    create_time = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(User)
    last_update_time = models.DateTimeField(auto_now=True)
    visible = models.BooleanField(default=True)

    class Meta:
        db_table = "announcement"
        ordering = ("-create_time",)
Exemplo n.º 12
0
class Announcement2(models.Model):
    title = models.TextField()
    # HTML
    content = RichTextField()
    create_time = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
    last_update_time = models.DateTimeField(auto_now=True)
    visible = models.BooleanField(default=True)

    class Meta:
        db_table = "announcement2"
        ordering = ("-create_time", )
Exemplo n.º 13
0
class ProblemSolution(models.Model):
    # 视频题解
    video = models.TextField()
    # 文字题解
    text = RichTextField(blank=True, null=True)
    # 关联题目
    problem = models.ForeignKey(Problem,
                                null=False,
                                on_delete=models.CASCADE,
                                related_name="solution_video")
    # 创建信息
    timestamp = models.DateTimeField(auto_now_add=True)
Exemplo n.º 14
0
class Contest(models.Model):
    title = models.TextField()
    description = RichTextField()
    # show real time rank or cached rank
    real_time_rank = models.BooleanField()
    password = models.TextField(null=True)
    # enum of ContestRuleType
    rule_type = models.TextField()
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    create_time = models.DateTimeField(auto_now_add=True)
    last_update_time = models.DateTimeField(auto_now=True)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
    # 是否可见 false的话相当于删除
    visible = models.BooleanField(default=True)
    allowed_ip_ranges = JSONField(default=list)

    # added
    # 是否为课程为true时是
    course = models.BooleanField(default=False)
    # 课程号
    course_num = models.TextField(null=True)
    # 老师
    teacher = models.TextField(null=True)

    @property
    def status(self):
        if self.start_time > now():
            # 没有开始 返回1
            return ContestStatus.CONTEST_NOT_START
        elif self.end_time < now():
            # 已经结束 返回-1
            return ContestStatus.CONTEST_ENDED
        else:
            # 正在进行 返回0
            return ContestStatus.CONTEST_UNDERWAY

    @property
    def contest_type(self):
        if self.password:
            return ContestType.PASSWORD_PROTECTED_CONTEST
        return ContestType.PUBLIC_CONTEST

    # 是否有权查看problem 的一些统计信息 诸如submission_number, accepted_number 等
    def problem_details_permission(self, user):
        return self.rule_type == ContestRuleType.ACM or \
               self.status == ContestStatus.CONTEST_ENDED or \
               user.is_authenticated and user.is_contest_admin(self) or \
               self.real_time_rank

    class Meta:
        db_table = "contest"
        ordering = ("-start_time",)
Exemplo n.º 15
0
class ForumPost(models.Model):
    title = models.TextField()
    sort = models.IntegerField()
    # HTML
    content = RichTextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    create_time = models.DateTimeField(auto_now_add=True)
    last_update_time = models.DateTimeField(auto_now=True)
    is_top = models.BooleanField(default=False)
    is_nice = models.BooleanField(default=False)
    is_light = models.BooleanField(default=False)

    class Meta:
        db_table = "forumPost"
        ordering = ("-create_time", )
Exemplo n.º 16
0
class Announcement(models.Model):
    # 标题
    title = models.CharField(max_length=50)
    # 公告的内容 HTML 格式
    content = RichTextField()
    # 创建时间
    create_time = models.DateTimeField(auto_now_add=True)
    # 这个公告是谁创建的
    created_by = models.ForeignKey(User)
    # 最后更新时间
    last_update_time = models.DateTimeField(auto_now=True)
    # 是否可见 false的话相当于删除
    visible = models.BooleanField(default=True)

    class Meta:
        db_table = "announcement"
Exemplo n.º 17
0
class Contest(models.Model):
    _id = models.TextField(db_index=True)
    title = models.TextField()
    description = RichTextField()
    # show real time rank or cached rank
    real_time_rank = models.BooleanField()
    password = models.TextField(null=True)
    # enum of ContestRuleType
    rule_type = models.TextField()
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    create_time = models.DateTimeField(auto_now_add=True)
    last_update_time = models.DateTimeField(auto_now=True)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
    # ���閫� false���敶��
    visible = models.BooleanField(default=True)
    allowed_ip_ranges = JSONField(default=list)

    @property
    def status(self):
        if self.start_time > now():
            # 瘝⊥��憪� 餈��1
            return ContestStatus.CONTEST_NOT_START
        elif self.end_time < now():
            # 撌脩���� 餈��-1
            return ContestStatus.CONTEST_ENDED
        else:
            # 甇��餈�� 餈��0
            return ContestStatus.CONTEST_UNDERWAY

    @property
    def contest_type(self):
        if self.password:
            return ContestType.PASSWORD_PROTECTED_CONTEST
        return ContestType.PUBLIC_CONTEST

    # �������roblem ���鈭�恣靽⊥ 霂詨�ubmission_number, accepted_number 蝑�
    def problem_details_permission(self, user):
        return self.rule_type == ContestRuleType.ACM or \
               self.status == ContestStatus.CONTEST_ENDED or \
               user.is_authenticated and user.is_contest_admin(self) or \
               self.real_time_rank

    class Meta:
        db_table = "contest"
        ordering = ("-start_time", )
Exemplo n.º 18
0
class Contest(models.Model):
    title = models.TextField()
    description = RichTextField()
    # show real time rank or cached rank
    real_time_rank = models.BooleanField()
    password = models.TextField(null=True)
    # enum of ContestRuleType
    rule_type = models.TextField()
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    create_time = models.DateTimeField(auto_now_add=True)
    last_update_time = models.DateTimeField(auto_now=True)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
    # If it is visible, false is equivalent to delete
    visible = models.BooleanField(default=True)
    allowed_ip_ranges = JSONField(default=list)

    @property
    def status(self):
        if self.start_time > now():
            # NOT_START return 1
            return ContestStatus.CONTEST_NOT_START
        elif self.end_time < now():
            # ENDED return -1
            return ContestStatus.CONTEST_ENDED
        else:
            # UNDERWAY return 0
            return ContestStatus.CONTEST_UNDERWAY

    @property
    def contest_type(self):
        if self.password:
            return ContestType.PASSWORD_PROTECTED_CONTEST
        return ContestType.PUBLIC_CONTEST

    # The permission to view some statistics of the problem, such as submission_number, accepted_number, etc.
    def problem_details_permission(self, user):
        return self.rule_type == ContestRuleType.ACM or \
               self.status == ContestStatus.CONTEST_ENDED or \
               user.is_authenticated and user.is_contest_admin(self) or \
               self.real_time_rank

    class Meta:
        db_table = "contest"
        ordering = ("-start_time", )
Exemplo n.º 19
0
class Contest(models.Model):
    title = models.CharField(max_length=40, unique=True)
    description = RichTextField()
    # 是否显示实时排名结果
    real_time_rank = models.BooleanField()
    # 只能超级管理员创建公开赛,管理员只能创建小组内部的比赛
    # 如果这一项不为空,即为有密码的公开赛,没有密码的可以为小组赛或者是公开赛(此时用比赛的类型来表示)
    password = models.CharField(max_length=30, blank=True, null=True)
    # 比赛的类型: 0 即为是小组赛(GROUP_CONTEST),1 即为是无密码的公开赛(PUBLIC_CONTEST),
    # 2 即为是有密码的公开赛(PASSWORD_PUBLIC_CONTEST)
    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 CONTEST_NOT_START
        elif self.end_time < now():
            # 已经结束 返回-1
            return CONTEST_ENDED
        else:
            # 正在进行 返回0
            return CONTEST_UNDERWAY

    class Meta:
        db_table = "contest"
Exemplo n.º 20
0
class Course(models.Model):
    # 第几章
    charpter = models.TextField()
    # 第几节
    section = models.TextField()
    # 标题
    title = models.TextField()
    # 知识点总结
    content = RichTextField()
    # 题目链接
    on_class_problems = models.ManyToManyField(
        Problem, related_name="course_on_class_problems")
    after_class_problems = models.ManyToManyField(
        Problem, related_name="course_after_class_problems")
    # 创建信息
    create_time = models.DateTimeField(auto_now_add=True)
    last_update_time = models.DateTimeField(null=True)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        db_table = "course"
        ordering = ('create_time', )