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
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
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
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
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
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
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)
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)
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)
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
def get_multi_status(*, fields=None, **kwargs): return document.get_multi_status(doc_type=document.TYPE_PROBLEM, fields=fields, **kwargs)
def get_multi_status(*, fields=None, **kwargs): return document.get_multi_status(doc_type=document.TYPE_TRAINING, fields=fields, **kwargs)
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)
def get_multi_status(*, fields=None, **kwargs): return document.get_multi_status(doc_type=document.TYPE_DISCUSSION, fields=fields, **kwargs)
def get_multi_status(*, fields=None, **kwargs): return document.get_multi_status(fields=fields, **kwargs)