Esempio n. 1
0
 async def get(self, *, category: str, page: int = 1):
     # TODO(iceboy): projection.
     if not self.has_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN):
         f = {'hidden': False}
     else:
         f = {}
     query = ProblemCategoryHandler.build_query(category)
     pdocs, ppcount, pcount = await pagination.paginate(problem.get_multi(domain_id=self.domain_id,
                                                                          **query,
                                                                          **f) \
                                                               .sort([('doc_id', 1)]),
                                                        page, self.PROBLEMS_PER_PAGE)
     if self.has_priv(builtin.PRIV_USER_PROFILE):
         # TODO(iceboy): projection.
         psdict = await problem.get_dict_status(self.domain_id,
                                                self.user['_id'],
                                                (pdoc['doc_id']
                                                 for pdoc in pdocs))
     else:
         psdict = None
     page_title = category or self.translate('(All Problems)')
     path_components = self.build_path(
         (self.translate('problem_main'), self.reverse_url('problem_main')),
         (page_title, None))
     await render_or_json_problem_list(self,
                                       page=page,
                                       ppcount=ppcount,
                                       pcount=pcount,
                                       pdocs=pdocs,
                                       category=category,
                                       psdict=psdict,
                                       page_title=page_title,
                                       path_components=path_components)
Esempio n. 2
0
    async def get(self, *, uid: int):
        is_self_profile = self.has_priv(
            builtin.PRIV_USER_PROFILE) and self.user['_id'] == uid
        udoc = await user.get_by_uid(uid)
        if not udoc:
            raise error.UserNotFoundError(uid)
        dudoc, sdoc = await asyncio.gather(
            domain.get_user(self.domain_id, udoc['_id']),
            token.get_most_recent_session_by_uid(udoc['_id']))

        rdocs = record.get_multi(get_hidden=self.has_priv(
            builtin.PRIV_VIEW_HIDDEN_RECORD),
                                 uid=uid).sort([('_id', -1)])
        rdocs = await rdocs.limit(10).to_list()
        pdict = await problem.get_dict_multi_domain(
            (rdoc['domain_id'], rdoc['pid']) for rdoc in rdocs)

        # check hidden problem
        if not self.has_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN):
            f = {'hidden': False}
        else:
            f = {}
        pdocs = problem.get_multi(domain_id=self.domain_id, owner_uid=uid,
                                  **f).sort([('_id', -1)])
        pcount = await pdocs.count()
        pdocs = await pdocs.limit(10).to_list()

        psdocs = problem.get_multi_solution_by_uid(self.domain_id, uid)
        psdocs_hot = problem.get_multi_solution_by_uid(self.domain_id, uid)
        pscount = await psdocs.count()
        psdocs = await psdocs.limit(10).to_list()
        psdocs_hot = await psdocs_hot.sort([('vote', -1), ('doc_id', -1)]
                                           ).limit(10).to_list()

        if self.has_perm(builtin.PERM_VIEW_DISCUSSION):
            ddocs = discussion.get_multi(self.domain_id, owner_uid=uid)
            dcount = await ddocs.count()
            ddocs = await ddocs.limit(10).to_list()
            vndict = await discussion.get_dict_vnodes(
                self.domain_id, map(discussion.node_id, ddocs))
        else:
            ddocs = []
            vndict = {}
            dcount = 0

        self.render('user_detail.html',
                    is_self_profile=is_self_profile,
                    udoc=udoc,
                    dudoc=dudoc,
                    sdoc=sdoc,
                    rdocs=rdocs,
                    pdict=pdict,
                    pdocs=pdocs,
                    pcount=pcount,
                    psdocs=psdocs,
                    pscount=pscount,
                    psdocs_hot=psdocs_hot,
                    ddocs=ddocs,
                    dcount=dcount,
                    vndict=vndict)
Esempio n. 3
0
 async def get(self, *, page: int = 1):
     # TODO(iceboy): projection.
     if not self.has_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN):
         f = {'hidden': False}
     else:
         f = {}
     pdocs, ppcount, pcount = await pagination.paginate(problem.get_multi(domain_id=self.domain_id,
                                                                          **f) \
                                                               .sort([('doc_id', 1)]),
                                                        page, self.PROBLEMS_PER_PAGE)
     if self.has_priv(builtin.PRIV_USER_PROFILE):
         # TODO(iceboy): projection.
         psdict = await problem.get_dict_status(self.domain_id,
                                                self.user['_id'],
                                                (pdoc['doc_id']
                                                 for pdoc in pdocs))
     else:
         psdict = None
     await render_or_json_problem_list(self,
                                       page=page,
                                       ppcount=ppcount,
                                       pcount=pcount,
                                       pdocs=pdocs,
                                       category='',
                                       psdict=psdict)
Esempio n. 4
0
File: record.py Progetto: vijos/vj4
async def run(domain_id: str):
  _logger.info('Clearing previous statuses')
  await db.coll('document.status').update_many(
    {'domain_id': domain_id, 'doc_type': document.TYPE_PROBLEM},
    {'$unset': {'journal': '', 'rev': '', 'status': '', 'rid': '',
                'num_submit': '', 'num_accept': ''}})
  pdocs = problem.get_multi(domain_id=domain_id, fields={'_id': 1, 'doc_id': 1}).sort('doc_id', 1)
  dudoc_factory = functools.partial(dict, num_submit=0, num_accept=0)
  dudoc_updates = collections.defaultdict(dudoc_factory)
  status_coll = db.coll('document.status')
  async for pdoc in pdocs:
    _logger.info('Problem {0}'.format(pdoc['doc_id']))
    # TODO(twd2): ignore no effect statuses like system error, ...
    rdocs = record.get_multi(domain_id=domain_id, pid=pdoc['doc_id'],
                             type=constant.record.TYPE_SUBMISSION,
                             fields={'_id': 1, 'uid': 1,
                                     'status': 1, 'score': 1}).sort('_id', 1)
    _logger.info('Reading records, counting numbers, updating statuses')
    factory = functools.partial(dict, num_submit=0, num_accept=0, status=0, rid='')
    psdocs = collections.defaultdict(factory)
    pdoc_update = {'num_submit': 0, 'num_accept': 0}
    async for rdoc in rdocs:
      accept = True if rdoc['status'] == constant.record.STATUS_ACCEPTED else False
      pdoc_update['num_submit'] += 1
      psdocs[rdoc['uid']]['num_submit'] += 1
      dudoc_updates[rdoc['uid']]['num_submit'] += 1
      if psdocs[rdoc['uid']]['status'] != constant.record.STATUS_ACCEPTED:
        psdocs[rdoc['uid']]['status'] = rdoc['status']
        psdocs[rdoc['uid']]['rid'] = rdoc['_id']
        if accept:
          pdoc_update['num_accept'] += 1
          dudoc_updates[rdoc['uid']]['num_accept'] += 1
    status_bulk = status_coll.initialize_unordered_bulk_op()
    execute = False
    for uid, psdoc in psdocs.items():
      execute = True
      (status_bulk.find({'domain_id': domain_id, 'doc_type': document.TYPE_PROBLEM,
                         'doc_id': pdoc['doc_id'], 'uid': uid})
       .upsert().update_one({'$set': {**psdoc}}))
    if execute:
      _logger.info('Committing')
      await status_bulk.execute()
    _logger.info('Updating problem')
    await document.set(domain_id, document.TYPE_PROBLEM, pdoc['doc_id'], **pdoc_update)
  # users' num_submit, num_accept
  execute = False
  user_coll = db.coll('domain.user')
  user_bulk = user_coll.initialize_unordered_bulk_op()
  _logger.info('Updating users')
  for uid, dudoc_update in dudoc_updates.items():
    execute = True
    (user_bulk.find({'domain_id': domain_id, 'uid': uid})
     .upsert().update_one({'$set': dudoc_update}))
  if execute:
    _logger.info('Committing')
    await user_bulk.execute()
Esempio n. 5
0
File: rp.py Progetto: yinjiayi/vj4
async def recalc(domain_id: str):
    user_coll = db.Collection('domain.user')
    await user_coll.update_many({'domain_id': domain_id},
                                {'$set': {
                                    'rp': 0.0
                                }})
    pdocs = problem.get_multi(domain_id=domain_id,
                              fields={
                                  '_id': 1,
                                  'doc_id': 1,
                                  'num_accept': 1
                              }).sort('doc_id', 1)
    dudoc_updates = {}
    status_coll = db.Collection('document.status')
    async for pdoc in pdocs:
        _logger.info('Problem {0}'.format(pdoc['doc_id']))
        psdocs = problem.get_multi_status(
            domain_id=domain_id,
            doc_id=pdoc['doc_id'],
            status=constant.record.STATUS_ACCEPTED).sort('rid', 1)
        order = 0
        rp_func = get_rp_func(pdoc)
        status_bulk = status_coll.initialize_unordered_bulk_op()
        async for psdoc in psdocs:
            order += 1
            rp = rp_func(order)
            status_bulk.find({
                '_id': psdoc['_id']
            }).update_one({'$set': {
                'rp': rp
            }})
            if psdoc['uid'] not in dudoc_updates:
                dudoc_updates[psdoc['uid']] = {'rp': rp}
            else:
                dudoc_updates[psdoc['uid']]['rp'] += rp
        if order != pdoc['num_accept']:
            _logger.warning('{0} != {1}'.format(order, pdoc['num_accept']))
            _logger.warning(
                'Problem {0} num_accept may be inconsistent.'.format(
                    pdoc['doc_id']))
        if order > 0:
            _logger.info('Committing')
            await status_bulk.execute()
    # users' rp
    user_bulk = user_coll.initialize_unordered_bulk_op()
    execute = False
    _logger.info('Updating users')
    for uid, dudoc_update in dudoc_updates.items():
        execute = True
        user_bulk.find({'domain_id': domain_id, 'uid': uid}) \
                 .upsert().update_one({'$set': dudoc_update})
    if execute:
        _logger.info('Committing')
        await user_bulk.execute()
Esempio n. 6
0
async def recalc(domain_id: str):
  pdocs = problem.get_multi(domain_id=domain_id)
  coll = db.Collection('document')
  bulk = coll.initialize_unordered_bulk_op()
  execute = False
  _logger.info('Calculating')
  async for pdoc in pdocs:
    difficulty_algo = difficulty_altorithm(pdoc['num_submit'], pdoc['num_accept'])
    difficulty = _get_difficulty(pdoc, difficulty_algo)
    bulk.find({'_id': pdoc['_id']}) \
        .update_one({'$set': {'difficulty': difficulty,
                              'difficulty_algo': difficulty_algo}})
    execute = True
  if execute:
    _logger.info('Committing')
    await bulk.execute()
Esempio n. 7
0
async def recalc(domain_id: str):
  pdocs = problem.get_multi(domain_id=domain_id)
  coll = db.coll('document')
  bulk = coll.initialize_unordered_bulk_op()
  execute = False
  _logger.info('Calculating')
  async for pdoc in pdocs:
    difficulty_algo = difficulty_altorithm(pdoc['num_submit'], pdoc['num_accept'])
    difficulty = _get_difficulty(pdoc, difficulty_algo)
    bulk.find({'_id': pdoc['_id']}) \
        .update_one({'$set': {'difficulty': difficulty,
                              'difficulty_algo': difficulty_algo}})
    execute = True
  if execute:
    _logger.info('Committing')
    await bulk.execute()
Esempio n. 8
0
File: user.py Progetto: vijos/vj4
  async def get(self, *, uid: int):
    is_self_profile = self.has_priv(builtin.PRIV_USER_PROFILE) and self.user['_id'] == uid
    udoc = await user.get_by_uid(uid)
    if not udoc:
      raise error.UserNotFoundError(uid)
    dudoc, sdoc = await asyncio.gather(domain.get_user(self.domain_id, udoc['_id']),
                                       token.get_most_recent_session_by_uid(udoc['_id']))

    rdocs = record.get_multi(get_hidden=self.has_priv(builtin.PRIV_VIEW_HIDDEN_RECORD),
                             uid=uid).sort([('_id', -1)])
    rdocs = await rdocs.limit(10).to_list()
    pdict = await problem.get_dict_multi_domain((rdoc['domain_id'], rdoc['pid']) for rdoc in rdocs)

    # check hidden problem
    if not self.has_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN):
      f = {'hidden': False}
    else:
      f = {}
    pdocs = problem.get_multi(domain_id=self.domain_id, owner_uid=uid, **f).sort([('_id', -1)])
    pcount = await pdocs.count()
    pdocs = await pdocs.limit(10).to_list()

    psdocs = problem.get_multi_solution_by_uid(self.domain_id, uid)
    psdocs_hot = problem.get_multi_solution_by_uid(self.domain_id, uid)
    pscount = await psdocs.count()
    psdocs = await psdocs.limit(10).to_list()
    psdocs_hot = await psdocs_hot.sort([('vote', -1), ('doc_id', -1)]).limit(10).to_list()

    if self.has_perm(builtin.PERM_VIEW_DISCUSSION):
      ddocs = discussion.get_multi(self.domain_id, owner_uid=uid)
      dcount = await ddocs.count()
      ddocs = await ddocs.limit(10).to_list()
      vndict = await discussion.get_dict_vnodes(self.domain_id, map(discussion.node_id, ddocs))
    else:
      ddocs = []
      vndict = {}
      dcount = 0

    self.render('user_detail.html', is_self_profile=is_self_profile,
                udoc=udoc, dudoc=dudoc, sdoc=sdoc,
                rdocs=rdocs, pdict=pdict, pdocs=pdocs, pcount=pcount,
                psdocs=psdocs, pscount=pscount, psdocs_hot=psdocs_hot,
                ddocs=ddocs, dcount=dcount, vndict=vndict)
Esempio n. 9
0
 async def get(self, *, uid: int):
     is_self_profile = self.has_priv(
         builtin.PRIV_USER_PROFILE) and self.user['_id'] == uid
     udoc = await user.get_by_uid(uid)
     if not udoc:
         raise error.UserNotFoundError(uid)
     dudoc, sdoc = await asyncio.gather(
         domain.get_user(self.domain_id, udoc['_id']),
         token.get_most_recent_session_by_uid(udoc['_id']))
     email = self.get_udoc_setting(udoc, 'mail')
     if email:
         email = email.replace('@', random.choice([' [at] ', '#']))
     bg = random.randint(1, 21)
     rdocs = record.get_multi(get_hidden=self.has_priv(
         builtin.PRIV_VIEW_HIDDEN_RECORD),
                              uid=uid).sort([('_id', -1)])
     rdocs = await rdocs.limit(10).to_list(None)
     # TODO(twd2): check status, eg. test, hidden problem, ...
     pdocs = problem.get_multi(domain_id=self.domain_id,
                               owner_uid=uid).sort([('_id', -1)])
     pcount = await pdocs.count()
     pdocs = await pdocs.limit(10).to_list(None)
     psdocs = problem.get_multi_solution_by_uid(self.domain_id, uid)
     pscount = await psdocs.count()
     psdocs = await psdocs.limit(10).to_list(None)
     ddocs = discussion.get_multi(self.domain_id, owner_uid=uid)
     dcount = await ddocs.count()
     ddocs = await ddocs.limit(10).to_list(None)
     self.render('user_detail.html',
                 is_self_profile=is_self_profile,
                 udoc=udoc,
                 dudoc=dudoc,
                 sdoc=sdoc,
                 email=email,
                 bg=bg,
                 rdocs=rdocs,
                 pdocs=pdocs,
                 pcount=pcount,
                 psdocs=psdocs,
                 pscount=pscount,
                 ddocs=ddocs,
                 dcount=dcount)
Esempio n. 10
0
File: rp.py Progetto: vijos/vj4
async def recalc(domain_id: str):
  user_coll = db.coll('domain.user')
  await user_coll.update_many({'domain_id': domain_id}, {'$set': {'rp': 0.0}})
  pdocs = problem.get_multi(domain_id=domain_id,
                            fields={'_id': 1, 'doc_id': 1, 'num_accept': 1}).sort('doc_id', 1)
  dudoc_updates = {}
  status_coll = db.coll('document.status')
  async for pdoc in pdocs:
    _logger.info('Problem {0}'.format(pdoc['doc_id']))
    psdocs = problem.get_multi_status(domain_id=domain_id,
                                      doc_id=pdoc['doc_id'],
                                      status=constant.record.STATUS_ACCEPTED).sort('rid', 1)
    order = 0
    rp_func = get_rp_func(pdoc)
    status_bulk = status_coll.initialize_unordered_bulk_op()
    async for psdoc in psdocs:
      order += 1
      rp = rp_func(order)
      status_bulk.find({'_id': psdoc['_id']}).update_one({'$set': {'rp': rp}})
      if psdoc['uid'] not in dudoc_updates:
        dudoc_updates[psdoc['uid']] = {'rp': rp}
      else:
        dudoc_updates[psdoc['uid']]['rp'] += rp
    if order != pdoc['num_accept']:
      _logger.warning('{0} != {1}'.format(order, pdoc['num_accept']))
      _logger.warning('Problem {0} num_accept may be inconsistent.'.format(pdoc['doc_id']))
    if order > 0:
      _logger.info('Committing')
      await status_bulk.execute()
  # users' rp
  user_bulk = user_coll.initialize_unordered_bulk_op()
  execute = False
  _logger.info('Updating users')
  for uid, dudoc_update in dudoc_updates.items():
    execute = True
    user_bulk.find({'domain_id': domain_id, 'uid': uid}) \
             .upsert().update_one({'$set': dudoc_update})
  if execute:
    _logger.info('Committing')
    await user_bulk.execute()
Esempio n. 11
0
async def run(domain_id: str):
    _logger.info('Clearing previous statuses')
    await db.Collection('document.status').update_many(
        {
            'domain_id': domain_id,
            'doc_type': document.TYPE_PROBLEM
        }, {
            '$unset': {
                'journal': '',
                'rev': '',
                'status': '',
                'rid': '',
                'num_submit': '',
                'num_accept': ''
            }
        })
    pdocs = problem.get_multi(domain_id=domain_id,
                              fields={
                                  '_id': 1,
                                  'doc_id': 1
                              }).sort('doc_id', 1)
    dudoc_factory = functools.partial(dict, num_submit=0, num_accept=0)
    dudoc_updates = collections.defaultdict(dudoc_factory)
    status_coll = db.Collection('document.status')
    async for pdoc in pdocs:
        _logger.info('Problem {0}'.format(pdoc['doc_id']))
        # TODO(twd2): ignore no effect statuses like system error, ...
        rdocs = record.get_multi(domain_id=domain_id,
                                 pid=pdoc['doc_id'],
                                 type=constant.record.TYPE_SUBMISSION,
                                 fields={
                                     '_id': 1,
                                     'uid': 1,
                                     'status': 1,
                                     'score': 1
                                 }).sort('_id', 1)
        _logger.info('Reading records, counting numbers, updating statuses')
        factory = functools.partial(dict,
                                    num_submit=0,
                                    num_accept=0,
                                    status=0,
                                    rid='')
        psdocs = collections.defaultdict(factory)
        pdoc_update = {'num_submit': 0, 'num_accept': 0}
        async for rdoc in rdocs:
            accept = True if rdoc[
                'status'] == constant.record.STATUS_ACCEPTED else False
            pdoc_update['num_submit'] += 1
            psdocs[rdoc['uid']]['num_submit'] += 1
            dudoc_updates[rdoc['uid']]['num_submit'] += 1
            if psdocs[
                    rdoc['uid']]['status'] != constant.record.STATUS_ACCEPTED:
                psdocs[rdoc['uid']]['status'] = rdoc['status']
                psdocs[rdoc['uid']]['rid'] = rdoc['_id']
                if accept:
                    pdoc_update['num_accept'] += 1
                    dudoc_updates[rdoc['uid']]['num_accept'] += 1
        status_bulk = status_coll.initialize_unordered_bulk_op()
        execute = False
        for uid, psdoc in psdocs.items():
            execute = True
            (status_bulk.find({
                'domain_id': domain_id,
                'doc_type': document.TYPE_PROBLEM,
                'doc_id': pdoc['doc_id'],
                'uid': uid
            }).upsert().update_one({'$set': {
                **psdoc
            }}))
        if execute:
            _logger.info('Committing')
            await status_bulk.execute()
        _logger.info('Updating problem')
        await document.set(domain_id, document.TYPE_PROBLEM, pdoc['doc_id'],
                           **pdoc_update)
    # users' num_submit, num_accept
    execute = False
    user_coll = db.Collection('domain.user')
    user_bulk = user_coll.initialize_unordered_bulk_op()
    _logger.info('Updating users')
    for uid, dudoc_update in dudoc_updates.items():
        execute = True
        (user_bulk.find({
            'domain_id': domain_id,
            'uid': uid
        }).upsert().update_one({'$set': dudoc_update}))
    if execute:
        _logger.info('Committing')
        await user_bulk.execute()