def post(self, request, contest_id: str, group_id: str) -> Any: group = Group.objects.get(id=int(group_id)) if group.locked: raise Exception('队伍已经锁定了!') if request.user != group.leader: raise Exception('没有权限锁定队伍!') group.locked = True group.save() for each in group.members.all(): message = SystemMessage(receiver=each, content=f'队伍 {group.name} 已经锁定了,你无法退出队伍了。') message.save()
def post(self, request, contest_id): self.check_input(['rankName', 'ids']) rank_name = request.data.get('rankName') ids = request.data.get('ids') groups = Group.objects.filter(id__in=ids) c = Competition.objects.get(id=int(contest_id)) for group in groups: group.rank = rank_name group.save() message = SystemMessage( receiver=group.leader, content=f'你的队伍 {group.name} 在 {c.name} 中获得了 {rank_name}!') message.save()
def post(self, request, contest_id, gstage_id): self.check_input(['deltaScore', 'deltaMsg']) c = Competition.objects.get(id=int(contest_id)) stage = GStage.objects.get(id=gstage_id) stage.deltaScore = float(request.data.get('deltaScore')) stage.deltaMsg = request.data.get('deltaMsg') message = SystemMessage( receiver=stage.group.leader, content= f'在 {c.name} 中,你的队伍的分数 {stage.group.name} 因为 {stage.deltaMsg} 变化了 {stage.deltaScore}' ) message.save() compute_average_score(stage)
def put(self, request, contest_id: str, notice_id: str) -> Any: notice = Notice.objects.get(id=int(notice_id)) self.check_input(['title', 'content']) notice.title = request.data.get('title') notice.content = request.data.get('content') notice.modified_time = timezone.now() notice.save() competition = Competition.objects.get(id=int(contest_id)) for group in competition.enrolled_groups.all(): for each in group.members.all(): message = SystemMessage( receiver=each, content= f'{competition.publisher} 修改了 {competition.name} 的公告 ({notice.title}) 。快去看看吧!' ) message.save() return
def post(self, request, contest_id: str) -> Any: self.check_input(['group_ids', 'stage']) stage = int(request.data['stage']) c = Competition.objects.get(id=int(contest_id)) cstage = c.stage_list.all().get(stage=stage) with transaction.atomic(): for id in request.data['group_ids']: group = Group.objects.get(id=id) group.current_stage = stage group.save() if group.stage_list.filter(stage=stage): raise Exception(f"{group.name} 队伍 已经进入了 {stage} 阶段!") message = SystemMessage( receiver=group.leader, content=f'你的队伍 {group.name} 晋级到了新的阶段 ({cstage.name})!') message.save() gstage = GStage(stage=stage, group=group, score=0.0) gstage.save() return
def post(self, request, contest_id: str) -> Any: user = request.user self.check_input(['accept', 'form']) c = Competition.objects.get(id=int(contest_id)) invitation = c.sent_invitations.get(invitee=user, status=InvitationStatus.DEFAULT) accepted = request.data.get('accept') if accepted: c.judges.add(user) collection = MONGO_CLIENT.db.groupEnrollForm collection.insert_one({ 'user_id': int(user.id), 'contest_id': int(contest_id), 'enrollForm': request.data['form'] }) c.save() invitation.status = InvitationStatus.ACCEPTED if accepted else InvitationStatus.REJECTED invitation.save() content = user.username + ('接受' if accepted else '拒绝') + '了你的邀请' message = SystemMessage(receiver=c.publisher, content=content) message.save()
def post(self, request, contest_id: str, group_id: str) -> Any: user = request.user self.check_input(['accept', 'form']) group = Group.objects.get(id=int(group_id)) invitation = group.sent_invitations.get( invitee=user, status=InvitationStatus.DEFAULT) accepted = request.data.get('accept') if accepted: if user.joint_groups.filter(competition_id=group.competition.id): raise Exception('你已经参加了这场比赛了!') group.members.add(user) collection = MONGO_CLIENT.db.groupEnrollForm collection.insert_one({ 'user_id': int(user.id), 'contest_id': int(contest_id), 'enrollForm': request.data['form'] }) group.save() invitation.status = InvitationStatus.ACCEPTED if accepted else InvitationStatus.REJECTED invitation.save() content = user.username + ('接受' if accepted else '拒绝') + '了你的邀请' message = SystemMessage(receiver=group.leader, content=content) message.save()
def post(self, request, contest_id: str, group_id: str) -> Any: group = Group.objects.get(id=int(group_id)) if group.locked: raise Exception('队伍已经锁定了!') if request.user == group.leader: group.members.remove(request.user) collection = MONGO_CLIENT.db.groupEnrollForm collection.delete_one({ 'user_id': request.user.id, 'contest_id': int(contest_id) }) if len(group.members.all()) == 0: # delete foreign key first for stage in group.stage_list.all(): stage.delete() group.delete() else: member = group.members.first() group.leader = member group.save() for each in group.members.all(): message = SystemMessage( receiver=each, content= f'{request.user.username} 退出了队伍 {group.name}。 {group.leader.username} 现在是新的队长了!' ) message.save() elif group.members.filter(id=request.user.id): group.members.remove(request.user) group.save() message = SystemMessage( receiver=group.leader, content=f'{request.user.username} 退出了队伍 {group.name}.') message.save() else: raise Exception('不是队伍的成员!')
def post(self, request, contest_id: str) -> Any: self.check_input(['stage', 'serious', 'maxconn', 'judges']) c = Competition.objects.get(id=int(contest_id)) stage = int(request.data['stage']) maxconn = request.data['maxconn'] serious = request.data['serious'] avoidField = request.data.get('avoidField', '') judge_workloads = request.data['judges'] judge_workloads = {x['username']: x['assign'] for x in judge_workloads} enroll_forms = MONGO_CLIENT.db.groupEnrollForm answer_map = {} answer_count = 0 def get_id(ans): nonlocal answer_count, answer_map if ans not in answer_map: answer_map[ans] = answer_count answer_count += 1 return answer_map[ans] def get_label(user): form = json.loads( enroll_forms.find_one({ 'user_id': user.id, 'contest_id': c.id })['enrollForm']) return get_id(form[avoidField]) cstage = c.stage_list.get(stage=stage if stage % 2 == 1 else stage - 1) if cstage.is_assigned: raise Exception("已经分配过任务了!") qualified_groups = c.enrolled_groups.filter(current_stage=stage) submitted_gstages = [] group_token = {} for group in qualified_groups: gstage = group.stage_list.get(stage=stage if stage % 2 == 1 else stage - 1) if gstage.has_commit: submitted_gstages.append(gstage) if avoidField: group_token[gstage.id] = get_label(group.leader) judges = list(c.judges.all()) judge_count = {x.username: 0 for x in judges} group_count = {x.id: 0 for x in submitted_gstages} judge_token = {} if avoidField: for judge in judges: label = get_label(judge) judge_token[judge.username] = label libflow.set_max_conn(maxconn) libflow.set_use_token(not not avoidField) libflow.set_team_size(len(submitted_gstages)) libflow.set_judge_size(len(judges)) if avoidField: libflow.set_team_tokens( [group_token[x.id] for x in submitted_gstages]) libflow.set_judge_tokens([judge_token[x.username] for x in judges]) judge_bottlenecks = [] for judge in judges: work = judge_workloads.get(judge.username, 0) judge_bottlenecks.append(work) libflow.set_judge_bottlenecks(judge_bottlenecks) result = libflow.network_flow() for i in range(len(result)): assigns = result[i] for g_idx in assigns: judge_count[judges[i].username] += 1 group_count[submitted_gstages[g_idx].id] += 1 if serious: review_meta = ReviewMeta(reviewer=judges[i], stage=submitted_gstages[g_idx]) review_meta.save() if serious: cstage.is_assigned = True cstage.save() groupNotFull = len( [key for key, value in group_count.items() if value < maxconn]) groupZero = len( [key for key, value in group_count.items() if value == 0]) if serious: judge_map = {x.username: x for x in judges} for name in judge_map: user = judge_map[name] message = SystemMessage( receiver=user, content=f'在 {c.name} 比赛中,你被分配了 {judge_count[name]} 个任务。') message.save() return { "judges": [{ "username": judge.username, "assign": judge_count[judge.username] } for judge in judges], "groupNotFull": groupNotFull, "groupZero": groupZero }