def assign_judges(self, request): """Assign judges for the selected finished ``Phase`` or ``PhaseRound``""" now = datetime.utcnow() judge_profiles = get_judge_profiles() if request.method == 'POST': form = JudgingAssignmentAdminForm(request.POST, judge_profiles=judge_profiles) if form.is_valid(): cleaned_data = form.cleaned_data submissions = get_submissions(cleaned_data['phase'], cleaned_data['phase_round']) judges_submission = cleaned_data['judges_per_submission'] assignments = get_assignments( submissions, judge_profiles, commit=True, judges_per_submission=judges_submission) self.message_user( request, "Successfully assigned %s submissions " "to %s judges with %s judges per submission" % (len(submissions), len(judge_profiles), judges_submission)) return HttpResponseRedirect( reverse('admin:challenges_phase_changelist')) else: form = JudgingAssignmentAdminForm(judge_profiles=judge_profiles) context = { 'now': now, 'judge_profiles': judge_profiles, 'form': form, } return render(request, 'admin/phases/assign_judges.html', context)
def assign_judges(self, request): """Assign judges for the selected finished ``Phase`` or ``PhaseRound``""" now = datetime.utcnow() judge_profiles = get_judge_profiles() if request.method == 'POST': form = JudgingAssignmentAdminForm(request.POST, judge_profiles=judge_profiles) if form.is_valid(): cleaned_data = form.cleaned_data submissions = get_submissions(cleaned_data['phase'], cleaned_data['phase_round']) judges_submission = cleaned_data['judges_per_submission'] assignments = get_assignments(submissions, judge_profiles, commit=True, judges_per_submission=judges_submission) self.message_user(request, "Successfully assigned %s submissions " "to %s judges with %s judges per submission" % (len(submissions), len(judge_profiles), judges_submission)) return HttpResponseRedirect(reverse('admin:challenges_phase_changelist')) else: form = JudgingAssignmentAdminForm(judge_profiles=judge_profiles) context = { 'now': now, 'judge_profiles': judge_profiles, 'form': form, } return render(request, 'admin/phases/assign_judges.html', context)
def test_assignments(self): assignments = get_assignments(submissions=get_submissions(self.phase), judge_profiles=get_judge_profiles(), commit=False, judges_per_submission=2) self.assertEvenAssignment(assignments) # Check nothing has been saved self.assertEqual(JudgeAssignment.objects.count(), 0)
def distribute(self, request, award_id): """Distribute the money evenly between all the Judges""" try: award = Award.objects.get(id=award_id) except Award.DoesNotExist: raise Http404 change_url = reverse('admin:awards_award_change', args=[award.id]) if award.judgeallowance_set.all(): self.message_user(request, 'This amount has already been distributed') return HttpResponseRedirect(change_url) judge_list = get_judge_profiles() if not judge_list: self.message_user(request, 'There are no Judges to assing the Award') return HttpResponseRedirect(change_url) amount = award.amount / len(judge_list) for judge in judge_list: JudgeAllowance.objects.create(amount=amount, judge=judge, award=award) self.message_user( request, 'Amount distributed between %s Judges' '' % len(judge_list)) return HttpResponseRedirect(change_url)
def test_assignment_commit(self): assignments = get_assignments(submissions=get_submissions(self.phase), judge_profiles=get_judge_profiles(), commit=True, judges_per_submission=2) self.assertEvenAssignment(assignments) expected_submissions = (settings.JUDGES_PER_SUBMISSION * Submission.objects.count()) self.assertEqual(JudgeAssignment.objects.count(), expected_submissions)
def handle_noargs(self, verbosity, dry_run, **options): verbosity = int(verbosity) # Django doesn't do this by default verbose, quiet = verbosity >= 2, verbosity < 1 option_list = [] now = datetime.utcnow() print("IMPORTANT: Only past Phases and Rounds can be assigned for " ". Judging available Phases are:\n") for phase in Phase.objects.all(): round_list = phase.phaseround_set.all() if round_list: # We can't assign challenges that are not finished option_list += [i for i in round_list if i.end_date < now] else: if phase.end_date < now: option_list.append(phase) for i, option in enumerate(option_list): if isinstance(option, PhaseRound): print "%s) %s: %s" % (i, option.phase, option.name) else: print "%s) %s" % (i, option) selection = raw_input('\nSelect Phase or Round to assign: ') try: selected = option_list[int(selection)] except (ValueError, IndexError): raise CommandError('Select a valid option') if isinstance(selected, PhaseRound): phase, phase_round = selected.phase, selected else: phase, phase_round = selected, None submissions = get_submissions(phase, phase_round) if not quiet: print count_of(submissions, 'submission', colon=verbosity >= 2 and len(submissions)), "to be assigned" if verbose: for submission in submissions: print ' %s' % submission.title judge_profiles = get_judge_profiles() if not quiet: print count_of(judge_profiles, 'judge', colon=verbosity >= 2 and len(judge_profiles)), "available" if verbose: for judge in judge_profiles: print ' %s [%s]' % (judge.display_name, judge.user.username) if submissions and len(judge_profiles) < settings.JUDGES_PER_SUBMISSION: print "You don't have enough judges assigned: you need %d" % \ settings.JUDGES_PER_SUBMISSION sys.exit(1) assignments = get_assignments(submissions, judge_profiles, commit=not dry_run, judges_per_submission=settings.JUDGES_PER_SUBMISSION) if verbose: for assignment in assignments: print '"%s" goes to %s' % (assignment.submission.title, assignment.judge.display_name)
def test_judge_group(self): """Test that judges with permission through a group are included.""" judges = Group.objects.create(name='Judges') judges.permissions.add(self.judging_permission) for user in User.objects.filter(username__in=['alex', 'charlie']): user.user_permissions.clear() if user.username == 'charlie': user.groups.add(judges) self.assertEqual(set([j.user.username for j in get_judge_profiles()]), set(['charlie']))
def distribute(self, request, award_id): """Distribute the money evenly between all the Judges""" try: award = Award.objects.get(id=award_id) except Award.DoesNotExist: raise Http404 change_url = reverse('admin:awards_award_change', args=[award.id]) if award.judgeallowance_set.all(): self.message_user(request, 'This amount has already been distributed') return HttpResponseRedirect(change_url) judge_list = get_judge_profiles() if not judge_list: self.message_user(request, 'There are no Judges to assing the Award') return HttpResponseRedirect(change_url) amount = award.amount / len(judge_list) for judge in judge_list: JudgeAllowance.objects.create(amount=amount, judge=judge, award=award) self.message_user(request, 'Amount distributed between %s Judges' '' % len(judge_list)) return HttpResponseRedirect(change_url)
def handle_noargs(self, verbosity, dry_run, **options): verbosity = int(verbosity) # Django doesn't do this by default verbose, quiet = verbosity >= 2, verbosity < 1 option_list = [] now = datetime.utcnow() print( "IMPORTANT: Only past Phases and Rounds can be assigned for " ". Judging available Phases are:\n") for phase in Phase.objects.all(): round_list = phase.phaseround_set.all() if round_list: # We can't assign challenges that are not finished option_list += [i for i in round_list if i.end_date < now] else: if phase.end_date < now: option_list.append(phase) for i, option in enumerate(option_list): if isinstance(option, PhaseRound): print "%s) %s: %s" % (i, option.phase, option.name) else: print "%s) %s" % (i, option) selection = raw_input('\nSelect Phase or Round to assign: ') try: selected = option_list[int(selection)] except (ValueError, IndexError): raise CommandError('Select a valid option') if isinstance(selected, PhaseRound): phase, phase_round = selected.phase, selected else: phase, phase_round = selected, None submissions = get_submissions(phase, phase_round) if not quiet: print count_of(submissions, 'submission', colon=verbosity >= 2 and len(submissions)), "to be assigned" if verbose: for submission in submissions: print ' %s' % submission.title judge_profiles = get_judge_profiles() if not quiet: print count_of(judge_profiles, 'judge', colon=verbosity >= 2 and len(judge_profiles)), "available" if verbose: for judge in judge_profiles: print ' %s [%s]' % (judge.display_name, judge.user.username) if submissions and len( judge_profiles) < settings.JUDGES_PER_SUBMISSION: print "You don't have enough judges assigned: you need %d" % \ settings.JUDGES_PER_SUBMISSION sys.exit(1) assignments = get_assignments( submissions, judge_profiles, commit=not dry_run, judges_per_submission=settings.JUDGES_PER_SUBMISSION) if verbose: for assignment in assignments: print '"%s" goes to %s' % (assignment.submission.title, assignment.judge.display_name)
def test_get_judges_superuser(self): """Test superusers aren't automatically returned as judges.""" User.objects.filter(username='******').update(is_superuser=True) self.assertEqual(set([j.user.username for j in get_judge_profiles()]), set(['alex', 'charlie']))
def test_get_judges(self): self.assertEqual(set([j.user.username for j in get_judge_profiles()]), set(['alex', 'charlie']))