class Task(db.Model): __tablename__ = 'task' task_id = db.Column(db.Integer(), primary_key = True, autoincrement = True) task_name = db.Column(db.String(64), nullable = False) description = db.Column(db.Text, nullable = False, default = '') deadline = db.Column(db.DateTime(), nullable = False) problems = db.relationship( 'Problem', secondary = 'problem_in_task', backref = db.backref('tasks', lazy = 'dynamic'), lazy = 'dynamic' ) groups = db.relationship( 'UserGroup', secondary = 'task_for_usergroup', backref = db.backref('tasks', lazy = 'dynamic'), lazy = 'dynamic' ) @property def available(self): return self.deadline > datetime.now()
class Submission(db.Model): __tablename__ = 'submission' sid = db.Column(db.Integer(), primary_key=True, autoincrement=True) pid = db.Column(db.Integer(), db.ForeignKey('problem.pid')) uid = db.Column(db.Integer(), db.ForeignKey('user.uid')) testset_id = db.Column(db.Integer, db.ForeignKey('testset.testset_id')) result = db.Column(db.Text, nullable=True) score = db.Column(db.DECIMAL(6, 2), nullable=True) code = db.Column(db.Text, nullable=False) is_solution = db.Column(db.Boolean(), nullable=False, server_default='0') submit_time = db.Column(db.DateTime(), nullable=False, default=datetime.now) problem = db.relationship('Problem', backref=db.backref('submissions', lazy='dynamic')) user = db.relationship('User', backref=db.backref('submissions', lazy='dynamic')) tasks = db.relationship('Task', secondary='submission_in_task', backref=db.backref('submissions', lazy='dynamic'), lazy='dynamic') @property def full_score(self): return self.testset.full_score if self.testset else None @property def status(self): if not current_user.is_teacher: for task in self.tasks.all(): if task.available: return 'hidden' if self.result is None: return 'pending' if self.result == 'running': return 'running' if self.result == 'system_error': return 'system_error' if self.full_score == self.score: return 'accepted' if self.full_score > self.score: return 'wrong_answer' return 'other'
class Announcement(db.Model): __tablename__ = 'announcement' aid = db.Column(db.Integer(), primary_key=True, autoincrement=True) uid = db.Column(db.Integer, db.ForeignKey('user.uid')) title = db.Column(db.String(64), nullable=False) description = db.Column(db.Text(), nullable=False) publish_time = db.Column(db.DateTime(), nullable=False, default=datetime.now) user = db.relationship('User', backref='announcements')
class Tag(db.Model): __tablename__ = 'tag' tag_id = db.Column(db.Integer(), primary_key=True, autoincrement=True) tag_name = db.Column(db.String(64), nullable=False, unique=True) problems = db.relationship('Problem', secondary='tag_of_problem', backref=db.backref('tags', lazy='dynamic'), lazy='dynamic') def __repr__(self): return self.tag_name @property def id(self): return self.tag_id
class Problem(db.Model): __tablename__ = 'problem' pid = db.Column(db.Integer(), primary_key = True, autoincrement = True) testset_id = db.Column(db.Integer, db.ForeignKey('testset.testset_id')) level = db.Column(db.Integer, nullable = False) title = db.Column(db.String(64), nullable = False) description = db.Column(db.Text(), nullable = False) visible = db.Column(db.Boolean, nullable = False, server_default = "1") testset = db.relationship('TestSet', backref = 'problem') def get_user_sub(self): return self.submissions.filter_by(uid = current_user.uid).order_by(Submission.score.desc()).first() @property def ac_rate(self): subs_count = self.submissions.filter(Submission.result != None) total = subs_count.count() ac = 0 for sub in subs_count.all(): ac = ac + (1 if sub.score != None and sub.score == sub.full_score else 0) return ('%.2f%%' % (ac / total)) if total else '0.00%'
class Test(db.Model): __tablename__ = 'test' test_id = db.Column(db.Integer(), primary_key=True, autoincrement=True) score = db.Column(db.DECIMAL(6, 2), nullable=False) code = db.Column(db.Text(), nullable=False)