示例#1
0
文件: problem.py 项目: JoshOY/vj4
async def get_list(domain_id: str,
                   uid: int = None,
                   fields=None,
                   skip: int = 0,
                   limit: int = 0):
    # TODO(iceboy): projection.
    pdocs = await (document.get_multi(domain_id,
                                      document.TYPE_PROBLEM,
                                      fields=fields).sort([
                                          ('doc_id', 1)
                                      ]).skip(skip).limit(limit).to_list(None))
    piter = iter(pdocs)
    if uid is not None:
        doc_ids = [pdoc['doc_id'] for pdoc in pdocs]
        # TODO(iceboy): projection.
        psdocs = (document.get_multi_status(domain_id,
                                            document.TYPE_PROBLEM,
                                            uid=uid,
                                            doc_id={
                                                '$in': doc_ids
                                            }).sort([('doc_id', 1)]))
        async for psdoc in psdocs:
            pdoc = next(piter)
            while pdoc['doc_id'] != psdoc['doc_id']:
                pdoc['psdoc'] = {}
                pdoc = next(piter)
            pdoc['psdoc'] = psdoc
    for rest in piter:
        rest['psdoc'] = {}
    return pdocs
示例#2
0
文件: training.py 项目: JoshOY/vj4
async def check(domain_id: str, tid: objectid.ObjectId, uid: int):
  tdoc = await get(domain_id, tid)
  done_count = await (document.get_multi_status(domain_id, document.TYPE_TRAINING, uid=uid,
                                                done=True, doc_id={'$in': tdoc['require_tids']})
                      .count())
  if done_count < len(tdoc['require_tids']):
    raise error.TrainingRequirementNotSatisfiedError(domain_id, document.TYPE_TRAINING, tid)
  return tdoc
示例#3
0
async def get_dict_solution_status(domain_id, pids, uid, *, fields=None):
  query = {
    'domain_id': domain_id,
    'doc_type': document.TYPE_PROBLEM_SOLUTION,
    'uid': uid,
    'doc_id': {'$in': list(set(pids))},
  }
  result = dict()
  async for pssdoc in document.get_multi_status(**query, fields=fields):
    result[pssdoc['doc_id']] = pssdoc
  return result
示例#4
0
文件: contest.py 项目: JoshOY/vj4
async def get_and_list_status(domain_id: str, tid: objectid.ObjectId, fields=None):
  # TODO(iceboy): projection, pagination.
  tdoc = await get(domain_id, tid)
  # TODO(iceboy): This does not work on multi-machine environment.
  if not _RULES[tdoc['rule']].show_func(tdoc, datetime.datetime.utcnow()):
    raise error.ContestStatusHiddenError()
  tsdocs = await (document.get_multi_status(domain_id, document.TYPE_CONTEST, doc_id=tdoc['doc_id'],
                                            fields=fields)
                  .sort(_RULES[tdoc['rule']].status_sort)
                  .to_list(None))
  return tdoc, tsdocs
示例#5
0
文件: problem.py 项目: vijos/vj4
async def get_dict_solution_status(domain_id, pids, uid, *, fields=None):
  query = {
    'domain_id': domain_id,
    'doc_type': document.TYPE_PROBLEM_SOLUTION,
    'uid': uid,
    'doc_id': {'$in': list(set(pids))},
  }
  result = dict()
  async for pssdoc in document.get_multi_status(**query, fields=fields):
    result[pssdoc['doc_id']] = pssdoc
  return result
示例#6
0
async def get_and_list_status(domain_id: str,
                              tid: objectid.ObjectId,
                              fields=None):
    # TODO(iceboy): projection, pagination.
    tdoc = await get(domain_id, tid)
    # TODO(iceboy): This does not work on multi-machine environment.
    if not _RULES[tdoc['rule']].show_func(tdoc, datetime.datetime.utcnow()):
        raise error.ContestStatusHiddenError()
    tsdocs = await (document.get_multi_status(
        domain_id, document.TYPE_CONTEST, doc_id=tdoc['doc_id'],
        fields=fields).sort(_RULES[tdoc['rule']].status_sort).to_list(None))
    return tdoc, tsdocs
示例#7
0
文件: training.py 项目: JoshOY/vj4
async def get_list_by_user(domain_id: str, uid: int, *, fields=None):
  tsdocs = document.get_multi_status(domain_id, document.TYPE_TRAINING,
                                     uid=uid, done=True, fields=['doc_id'])
  done_tids = []
  async for tsdoc in tsdocs:
    done_tids.append(tsdoc['doc_id'])
  # TODO(iceboy): pagination, projection.
  tdocs = await (document.get_multi(domain_id, document.TYPE_TRAINING,
                                    require_tids={'$not': {'$elemMatch': {'$nin': done_tids}}},
                                    fields=fields)
                 .sort([('doc_id', 1)])
                 .to_list(None))
  return tdocs
示例#8
0
文件: contest.py 项目: vijos/vj4
async def recalc_status(domain_id: str, doc_type: int, tid: objectid.ObjectId):
  if doc_type not in [document.TYPE_CONTEST, document.TYPE_HOMEWORK]:
    raise error.InvalidArgumentError('doc_type')
  tdoc = await document.get(domain_id, doc_type, tid)
  async with document.get_multi_status(domain_id=domain_id,
                                       doc_type=doc_type,
                                       doc_id=tdoc['doc_id']) as tsdocs:
    async for tsdoc in tsdocs:
      if 'journal' not in tsdoc or not tsdoc['journal']:
        continue
      journal = _get_status_journal(tsdoc)
      stats = RULES[tdoc['rule']].stat_func(tdoc, journal)
      await document.rev_set_status(domain_id, doc_type, tid, tsdoc['uid'], tsdoc['rev'],
                                    return_doc=False, journal=journal, **stats)
示例#9
0
async def recalc_status(domain_id: str, tid: objectid.ObjectId):
    tdoc = await document.get(domain_id, document.TYPE_CONTEST, tid)
    async with document.get_multi_status(domain_id=domain_id,
                                         doc_type=document.TYPE_CONTEST,
                                         doc_id=tdoc['doc_id']) as tsdocs:
        async for tsdoc in tsdocs:
            if 'journal' not in tsdoc or not tsdoc['journal']:
                continue
            journal = _get_status_journal(tsdoc)
            stats = RULES[tdoc['rule']].stat_func(tdoc, journal)
            await document.rev_set_status(domain_id,
                                          document.TYPE_CONTEST,
                                          tid,
                                          tsdoc['uid'],
                                          tsdoc['rev'],
                                          return_doc=False,
                                          journal=journal,
                                          **stats)
示例#10
0
async def recalc_status(domain_id: str, doc_type: int, tid: objectid.ObjectId):
  if doc_type not in [document.TYPE_CONTEST, document.TYPE_HOMEWORK]:
    raise error.InvalidArgumentError('doc_type')
  tdoc = await document.get(domain_id, doc_type, tid)
  async with document.get_multi_status(domain_id=domain_id,
                                       doc_type=doc_type,
                                       doc_id=tdoc['doc_id']) as tsdocs:
    async for tsdoc in tsdocs:
      if 'journal' not in tsdoc or not tsdoc['journal']:
        continue
      journal = _get_status_journal(tsdoc)
      stat_func = RULES[tdoc['rule']].stat_func
      if asyncio.iscoroutinefunction(stat_func):
        stats = await stat_func(tdoc, journal)
      else:
        stats = RULES[tdoc['rule']].stat_func(tdoc, journal)
      await document.rev_set_status(domain_id, doc_type, tid, tsdoc['uid'], tsdoc['rev'],
                                    return_doc=False, journal=journal, **stats)
示例#11
0
文件: problem.py 项目: lihuaijun/vj4
async def get_list(domain_id: str, uid: int=None, fields=None, skip: int=0, limit: int=0):
  # TODO(iceboy): projection.
  pdocs = await (document.get_multi(domain_id, document.TYPE_PROBLEM, fields=fields)
                         .sort([('doc_id', 1)])
                         .skip(skip)
                         .limit(limit)
                         .to_list(None))
  piter = iter(pdocs)
  if uid is not None:
    doc_ids = [pdoc['doc_id'] for pdoc in pdocs]
    # TODO(iceboy): projection.
    psdocs = document.get_multi_status(domain_id, document.TYPE_PROBLEM,
                                       uid=uid, doc_id={'$in': doc_ids})
    async for psdoc in psdocs:
      pdoc = next(piter)
      while pdoc['doc_id'] < psdoc['doc_id']:
        pdoc['psdoc'] = {}
        pdoc = next(piter)
      pdoc['psdoc'] = psdoc
  for rest in piter:
    rest['psdoc'] = {}
  return pdocs
示例#12
0
文件: problem.py 项目: whitefirer/vj4
def get_multi_status(*, fields=None, **kwargs):
    return document.get_multi_status(doc_type=document.TYPE_PROBLEM,
                                     fields=fields,
                                     **kwargs)
示例#13
0
文件: training.py 项目: vijos/vj4
def get_multi_status(*, fields=None, **kwargs):
  return document.get_multi_status(doc_type=document.TYPE_TRAINING, fields=fields, **kwargs)
示例#14
0
文件: contest.py 项目: zhiwehu/vj4
def get_multi_status(doc_type: int, *, fields=None, **kwargs):
    if doc_type not in [document.TYPE_CONTEST, document.TYPE_HOMEWORK]:
        raise error.InvalidArgumentError('doc_type')
    return document.get_multi_status(doc_type=doc_type,
                                     fields=fields,
                                     **kwargs)
示例#15
0
def get_multi_status(*, fields=None, **kwargs):
    return document.get_multi_status(doc_type=document.TYPE_DISCUSSION,
                                     fields=fields,
                                     **kwargs)
示例#16
0
文件: contest.py 项目: vijos/vj4
def get_multi_status(doc_type: int, *, fields=None, **kwargs):
  if doc_type not in [document.TYPE_CONTEST, document.TYPE_HOMEWORK]:
    raise error.InvalidArgumentError('doc_type')
  return document.get_multi_status(doc_type=doc_type,
                                   fields=fields, **kwargs)
示例#17
0
def get_multi_status(*, fields=None, **kwargs):
    return document.get_multi_status(fields=fields, **kwargs)