Exemplo n.º 1
0
 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()
Exemplo n.º 2
0
 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()
Exemplo n.º 3
0
 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)
Exemplo n.º 4
0
 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
Exemplo n.º 5
0
 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
Exemplo n.º 6
0
 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()
Exemplo n.º 7
0
 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()
Exemplo n.º 8
0
 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('不是队伍的成员!')
Exemplo n.º 9
0
    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
        }