Beispiel #1
0
 def post_execute_priority(self, data={}):
     required_args = [{
         'name': '+priority',
         'type': dict,
     }] 
     err = form_validation(data, required_args)
     if err: return (err, None)
     priority = data['priority']
     err, execute_list = yield from self.get_execute_list()
     execute_list = [x['id'] for x in execute_list]
     max_priority = len(execute_list)
     for execute in execute_list:
         execute = int(execute)
         if execute not in priority:
             return ((400, 'priority of execute_type.%s not found'%(str(execute))), None)
     id = list(priority.keys())
     for execute in priority:
         execute = int(execute)
         if execute not in execute_list:
             return ((400, 'execute_type.%s not exist'%(str(execute))), None)
         if execute > max_priority:
             return ((400, 'priority of execute_type.%s error'%(str(execute))), None)
         if id.count(execute) > 1:
             return ((400, 'priority can not duplicate'), None)
     for id, pri in priority.items():
         yield self.db.execute('UPDATE execute_types SET priority=%s WHERE id=%s;', (pri, id,))
         # self.rs.delete('execute@%s'%(str(id)))
     # self.rs.delete('execute_list')
     return (None, None)
Beispiel #2
0
 def post_group_user_power(self, data={}):
     required_args = [{
         'name': '+user_id',
         'type': int,
     }, {
         'name': '+group_id',
         'type': int,
     }, {
         'name': '+power',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     err, current_power = yield from self.get_group_user_power(data)
     print(current_power)
     if int(data['power']) in current_power:
         yield self.db.execute(
             'DELETE FROM map_group_user_power WHERE user_id=%s AND group_id=%s AND power=%s;',
             (
                 data['user_id'],
                 data['group_id'],
                 data['power'],
             ))
     else:
         sql, param = self.gen_insert_sql('map_group_user_power', data)
         # yield self.db.execute('INSERT INTO map_group_user_power (user_id, group_id, power) VALUES(%s, %s, %s);', (uid, gid, power))
         yield self.db.execute(sql, param)
     # self.rs.delete('user_group_power@%s@%s' % (str(uid), str(gid)))
     return (None, None)
Beispiel #3
0
    def signin(self, data, req): #need to set cookie
        '''
        data(dict): account(str), passwd(str)
        return id(str)
        '''
        ### check required arguemts
        required_args = [{
            'name': '+account',
            'type': str,
        }, {
            'name': '+passwd',
            'type': str,
        }]
        err = form_validation(data, required_args)
        if err: return (err, None)

        ### get hashed passwd
        col = ['passwd', 'id', 'token']
        sql = self.gen_select_sql('users', col)
        res = yield self.db.execute(sql+' WHERE account = %s;', (data['account'],))
        ### check account 
        if res.rowcount == 0:
            return ((404, 'User Not Exist'), None)
        res = res.fetchone()
        hpwd, id, token = res["passwd"], res["id"], res['token']
        ### check passwd
        if self.hash_pwd(data['passwd']) != hpwd:
            return ((400, 'Wrong Password'), None)
        req.set_secure_cookie('token', token)
        return (None, str(id))
Beispiel #4
0
 def get_contest_user_problem_score(self, data={}):
     required_args = [{
         'name': '+user_id',
         'type': int,
     }, {
         'name': '+problem',
         'type': dict,
     }, {
         'name': '+start',
         'type': datetime.datetime,
     }, {
         'name': '+end',
         'type': datetime.datetime,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     res = yield self.db.execute('SELECT COUNT(*) FROM submissions WHERE user_id=%s AND problem_id=%s AND %s<=created_at AND created_at<=%s;', (data['user_id'], data['problem']['id'], data['start'], data['end']))
     res = res.fetchone()
     if res['count'] == 0: ### not submit yet
         res = {}
         res['score'] = None
         res['verdict'] = 0
         res['submitted'] = 0
         res['penalty'] = 0
         return (None, res)
     res = yield self.db.execute('SELECT * FROM submissions WHERE user_id=%s AND problem_id=%s AND %s<=created_at AND created_at<=%s AND verdict=7 ORDER BY id LIMIT 1;', (data['user_id'], data['problem']['id'], data['start'], data['end']))
     if res.rowcount != 0:
         res = res.fetchone()
         data['end'] = min(data['end'], res['created_at'])
     res = yield self.db.execute('SELECT verdict, COUNT(*) as submitted, MAX(s.score) as score FROM (SELECT FROM submissions WHERE s.user_id=%s AND s.problem_id=%s AND %s<=s.created_at AND s.created_at<=%s) as s, (SELECT m.id FROM map_verdict_string as m WHERE m.priority=(SELECT MAX(m.priority) FROM map_verdict_string as m WHERE m.id=s.verdict)) as verdict;', (data['user_id'], data['problem']['id'], data['start'], data['end']))
     res = res.fetchone()
     res['penalty'] = (res['submitted']-1) * data['problem']['penalty']  
     if score != '':
         pass
     return (None, res)
Beispiel #5
0
 def get_execute(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     if int(data['id']) == 0:
         res = {}
         res['steps'] = []
         res['id'] = 0
         res['lang'] = 0
         res['description'] = ''
         res['cm_mode'] = ''
         return (None, res)
     # res = self.rs.get('execute@%s'%(str(data['id'])))
     # if res: return (None, res)
     sql = "SELECT e.*, u.account as setter_user FROM execute_types as e, users as u WHERE e.id=%s AND e.setter_user_id=u.id"
     res = yield self.db.execute(sql, (data["id"], ))
     if res.rowcount == 0:
         return ((404, 'Error execute id'), None)
     res = res.fetchone()
     res['steps'] = (yield self.db.execute("SELECT execute_steps.* FROM execute_steps WHERE execute_type_id=%s ORDER BY id", (res['id'],))).fetchall()
     for id, x in enumerate(res['steps']):
         x['step'] = id + 1
     # self.rs.set('execute@%s'%(str(data['id'])), res)
     return (None, res)
Beispiel #6
0
    def get_user_info_by_account_passwd(self, data={}):
        required_args = [{
            'name': '+account',
            'type': str,
        }, {
            'name': '+passwd',
            'type': str,
        }]
        err = form_validation(data, required_args)
        if err: return (err, None)

        ### get hashed passwd
        col = ['passwd', 'id', 'token']
        sql = self.gen_select_sql('users', col)
        res = yield self.db.execute(sql+' WHERE account = %s;', (data['account'],))
        ### check account 
        if res.rowcount == 0:
            return ((404, 'User Not Exist'), None)
        res = res.fetchone()
        hpwd, id, token = res["passwd"], res["id"], res['token']
        ### check passwd
        if self.hash_pwd(data['passwd']) != hpwd:
            return ((400, 'Wrong Password'), None)
        return (None, {
            'id': id,
            'token': token
        })
Beispiel #7
0
 def get_contest_submission_list_count(self, data):
     required_args = [{
         'name': '+id',
         'type': int,
     }, {
         'name': '+user_id',
         'type': int,
     }, {
         'name': '+current_group_power',
         'type': set,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     err, res = yield from self.get_contest(data)
     start = res['start']
     end = res['end']
     sql = """
     SELECT count(*)
     FROM submissions as s, map_contest_problem as mp, map_contest_user as mu, problems as p
     WHERE """;
     if map_group_power['contest_manage'] not in data['current_group_power']:
         sql += "s.user_id=%s AND " % (int(data['user_id']))
     sql += """
     mu.user_id=s.user_id 
     AND mu.contest_id=%s AND mp.contest_id=mu.contest_id  
     AND mp.problem_id=s.problem_id 
     AND mp.problem_id=p.id
     AND %s<=s.created_at AND s.created_at<=%s 
     """;
     res = yield self.db.execute(sql, (res['id'], start, end,  ))
     return (None, res.fetchone()['count'])
Beispiel #8
0
 def get_contest_submission_list_count(self, data):
     required_args = [
         {"name": "+id", "type": int},
         {"name": "+user_id", "type": int},
         {"name": "+current_group_power", "type": set},
     ]
     err = form_validation(data, required_args)
     if err:
         return (err, None)
     err, res = yield from self.get_contest(data)
     start = res["start"]
     end = res["end"]
     sql = """
     SELECT count(*)
     FROM submissions as s, map_contest_problem as mp, map_contest_user as mu, problems as p
     WHERE """
     if map_group_power["contest_manage"] not in data["current_group_power"]:
         sql += "s.user_id=%s AND " % (int(data["user_id"]))
     sql += """
     mu.user_id=s.user_id 
     AND mu.contest_id=%s AND mp.contest_id=mu.contest_id  
     AND mp.problem_id=s.problem_id 
     AND mp.problem_id=p.id
     AND %s<=s.created_at AND s.created_at<=%s 
     """
     res = yield self.db.execute(sql, (res["id"], start, end))
     return (None, res.fetchone()["count"])
Beispiel #9
0
    def get_problem_list(self, data={}):
        required_args = [{
            'name': '+group_id',
            'type': int,
        }, {
            'name': '+user_id',
            'type': int,
        }, {
            'name': '+page',
            'type': int,
        }, {
            'name': '+count',
            'type': int,
        }]
        err = form_validation(data, required_args)
        if err: return (err, None)
        sql = """
            SELECT 
            (SELECT COUNT(*) FROM (SELECT * FROM submissions WHERE problem_id=p.id AND user_id=%s AND verdict=9 limit 1) AS m) AS ac, 
            (SELECT COUNT(*) FROM (SELECT * FROM submissions WHERE problem_id=p.id AND user_id=%s limit 1) AS n) AS try, 
            p.id, p.title, p.source, p.visible, p.created_at,
            u.id as setter_user_id, u.account as setter_user,
            g.id as group_id, g.name as group_name
            FROM problems as p, users as u, groups as g
            WHERE u.id=p.setter_user_id AND g.id=p.group_id AND
            """
        sql += """ (p.group_id=%s) """
        sql += """ ORDER BY p.id limit %s OFFSET %s """

        res  = yield self.db.execute(sql, (data['user_id'], data['user_id'], data['group_id'], data['count'], (int(data["page"])-1)*int(data["count"]), ))
        return (None, res.fetchall())
Beispiel #10
0
 def get_contest_submission(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     }, {
         'name': '+user_id',
         'type': int,
     }, {
         'name': '+current_group_power',
         'type': set, 
     }, {
         'name': '+submission_id',
         'type': int,
     }, {
         'name': '+group_id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     err, res = yield from self.get_contest(data)
     if err: return (err, None)
     err, submission_res = yield from Service.Submission.get_submission({'id': data['submission_id'], 'group_id': data['group_id'],})
     if err: return (err, None)
     if map_group_power['contest_manage'] not in data['current_group_power']:
         if int(submission_res['user_id']) != int(data['user_id']):
             return ((404, 'No Submission id'), None)
     return (None, submission_res)
Beispiel #11
0
 def post_group_user(self, data={}):
     required_args = [{
         'name': '+user_id',
         'type': int,
     }, {
         'name': '+group_id',
         'type': int,
     }, {
         'name': 'force',
         'type': bool,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     if 'force' in data:
         force = data.pop('force')
     else: force = False
     err, group = yield from Service.Group.get_group({'id': data['group_id']})
     if err: return (err, None)
     if group['type'] == 0 or force == True: # public
         if force:
             self.db.execute('DELETE FROM map_inpublic_group_user WHERE group_id=%s AND user_id=%s;', (data['group_id'], data['user_id'],))
         sql, param = self.gen_insert_sql('map_group_user', data)
         try: res = yield self.db.execute(sql, param)
         except: return ((400, 'Already in'), None)
         id = res.fetchone()['id']
         return (None, id)
     elif group['type'] == 1: #inpublic
         sql, param = self.gen_insert_sql('map_inpublic_group_user', data)
         try: res = self.db.execute(sql, param)
         except: return ((400, 'Already registered'), None)
         return (None, None)
     elif group['type'] == -1: #private
         return ((403, 'This group is private'), None)
Beispiel #12
0
 def put_bulletin(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     }, {
         'name': '+group_id',
         'type': int,
     }, {
         'name': '+setter_user_id',
         'type': int,
     }, {
         'name': '+title',
         'type': str,
         'xss': True,
     }, {
         'name': '+content',
         'type': str,
         'xss': True,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     err, res = yield from self.get_bulletin(data)
     if err: return (err, None)
     data.pop('id')
     sql, parma = self.gen_update_sql("bulletins", data)
     yield self.db.execute("%s WHERE id=%%s AND group_id=%%s;"%sql, parma+(res['id'],res['group_id'],))
     return (None, None)
Beispiel #13
0
 def post_verdict(self ,data={}):
     required_args = [{
         'name': '+title',
         'type': str,
     }, {
         'name': '+execute_type_id',
         'type': int,
     }, {
         'name': '+setter_user_id',
         'type': int,
     }, {
         'name': '+code_file',
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     code_file = None
     if data['code_file'] is None:
         return ((400, 'No code file'), None)
     data['file_name'] = data['code_file']['filename']
     code_file = data.pop('code_file')
     sql, param = self.gen_insert_sql('verdicts', data)
     id = (yield self.db.execute(sql, param)).fetchone()['id']
     
     if code_file:
         folder = '%s/data/verdicts/%s/' % (config.DATAROOT, str(id))
         file_path = '%s/%s' % (folder, data['file_name'])
         try: shutil.rmtree(folder)
         except: pass
         try: os.makedirs(folder)
         except: pass
         with open(file_path, 'wb+') as f:
             f.write(code_file['body'])
     return (None, str(id))
Beispiel #14
0
    def get_contest_list(self, data={}):
        required_args = [{
            'name': '+group_id',
            'type': int,
        }, {
            'name': '+page',
            'type': int,
        }, {
            'name': '+count',
            'type': int,
        }]
        err = form_validation(data, required_args)
        if err: return (err, None)
        sql = """
            SELECT 
            c.*,
            u.id as setter_user_id, u.account as setter_user,
            g.id as group_id, g.name as group_name
            FROM contests as c, users as u, groups as g
            WHERE u.id=c.setter_user_id AND g.id=c.group_id AND
            """
        sql += " (c.group_id=%s) "
        sql += " ORDER BY c.id limit %s OFFSET %s "

        res = yield self.db.execute(sql, (data['group_id'], data['count'], (int(data["page"])-1)*int(data["count"]), ))
        return (None, res.fetchall())
Beispiel #15
0
 def resettoken(self, data):
     required_args = [{
         'name': '+account',
         'type': dict,
     }, {
         'name': '+passwd',
         'type': str,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     id = data['account']['id']
     token = data['account']['token']
     sql = self.gen_select_sql('users', ['account', 'passwd'])
     res = yield self.db.execute(sql + ' WHERE id = %s;', (id,))
     if res.rowcount == 0:
         return ('ID Not Exist', None)
     res = res.fetchone()
     hpasswd = res['passwd']
     account = res['account']
     if self.hash_pwd(data['passwd']) != hpasswd:
         return ((400, 'Passwd Error'), None)
     # self.rs.delete("user_basic@%s" % id)
     # self.rs.delete("user_token@%s" % token)
     token = self.gen_token(account)
     sql, prama = self.gen_update_sql('users', {'token': token})
     res = yield self.db.execute(sql + ' WHERE id = %s;', prama + (id,))
     return (None, token)
Beispiel #16
0
    def get_verdict(self, data={}):
        required_args = [{
            'name': '+id',
            'type': int,
        }]
        err = form_validation(data, required_args)
        if err: return (err, None)
        if int(data['id']) == 0:
            col = ['id', 'title', 'execute_type_id', 'execute_type_id', 'file_name', 'setter_user_id']
            res = {x: '' for x in col}
            res['id'] = 0
            return (None, res)
        # res = self.rs.get('verdict@%s'%str(data['id']))
        # if res: return (None, res)
        res = yield self.db.execute('SELECT v.*, u.account as setter_user FROM verdicts as v, users as u WHERE v.id=%s AND v.setter_user_id=u.id;', (data['id'],))
        if res.rowcount == 0:
            return ((404, 'No Verdict ID'), None)
        res = res.fetchone()
        err, res['execute_type'] = yield from Service.Execute.get_execute({'id': res['execute_type_id']})

        folder = '%s/data/verdicts/%s/' % (config.DATAROOT, str(res['id']))
        file_path = '%s/%s' % (folder, res['file_name'])
        try: os.makedirs(folder)
        except: pass
        with open(file_path) as f:
            res['code'] = f.read()
        res['code_line'] = len(open(file_path).readlines())
        # self.rs.set('verdict@%s'%(str(data['id'])), res)
        return (None, res)
Beispiel #17
0
    def put_testdata(self, data={}):
        required_args = [
            {"name": "+id", "type": int},
            {"name": "+problem_id", "type": int},
            {"name": "input"},
            {"name": "output"},
            {"name": "+score", "type": int},
            {"name": "+time_limit", "type": int},
            {"name": "+memory_limit", "type": int},
            {"name": "+output_limit", "type": int},
        ]
        err = form_validation(data, required_args)
        if err:
            return (err, None)
        # self.rs.delete('testdata@%s'%(str(data['id'])))
        # self.rs.delete('testdata_list@problem@%s'%(str(data['problem_id'])))
        required_args = ["time_limit", "memory_limit", "output_limit", "score"]
        meta = {x: data[x] for x in required_args}
        sql, parma = self.gen_update_sql("testdata", meta)
        yield self.db.execute("%s WHERE id=%s" % (sql, data["id"]), parma)

        """ create folder """
        folder = "%s/data/testdata/%s" % (config.DATAROOT, str(data["id"]))
        try:
            os.makedirs(folder)
        except Exception as e:
            print(e)
        """ save file and upload to ftp """
        for x in ["input", "output"]:
            if data[x] != None:
                file_path = "%s/%s" % (folder, x)
                with open(file_path, "wb+") as f:
                    f.write(data[x]["body"])
        return (None, data["id"])
Beispiel #18
0
 def get_submission_list_count(self, data):
     required_args = [{
         'name': '+group_id',
         'type': int,
     }, {
         'name': 'problem_id',
         'type': int,
     }, {
         'name': 'account',
         'type': str,
     }, {
         'name': 'verdict',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     sql = "SELECT count(*) FROM submissions as s, problems as p"
     sql += " WHERE s.problem_id = p.id AND p.group_id=%s"%(data['group_id'])
     if data['problem_id']:
         sql += " AND problem_id=%s " % (int(data['problem_id']))
     if data['account']:
         try:
             user_id = (yield self.db.execute("SELECT id FROM users WHERE account=%s", (data['account'],))).fetchone()['id']
         except:
             user_id = 0
         sql += " AND user_id=%s " % (user_id)
     if data['verdict']:
         sql += " AND s.verdict=%s" % (data['verdict'])
     res = yield self.db.execute(sql)
     return (None, res.fetchone()['count'])
Beispiel #19
0
    def get_problem(self, data={}):
        required_args = [{
            'name': '+id',
            'type': int,
        }]
        err = form_validation(data, required_args)
        if err: return (err, None)
        if int(data['id']) == 0:
            col = ["id", "title", "description", "input", "output", "sample_input", "sample_output", "hint", "source", "group_id", "setter_user_id", "visible", "interactive", "checker_id", "created_at", "updated_at","pdf", "score_type_id"]
            res = { x: "" for x in col }
            res['id'] = 0
            res['visible'] = 0
            res['verdict_id'] = 1
            res['score_type_id'] = 1
            return (None, res)

        # res = self.rs.get('problem@%s' % str(data['id']))
        res = None
        if not res:
            sql = "SELECT p.*, u.account as setter_user FROM problems as p, users as u WHERE p.setter_user_id=u.id AND p.id=%s"
            res = yield self.db.execute(sql, (data["id"], ))
            if res.rowcount == 0:
                return ('No problem id', None)
            res = res.fetchone()
            # self.rs.set('problem@%s' % str(data['id']), res)
        err, res['execute'] = yield from Service.Problem.get_problem_execute({'problem_id': data['id']})
        err, res['testdata'] = yield from Service.Testdata.get_testdata_list_by_problem({'problem_id': data['id']})
        return (None, res)
Beispiel #20
0
    def get_contest(self, data={}):
        required_args = [{"name": "+id", "type": int}]
        err = form_validation(data, required_args)
        if err:
            return (err, None)
        ### new contest
        if int(data["id"]) == 0:
            col = ["id", "group_id", "visible", "title", "description", "setter_user_id", "type", "freeze"]
            res = {x: "" for x in col}
            col = ["register_start", "register_end", "start", "end"]
            res.update({x: datetime.datetime.now() for x in col})
            res["visible"] = 0
            res["id"] = 0
            res["problem"] = []
            return (None, res)

        # res = self.rs.get('contest@%s'%str(data['id']))
        res = None
        if not res:
            res = yield self.db.execute(
                "SELECT c.*, u.account as setter_user FROM contests as c, users as u WHERE c.setter_user_id=u.id AND c.id=%s;",
                (data["id"],),
            )
            if res.rowcount == 0:
                return ((404, "No Contest ID"), None)
            res = res.fetchone()
            # self.rs.set('contest@%s'%str(data['id']), res)
        err, res["problem"] = yield from self.get_contest_problem_list(data)
        err, res["user"] = yield from self.get_contest_user(data)
        return (None, res)
Beispiel #21
0
 def get_contest_submission_list(self, data={}):
     required_args = [
         {"name": "+id", "type": int},
         {"name": "+user_id", "type": int},
         {"name": "+current_group_power", "type": set},
         {"name": "+page", "type": int},
         {"name": "+count", "type": int},
     ]
     err = form_validation(data, required_args)
     if err:
         return (err, None)
     err, res = yield from self.get_contest(data)
     start = res["start"]
     end = res["end"]
     sql = """
     SELECT s.*, u.account as user, p.title as problem_title
     FROM submissions as s, users as u, map_contest_problem as mp, map_contest_user as mu, problems as p
     WHERE """
     if map_group_power["contest_manage"] not in data["current_group_power"]:
         sql += "u.id=%s AND " % (int(data["user_id"]))
     sql += """
     u.id=s.user_id AND mu.user_id=u.id 
     AND mu.contest_id=%s AND mp.contest_id=mu.contest_id  
     AND mp.problem_id=s.problem_id 
     AND mp.problem_id=p.id
     AND %s<=s.created_at AND s.created_at<=%s 
     ORDER BY s.id DESC LIMIT %s OFFSET %s;
     """
     submissions = yield self.db.execute(
         sql, (res["id"], start, end, data["count"], int(data["page"] - 1) * int(data["count"]))
     )
     return (None, submissions.fetchall())
Beispiel #22
0
 def put_contest(self, data={}):
     required_args = [
         {"name": "+id", "type": int},
         {"name": "+group_id", "type": int},
         {"name": "+setter_user_id", "type": int},
         {"name": "+visible", "type": int},
         {"name": "+title", "type": str},
         {"name": "+description", "type": str, "xss": True},
         {"name": "+register_start", "type": datetime.datetime},
         {"name": "+register_end", "type": datetime.datetime},
         {"name": "+start", "type": datetime.datetime},
         {"name": "+end", "type": datetime.datetime},
         {"name": "+freeze", "type": int},
         {"name": "+type", "type": int},
     ]
     err = form_validation(data, required_args)
     if err:
         return (err, None)
     if not data["freeze"] or data["freeze"] == "":
         data["freeze"] = 0
     err, res = yield from self.get_contest(data)
     if err:
         return (err, None)
     data.pop("id")
     sql, param = self.gen_update_sql("contests", data)
     yield self.db.execute(sql + " WHERE id=%s AND group_id=%s;", param + (res["id"], res["group_id"]))
     # self.rs.delete('contest@%s'%str(res['id']))
     return (None, res["id"])
Beispiel #23
0
 def get_submission_list_count(self, data):
     required_args = [{
         'name': '+group_id',
         'type': int,
     }, {
         'name': 'problem_id',
         'type': int,
     }, {
         'name': 'account',
         'type': str,
     }, {
         'name': 'verdict',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     sql = "SELECT count(*) FROM submissions as s, problems as p"
     sql += " WHERE s.problem_id = p.id AND p.group_id=%s" % (
         data['group_id'])
     if data['problem_id']:
         sql += " AND problem_id=%s " % (int(data['problem_id']))
     if data['account']:
         try:
             user_id = (yield self.db.execute(
                 "SELECT id FROM users WHERE account=%s",
                 (data['account'], ))).fetchone()['id']
         except:
             user_id = 0
         sql += " AND user_id=%s " % (user_id)
     if data['verdict']:
         sql += " AND s.verdict=%s" % (data['verdict'])
     res = yield self.db.execute(sql)
     return (None, res.fetchone()['count'])
Beispiel #24
0
 def post_execute(self, data={}):
     required_args = [{
         'name': '+setter_user_id',
         'type': int,
     }, {
         'name': '+lang',
         'type': int,
     }, {
         'name': 'description',
         'type': str,
     }, {
         'name': 'command',
         'type': list,
     }, {
         'name': 'cm_mode',
         'type': str,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     # self.rs.delete('execute_list')
     command = data.pop('command')
     sql, parma = self.gen_insert_sql("execute_types", data)
     id = (yield self.db.execute(sql, parma)).fetchone()['id']
     yield self.db.execute("DELETE FROM execute_steps WHERE execute_type_id=%s", (id,))
     for x in command:
         meta = {}
         meta['command'] = x
         meta['execute_type_id'] = id
         sql, parma = self.gen_insert_sql("execute_steps", meta)
         yield self.db.execute(sql, parma)
     # self.rs.delete('execute@%s'%(str(id)))
     return (None, id)
Beispiel #25
0
 def get_contest(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     ### new contest
     if int(data['id']) == 0:
         col = ['id', 'group_id', 'visible', 'title', 'description', 'setter_user_id', 'type', 'freeze']
         res = { x: '' for x in col }
         col = ['register_start', 'register_end', 'start', 'end']
         res.update({ x: datetime.datetime.now() for x in col })
         res['visible'] = 0
         res['id'] = 0
         res['problem'] = []
         return (None, res)
     
     # res = self.rs.get('contest@%s'%str(data['id']))
     res = None
     if not res:
         res = yield self.db.execute('SELECT c.*, u.account as setter_user FROM contests as c, users as u WHERE c.setter_user_id=u.id AND c.id=%s;', (data['id'], ))
         if res.rowcount == 0:
             return ((404, 'No Contest ID'), None)
         res = res.fetchone()
         # self.rs.set('contest@%s'%str(data['id']), res)
     err, res['problem'] = yield from self.get_contest_problem_list(data)
     err, res['user'] = yield from self.get_contest_user(data)
     return (None, res)
Beispiel #26
0
 def post_submission(self, data):
     required_args = [{
         'name': '+problem_id',
         'type': int,
     }, {
         'name': '+execute_type_id',
         'type': int,
     }, {
         'name': '+user_id',
         'type': int,
     }, {
         'name': '+ip',
         'type': str,
     }]
     err = form_validation(data, required_args)
     if err: return(err, None)
     if data['code_file'] == None and len(data['plain_code']) == 0:
         return ((400, 'No code'), None)
     meta = { x['name']: data[x['name']] for x in required_args }
     ### check problem has execute_type
     res = yield self.db.execute("SELECT * FROM map_problem_execute WHERE problem_id=%s and execute_type_id=%s", (data['problem_id'], data['execute_type_id'],))
     if res.rowcount == 0:
         return ((400, 'No execute type'), None)
     err, data['execute'] = yield from Service.Execute.get_execute({'id': data['execute_type_id']})
     ### get file name and length
     if data['code_file']:
         meta['file_name'] = data['code_file']['filename']
         meta['length'] = len(data['code_file']['body'])
     else:
         if data['plain_file_name'] is None:
             data['plain_file_name'] = ''
         if re.match('[\w\.]*', data['plain_file_name']).group(0) != data['plain_file_name']:
             data['plain_file_name'] = ''
         if data['plain_file_name'] != '':
             meta['file_name'] = data['plain_file_name']
         else:
             meta['file_name'] = map_default_file_name[int(data['execute']['lang'])]
         meta['length'] = len(data['plain_code'])
     ### save to db
     sql, parma = self.gen_insert_sql("submissions", meta)
     id = (yield self.db.execute(sql, parma)).fetchone()['id']
     ### save file
     folder = '%s/data/submissions/%s/' % (config.DATAROOT, str(id))
     file_path = '%s/%s' % (folder, meta['file_name'])
     try: shutil.rmtree(folder)
     except: pass
     try: os.makedirs(folder)
     except: pass
     print(type(data['plain_code']))
     try: print(type(data['code_file']['body']))
     except: pass
     if data['code_file']:
         with open(file_path, 'wb+') as f:
             f.write(data['code_file']['body'])
     else:
         with open(file_path, 'w+') as f:
             f.write(data['plain_code'])
     yield self.db.execute('INSERT INTO wait_submissions (submission_id) VALUES(%s);', (id,))
     return (None, id) 
Beispiel #27
0
 def delete_testdata(self, data={}):
     required_args = [{"name": "+id", "type": int}]
     err = form_validation(data, required_args)
     if err:
         return (err, None)
     # self.rs.delete('testdata@%s'%(str(data['id'])))
     # self.rs.delete('testdata_list@problem@%s'%(data['problem_id']))
     yield self.db.execute("DELETE FROM testdata WHERE id=%s", (data["id"],))
     return (None, None)
Beispiel #28
0
 def delete_bulletin(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     yield self.db.execute("DELETE FROM bulletins WHERE id=%s", (data['id'],))
     return (None, None)
Beispiel #29
0
 def get_bulletin_list_count(self, data={}):
     required_args = [{
         'name': '+group_id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     res = yield self.db.execute("SELECT COUNT(*) FROM bulletins WHERE group_id=%s", (data['group_id'],))
     return (None, res.fetchone()['count'])
Beispiel #30
0
 def get_contest_problem_list(self, data={}):
     required_args = [{
         'name': 'id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     res = yield self.db.execute('SELECT p.id, p.title, m.score, m.penalty FROM map_contest_problem as m, problems as p WHERE p.id=m.problem_id AND m.contest_id=%s ORDER BY m.id ASC;', (data['id'],))
     return (None, res.fetchall())
Beispiel #31
0
 def get_inpublic_group_user(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     res = yield self.db.execute('SELECT u.* FROM map_inpublic_group_user as m, users as u WHERE m.group_id=%s AND m.user_id=u.id;', (data['id'], ))
     res = res.fetchall()
     return (None, res)
Beispiel #32
0
 def delete_user(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     res = yield self.db.execute('DELETE FROM users WHERE id=%s;', (data['id'], ))
     if res.rowcount == 0: return ((404, 'No such user'), None)
     return (None, data['id'])
Beispiel #33
0
 def get_contest_problem_list(self, data={}):
     required_args = [{"name": "id", "type": int}]
     err = form_validation(data, required_args)
     if err:
         return (err, None)
     res = yield self.db.execute(
         "SELECT p.id, p.title, m.score, m.penalty FROM map_contest_problem as m, problems as p WHERE p.id=m.problem_id AND m.contest_id=%s ORDER BY m.id ASC;",
         (data["id"],),
     )
     return (None, res.fetchall())
Beispiel #34
0
 def get_user_group_info(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     },]
     err = form_validation(data, required_args)
     if err: return (err, None)
     res = yield self.db.execute("SELECT g.* FROM groups as g, map_group_user as m where m.user_id=%s and g.id=m.group_id ORDER BY g.id", (data['id'],))
     res = res.fetchall()
     return (None, res)
Beispiel #35
0
 def get_user_contest(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     },]
     err = form_validation(data, required_args)
     if err: return (err, None)
     res = yield self.db.execute('SELECT contest_id FROM map_contest_user WHERE user_id=%s;', (data['id'],))
     res = list({x['contest_id'] for x in res})
     return (None, res)
Beispiel #36
0
 def delete_problem_execute(self, data={}):
     required_args = [{
         'name': '+problem_id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     # self.rs.delete('execute@problem@%s' % str(data['problem_id']))
     yield self.db.execute("DELETE FROM map_problem_execute WHERE problem_id=%s", (data['problem_id'],))
     return (None, None)
Beispiel #37
0
 def get_user_inpublic_group(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     },]
     err = form_validation(data, required_args)
     if err: return (err, None)
     res = yield self.db.execute('SELECT * FROM map_inpublic_group_user WHERE user_id=%s;', (data['id'],))
     res = res.fetchall()
     return (None, res)
Beispiel #38
0
 def get_user_power_info(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     },]
     err = form_validation(data, required_args)
     if err: return (err, None)
     res = yield self.db.execute("SELECT power from map_user_power WHERE user_id=%s", (data['id'],))
     power = list({ x['power'] for x in res })
     return (None, power)
Beispiel #39
0
    def signup(self, data={}):
        '''
        data(dict): account(str), student_id(str), passwd(str), repasswd(str), email(str), school_id
        return id(str)
        '''
        ### check required arguemts
        required_args = [{
            'name': '+email',
            'type': str,
            'non_empty': True,
        }, {
            'name': '+account',
            'type': str,
            'non_empty': True,
        }, {
            'name': '+passwd',
            'type': str,
            'non_empty': True,
        }, {
            'name': '+repasswd',
            'type': str,
            'non_empty': True,
        },]
        err = form_validation(data, required_args)
        if err: return (err, None)
        ### check data valadation
        if data['passwd'] != data['repasswd']:
            return ((400, 'Confirm Two Password'), None)


        ### check conflict
        res = yield self.db.execute('SELECT * FROM users WHERE account = %s or email = %s', (data['account'], data['email']))
        if res.rowcount != 0:
            res = res.fetchone()
            if res['email'] == data['email']:
                return ((400, 'Email Exist'), None)
            elif res['account'] == data['account']:
                return ((400, 'Account Exist'), None)

        ### gen hashed passwd
        hpasswd = self.hash_pwd(data['passwd'])
        ### gen sql query
        data['passwd'] = hpasswd
        data['token'] = self.gen_token(data['account'])
        data.pop('repasswd')
        sql, prama = self.gen_insert_sql('users', data)
        res = yield self.db.execute(sql, prama)
        res = yield self.db.execute('SELECT id FROM users '
                'WHERE account = %s', (data['account'],))
        if res.rowcount == 0:
            return ((500, 'Something Wrong!!!'), None)
        id = res.fetchone()["id"]
        yield self.db.execute("INSERT INTO map_group_user (group_id, user_id) values (1, %s)", (id,))
        # self.rs.delete('user_list_count')
        return (None, str(id))
Beispiel #40
0
    def post_group_addusers(self, data={}):
        required_args = [
            {
                'name': '+group_id',
                'type': int,
            },
            {
                'name': '+user_ids',
                'type': list,
            },
            {
                'name': '+user_accounts',
                'type': list,
            },
        ]
        err = form_validation(data, required_args)
        if err: return (err, None)
        data['user_ids'] = (x.strip() for x in data['user_ids']
                            if x.strip() != '')
        data['user_accounts'] = (x.strip() for x in data['user_accounts']
                                 if x.strip() != '')
        # data['user_names'] = (x.strip() for x in data['user_names'] if x.strip() != '')
        # data['user_student_ids'] = (x.strip() for x in data['user_student_ids'] if x.strip() != '')
        print(data)
        ids = set(data['user_ids'])
        for account in data['user_accounts']:
            res = yield self.db.execute(
                'SELECT id FROM users WHERE account=%s;', (account, ))
            try:
                ids.add(res.fetchone()['id'])
            except:
                pass

        # for name in data['user_names']:
        # res = yield self.db.execute('SELECT id FROM users WHERE name=%s;', (name,))
        # try: ids.add(res.fetchone()['id'])
        # except: pass

        # for student_id in data['user_student_ids']:
        # res = yield self.db.execute('SELECT id FROM users WHERE student_id=%s;', (student_id,))
        # try: ids.add(res.fetchone()['id'])
        # except: pass
        print(ids)
        for id in ids:
            try:
                res = yield self.db.execute(
                    'INSERT INTO map_group_user (group_id, user_id) VALUES(%s, %s);',
                    (
                        data['group_id'],
                        id,
                    ))
            except Exception as e:
                print(e)
        return (None, None)
Beispiel #41
0
 def post_tag(self, data={}):
     required_args = [{
         'name': '+tag',
         'type': str,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     sql, param = self.gen_insert_sql('tags', data)
     id = yield self.db.execute(sql, param)
     id = id.fetchone()['id']
     return (None, id)
Beispiel #42
0
 def delete_testdata(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     # self.rs.delete('testdata@%s'%(str(data['id'])))
     # self.rs.delete('testdata_list@problem@%s'%(data['problem_id']))
     yield self.db.execute("DELETE FROM testdata WHERE id=%s", (data['id'],))
     return (None, None)
Beispiel #43
0
 def get_inpublic_group_user(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     res = yield self.db.execute(
         'SELECT u.* FROM map_inpublic_group_user as m, users as u WHERE m.group_id=%s AND m.user_id=u.id;',
         (data['id'], ))
     res = res.fetchall()
     return (None, res)
Beispiel #44
0
 def get_school(self, data={}):
     required_args = [{
         'name': '+id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     res = yield self.db.execute('SELECT * FROM schools WHERE id=%s;',
                                 (data['id'], ))
     if res.rowcount == 0:
         return ((404, 'No school ID'), None)
     return (None, res.fetchone())
Beispiel #45
0
 def delete_problem_execute(self, data={}):
     required_args = [{
         'name': '+problem_id',
         'type': int,
     }]
     err = form_validation(data, required_args)
     if err: return (err, None)
     # self.rs.delete('execute@problem@%s' % str(data['problem_id']))
     yield self.db.execute(
         "DELETE FROM map_problem_execute WHERE problem_id=%s",
         (data['problem_id'], ))
     return (None, None)
Beispiel #46
0
 def delete_tag(self, data={}):
     required_args = ['id']
     required_args = [{
         'name': '+id',
         'type': int,
     }]
     # err = self.check_required_args(required_args, data)
     err = form_validation(data, required_args)
     if err: return (err, None)
     # self.rs.delete('tag@%s'%(str(data['id'])))
     yield self.db.execute('DELETE FROM tags WHERE id=%s', (data['id'], ))
     return (None, None)