Пример #1
0
    async def get(self, *, rid: objectid.ObjectId):
        rdoc = await record.get(rid)
        if not rdoc or rdoc['type'] != constant.record.TYPE_PRETEST:
            raise error.RecordNotFoundError(rid)
        if not self.own(rdoc, builtin.PRIV_READ_PRETEST_DATA_SELF, 'uid'):
            self.check_priv(builtin.PRIV_READ_PRETEST_DATA)
        ddoc = await document.get(rdoc['domain_id'],
                                  document.TYPE_PRETEST_DATA, rdoc['data_id'])
        if not ddoc:
            raise error.RecordDataNotFoundError(rdoc['_id'])

        output_buffer = io.BytesIO()
        zip_file = zipfile.ZipFile(output_buffer, 'a', zipfile.ZIP_DEFLATED)
        config_content = str(len(ddoc['content'])) + '\n'
        for i, (data_input, data_output) in enumerate(ddoc['content']):
            input_file = 'input{0}.txt'.format(i)
            output_file = 'output{0}.txt'.format(i)
            config_content += '{0}|{1}|1|10|262144\n'.format(
                input_file, output_file)
            zip_file.writestr('Input/{0}'.format(input_file), data_input)
            zip_file.writestr('Output/{0}'.format(output_file), data_output)
        zip_file.writestr('Config.ini', config_content)
        # mark all files as created in Windows :p
        for zfile in zip_file.filelist:
            zfile.create_system = 0
        zip_file.close()

        await self.binary(output_buffer.getvalue(), 'application/zip')
Пример #2
0
 async def get(self, *, rid: objectid.ObjectId):
   rdoc = await record.get(rid)
   if not rdoc:
     raise error.RecordNotFoundError(rid)
   rdoc['udoc'], rdoc['pdoc'] = await asyncio.gather(
       user.get_by_uid(rdoc['uid']), problem.get(rdoc['domain_id'], rdoc['pid']))
   self.render('record_detail.html', rdoc=rdoc)
Пример #3
0
    async def get(self, *, rid: objectid.ObjectId):
        rdoc = await record.get(rid)
        if not rdoc:
            raise error.RecordNotFoundError(rid)
        ddoc = await document.get(rdoc['domain_id'],
                                  document.TYPE_PRETEST_DATA, rdoc['data_id'])
        if not ddoc:
            raise error.ProblemDataNotFoundError(rdoc['pid'])

        output_buffer = io.BytesIO()
        zip_file = zipfile.ZipFile(output_buffer, 'a', zipfile.ZIP_DEFLATED)
        config_content = str(len(ddoc['data_input'])) + "\n"
        for i, (data_input, data_output) in enumerate(
                zip(ddoc['data_input'], ddoc['data_output'])):
            input_file = 'input{0}.txt'.format(i)
            output_file = 'output{0}.txt'.format(i)
            config_content += '{0}|{1}|1|10|1024\n'.format(
                input_file, output_file)
            zip_file.writestr('Input/{0}'.format(input_file), data_input)
            zip_file.writestr('Output/{0}'.format(output_file), data_output)
        zip_file.writestr('Config.ini', config_content)

        # mark all files as created in Windows
        for zfile in zip_file.filelist:
            zfile.create_system = 0

        zip_file.close()
        await self.binary(output_buffer.getvalue())
Пример #4
0
 async def get(self, *, rid: objectid.ObjectId):
     rdoc = await record.get(rid)
     if not rdoc:
         raise error.RecordNotFoundError(rid)
     # TODO(iceboy): Check domain permission, permission for visibility in place.
     if rdoc['domain_id'] != self.domain_id:
         self.redirect(
             self.reverse_url('record_detail',
                              rid=rid,
                              domain_id=rdoc['domain_id']))
         return
     # check permission for visibility: contest
     show_status = True
     if rdoc['tid']:
         now = datetime.datetime.utcnow()
         try:
             tdoc = await contest.get(rdoc['domain_id'], rdoc['tid'])
             show_status = contest.RULES[tdoc['rule']].show_func(tdoc, now) \
                           or self.has_perm(builtin.PERM_VIEW_CONTEST_HIDDEN_STATUS)
         except error.DocumentNotFoundError:
             tdoc = None
     else:
         tdoc = None
     # TODO(twd2): futher check permission for visibility.
     if (not self.own(rdoc, field='uid')
             and not self.has_perm(builtin.PERM_READ_RECORD_CODE)
             and not self.has_priv(builtin.PRIV_READ_RECORD_CODE)):
         del rdoc['code']
     if not show_status and 'code' not in rdoc:
         raise error.PermissionError(
             builtin.PERM_VIEW_CONTEST_HIDDEN_STATUS)
     udoc, dudoc = await asyncio.gather(
         user.get_by_uid(rdoc['uid']),
         domain.get_user(self.domain_id, rdoc['uid']))
     try:
         pdoc = await problem.get(rdoc['domain_id'], rdoc['pid'])
     except error.ProblemNotFoundError:
         pdoc = {}
     if show_status and 'judge_uid' in rdoc:
         judge_udoc = await user.get_by_uid(rdoc['judge_uid'])
     else:
         judge_udoc = None
     # check permission for visibility: hidden problem
     if pdoc.get(
             'hidden',
             False) and not self.has_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN):
         pdoc = None
     self.render('record_detail.html',
                 rdoc=rdoc,
                 udoc=udoc,
                 dudoc=dudoc,
                 pdoc=pdoc,
                 tdoc=tdoc,
                 judge_udoc=judge_udoc,
                 show_status=show_status)
Пример #5
0
 async def get(self, *, rid: objectid.ObjectId):
     rdoc = await record.get(rid)
     if not rdoc:
         raise error.RecordNotFoundError(rid)
     # TODO(iceboy): Check domain permission, permission for visibility in place.
     if rdoc['domain_id'] != self.domain_id:
         self.redirect(
             self.reverse_url('record_detail',
                              rid=rid,
                              domain_id=rdoc['domain_id']))
         return
     if rdoc['tid']:
         show_status, tdoc = await self.rdoc_contest_visible(rdoc)
     else:
         show_status, tdoc = True, None
     # TODO(twd2): futher check permission for visibility.
     if (not self.own(rdoc, field='uid')
             and not self.has_perm(builtin.PERM_READ_RECORD_CODE)
             and not self.has_priv(builtin.PRIV_READ_RECORD_CODE)):
         del rdoc['code']
     if not show_status and 'code' not in rdoc:
         if tdoc['doc_type'] == document.TYPE_CONTEST:
             raise error.PermissionError(
                 builtin.PERM_VIEW_CONTEST_HIDDEN_SCOREBOARD)
         else:  # TYPE_HOMEWORK
             raise error.PermissionError(
                 builtin.PERM_VIEW_HOMEWORK_HIDDEN_SCOREBOARD)
     udoc, dudoc = await asyncio.gather(
         user.get_by_uid(rdoc['uid']),
         domain.get_user(self.domain_id, rdoc['uid']))
     try:
         pdoc = await problem.get(rdoc['domain_id'], rdoc['pid'])
     except error.ProblemNotFoundError:
         pdoc = {}
     if show_status and 'judge_uid' in rdoc:
         judge_udoc = await user.get_by_uid(rdoc['judge_uid'])
     else:
         judge_udoc = None
     # check permission for visibility: hidden problem
     if pdoc.get(
             'hidden',
             False) and not self.has_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN):
         pdoc = None
     url_prefix = '/d/{}'.format(urllib.parse.quote(self.domain_id))
     self.render('record_detail.html',
                 rdoc=rdoc,
                 udoc=udoc,
                 dudoc=dudoc,
                 pdoc=pdoc,
                 tdoc=tdoc,
                 judge_udoc=judge_udoc,
                 show_status=show_status,
                 socket_url=url_prefix +
                 '/records/{}/conn'.format(rid))  # FIXME(twd2): magic
Пример #6
0
 async def get(self, *, rid: objectid.ObjectId):
     rdoc = await record.get(rid)
     if not rdoc or rdoc['type'] != constant.record.TYPE_PRETEST:
         raise error.RecordNotFoundError(rid)
     if not self.own(rdoc, builtin.PRIV_READ_PRETEST_DATA_SELF, 'uid'):
         self.check_priv(builtin.PRIV_READ_PRETEST_DATA)
     if not rdoc.get('data_id'):
         raise error.RecordDataNotFoundError(rdoc['_id'])
     secret = await fs.get_secret(rdoc['data_id'])
     if not secret:
         raise error.RecordDataNotFoundError(rdoc['_id'])
     self.redirect(options.cdn_prefix.rstrip('/') + \
                   self.reverse_url('fs_get', domain_id=builtin.DOMAIN_ID_SYSTEM,
                                    secret=secret))
Пример #7
0
 async def get(self, *, rid: objectid.ObjectId):
   rdoc = await record.get(rid)
   if not rdoc or rdoc['type'] != constant.record.TYPE_SUBMISSION:
     raise error.RecordNotFoundError(rid)
   if not self.own(rdoc, field='uid') and not self.has_priv(builtin.PRIV_READ_RECORD_CODE):
     self.check_perm(builtin.PERM_READ_RECORD_CODE)
   if not rdoc.get('code') or rdoc['code_type'] == constant.record.FILE_TYPE_TEXT:
     raise error.RecordDataNotFoundError(rdoc['_id'])
   secret = await fs.get_secret(rdoc['code'])
   if not secret:
     raise error.RecordDataNotFoundError(rdoc['_id'])
   self.redirect(options.cdn_prefix.rstrip('/') + \
                 self.reverse_url('fs_get', domain_id=builtin.DOMAIN_ID_SYSTEM,
                                  secret=secret))
Пример #8
0
  async def get(self, *, rid: objectid.ObjectId, cid: int):
    rdoc = await record.get(rid)
    if not rdoc:
      raise error.RecordNotFoundError(rid)

    # TODO(iceboy): Check domain permission, permission for visibility in place.
    if rdoc['domain_id'] != self.domain_id:
      self.redirect(self.reverse_url('record_detail_case', rid=rid, cid=cid, domain_id=rdoc['domain_id']))
      return

    if 'cases' not in rdoc or cid > len(rdoc['cases']):
      raise error.RecordCaseNotFoundError(rdoc['_id'], cid)

    rcdoc = rdoc['cases'][cid - 1]
    show_detail = self.case_detail_visible(rdoc)

    if not show_detail:
      raise error.RecordCaseNotAvailableError(rdoc['_id'])

    self.render('record_detail_case.html', rdoc=rdoc, rcdoc=rcdoc, show_detail=show_detail)