def preview(fight): context = { "fight_id": fight.pk, "round": fight.round.order, "room": fight.room.name } prblms = [] for problem in fight.round.tournament.problem_set.all(): prblms.append((problem.number, problem.title)) context["problems"] = prblms stages = [] for idx, stage in enumerate(_fightpreview(fight)): sd = { "order": idx + 1, "reporter": stage["rep"].origin.name, "opponent": stage["opp"].origin.name, "reviewer": stage["rev"].origin.name, "problems": list(stage['free']), "rejected_reporter": stage["a"], "presented_reporter": stage["b"], "opposed_opponent": stage["c"], "presented_opponent": stage["d"], "lifted_bans": stage["lifted"] } stages.append(sd) context["stages"] = stages return context
def get(self, request, fight_id, stage): fight = get_object_or_404(Fight, pk=fight_id) all_stages = [] act_stage = {'is_last': False} for s in fight.stage_set.all(): st = {'active': False} if act_stage['is_last']: act_stage['is_last'] = False if s.order == int(stage): st['active'] = True act_stage['is_last'] = True act_stage['order'] = s.order act_stage['rep'] = s.rep_attendance.team.origin.name act_stage['opp'] = s.opp_attendance.team.origin.name act_stage['rev'] = s.rev_attendance.team.origin.name act_stage['prev'] = _fightpreview(s.fight)[s.order - 1] act_stage['form'] = StageForm(s) all_stages.append(st) if 'form' not in act_stage: return redirect('fight:fightjury', fight_id=fight_id) return render(request, "fight/fight.html", context={ 'round': fight.round.order, 'room': fight.room.name, 'id': fight_id, 'all_stages': all_stages, 'stage': act_stage, 'locked': fight.locked })
def _fight_check(self, fight): errors = [] warnings = [] chair = None try: chair = fight.jurorsession_set.get(role__type=JurorRole.CHAIR) except: errors.append("Please set a chair") jurors = fight.jurorsession_set.filter(role__type=JurorRole.JUROR) if jurors.count() < 4: errors.append("A fight needs at least 5 jurors") stage_info = [] for stage in fight.stage_set.all(): prev = _fightpreview(fight)[stage.order - 1] team = {} team['rep'] = stage.rep_attendance.team.origin.name team['opp'] = stage.opp_attendance.team.origin.name team['rev'] = stage.rev_attendance.team.origin.name person = {} person['rep'] = "" person['opp'] = "" person['rev'] = "" if stage.reporter: person['rep'] = stage.reporter else: errors.append("Stage %d missing reporter name" % stage.order) if stage.opponent: person['opp'] = stage.opponent else: errors.append("Stage %d missing opponent name" % stage.order) if stage.reviewer: person['rev'] = stage.reviewer else: errors.append("Stage %d missing reviewer name" % stage.order) presented = "" if stage.presented: presented = stage.presented.number if presented not in prev['free']: warnings.append( "Problem presented in stage %d not in preview" % stage.order) if presented in stage.rejections.all().values_list('number', flat=True): errors.append( "Stage %d presented problem is in rejected list" % stage.order) else: errors.append("Stage %d has no presented problem" % stage.order) grades_j = [] for jurorsess in fight.jurorsession_set( manager="voting").select_related('juror').all(): juror = jurorsess.juror grade_j = {'id': juror.id, 'name': juror.attendee} try: grade_j['rep'] = int( JurorGrade.objects.get( stage_attendee=stage.rep_attendance, juror_session__juror=juror).grade) except: errors.append("Stage %d missing reporter grade from %s" % (stage.order, juror.attendee)) try: grade_j['opp'] = int( JurorGrade.objects.get( stage_attendee=stage.opp_attendance, juror_session__juror=juror).grade) except: errors.append("Stage %d missing opponent grade from %s" % (stage.order, juror.attendee)) try: grade_j['rev'] = int( JurorGrade.objects.get( stage_attendee=stage.rev_attendance, juror_session__juror=juror).grade) except: errors.append("Stage %d missing reviewer grade from %s" % (stage.order, juror.attendee)) grades_j.append(grade_j) stage_info.append({ 'teams': team, 'persons': person, 'presented': presented, 'rejections': stage.rejections.all().values_list('number', flat=True), 'jurors': grades_j }) return { 'fight': fight, 'chair': chair, 'jurors': jurors, 'stages': stage_info, 'errors': errors, 'warnings': warnings, 'all_stages': range(fight.stage_set.count()) }
def post(self, request, fight_id, stage): fight = get_object_or_404(Fight, pk=fight_id) all_stages = [] act_stage = {'is_last': False, 'order': int(stage)} for s in fight.stage_set.all(): st = {'active': False} if act_stage['is_last']: act_stage['is_last'] = False if s.order == int(stage): st['active'] = True act_stage['is_last'] = True act_stage['rep'] = s.rep_attendance.team.origin.name act_stage['opp'] = s.opp_attendance.team.origin.name act_stage['rev'] = s.rev_attendance.team.origin.name act_stage['prev'] = _fightpreview(s.fight)[s.order - 1] act_stage['form'] = StageForm(s, request.POST) act_stage['obj'] = s all_stages.append(st) if 'form' not in act_stage: return redirect('fight:fightjury', fight_id=fight_id) form = act_stage['form'] if form.is_valid(): if form.has_changed(): for fn in form.changed_data: if fn == 'rejections': act_stage['obj'].rejections.clear() for p in form.cleaned_data['rejections']: act_stage['obj'].rejections.add(p) elif fn == 'presented': act_stage['obj'].presented = form.cleaned_data[ 'presented'] act_stage['obj'].save() elif fn == 'rep': if form.cleaned_data['rep']: act_stage[ 'obj'].rep_attendance.active_person = form.cleaned_data[ 'rep'] else: act_stage[ 'obj'].rep_attendance.active_person = None act_stage['obj'].rep_attendance.save() elif fn == 'opp': if form.cleaned_data['opp']: act_stage[ 'obj'].opp_attendance.active_person = form.cleaned_data[ 'opp'] else: act_stage[ 'obj'].opp_attendance.active_person = None act_stage['obj'].opp_attendance.save() elif fn == 'rev': if form.cleaned_data['rev']: act_stage[ 'obj'].rev_attendance.active_person = form.cleaned_data[ 'rev'] else: act_stage[ 'obj'].rev_attendance.active_person = None act_stage['obj'].rev_attendance.save() elif fn.startswith('grade'): js = form.fields[fn].jurorsession att = form.fields[fn].attendance grade = None try: grade = att.jurorgrade_set.get(juror_session=js) except JurorGrade.DoesNotExist: pass if form.cleaned_data[fn]: if grade: grade.grade = form.cleaned_data[fn] grade.valid = False grade.save() else: JurorGrade.objects.create( juror_session=js, stage_attendee=att, grade=form.cleaned_data[fn], valid=False) else: if grade: grade.delete() else: pass pass if '_continue' in request.POST: return redirect('fight:fight', fight_id=fight_id, stage=int(stage) + 1) if '_finish' in request.POST: return redirect('fight:fightpre', fight_id=fight_id) return render(request, "fight/fight.html", context={ 'round': fight.round.order, 'room': fight.room.name, 'id': fight_id, 'all_stages': all_stages, 'stage': act_stage, 'locked': fight.locked })
from apps.result.utils import _fightpreview import random trn = Tournament.objects.get(slug=sys.argv[1]) print(trn) problems = Problem.objects.filter(tournament=trn) for round in trn.round_set(manager="selectives").all(): for fight in round.fight_set.all(): for stage in fight.stage_set.all(): print(stage) prev = _fightpreview(stage.fight, use_cache=False)[stage.order - 1] print(prev['free']) print(prev["opp"]) rejects = random.randint(0,2) prblms = random.sample(prev['free'], rejects+1) stage.presented = problems.get(number=prblms[0]) stage.save() stage.rejections.clear() for rej in prblms[1:]: stage.rejections.add(problems.get(number=rej)) pass for att in [stage.rep_attendance, stage.opp_attendance, stage.rev_attendance]: members = att.team.teammember_set.all() active = random.choice(members) att.active_person = active
def __init__(self,stage, *args, **kwargs): super(StageForm, self).__init__(*args, **kwargs) prev=_fightpreview(stage.fight)[stage.order-1] if prev['pk'] != stage.pk: raise IntegrityError("Stage number integrity Error") self.fields['rejections'] = forms.ModelMultipleChoiceField(queryset=Problem.objects.filter(tournament=stage.fight.round.tournament), required=False, widget=Select2MultipleWidget) # , number__in=prev['free'] self.fields['presented'] = forms.ModelChoiceField(queryset=Problem.objects.filter(tournament=stage.fight.round.tournament),widget=Select2Widget ,required=False ) #, number__in=prev['free'] if stage.presented: self.fields['presented'].initial = stage.presented_id self.fields['rejections'].initial = list(stage.rejections.all().values_list('pk',flat=True)) self.fields['rep']=forms.ModelChoiceField(queryset=stage.rep_attendance.team.teammember_set(manager="students").prefetch_related('attendee__active_user__user').all(),widget=Select2Widget,required=False) if stage.reporter: self.fields['rep'].initial = stage.rep_attendance.active_person self.fields['opp']=forms.ModelChoiceField(queryset=stage.opp_attendance.team.teammember_set(manager="students").prefetch_related('attendee__active_user__user').all(),widget=Select2Widget,required=False) if stage.opponent: self.fields['opp'].initial = stage.opp_attendance.active_person self.fields['rev']=forms.ModelChoiceField(queryset=stage.rev_attendance.team.teammember_set(manager="students").prefetch_related('attendee__active_user__user').all(),widget=Select2Widget,required=False) if stage.reviewer: self.fields['rev'].initial = stage.rev_attendance.active_person self.grades=[] index=30 for js in stage.fight.jurorsession_set(manager="voting").all(): j={'name':js.juror.attendee.full_name,'pk':js.pk} f=forms.IntegerField(min_value=1,max_value=10,required=False) self.fields['grade-%d-rep'%(js.pk, )]=f f.widget.attrs['tabindex']=index f.jurorsession=js f.attendance=stage.rep_attendance try: f.initial_obj = stage.rep_attendance.jurorgrade_set.get(juror_session=js) f.initial = int(f.initial_obj.grade) except: pass f = forms.IntegerField(min_value=1, max_value=10,required=False) self.fields['grade-%d-opp' % (js.pk,)] = f f.widget.attrs['tabindex'] = index+50 f.jurorsession = js f.attendance = stage.opp_attendance try: f.initial_obj = stage.opp_attendance.jurorgrade_set.get(juror_session=js) f.initial = int(f.initial_obj.grade) except: pass f = forms.IntegerField(min_value=1, max_value=10,required=False) self.fields['grade-%d-rev' % (js.pk,)] = f f.widget.attrs['tabindex'] = index+100 f.jurorsession = js f.attendance = stage.rev_attendance try: f.initial_obj = stage.rev_attendance.jurorgrade_set.get(juror_session=js) f.initial = int(f.initial_obj.grade) except: pass index+=1 self.grades.append(j)