Exemplo n.º 1
0
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()
Exemplo n.º 2
0
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'
Exemplo n.º 3
0
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')
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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%'
Exemplo n.º 6
0
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)