Example #1
0
 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)
Example #2
0
 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 test_no_assigned_submissions(self):
     """Test assigned submissions aren't included for assignment."""
     alex_profile = User.objects.get(username='******').get_profile()
     submission = Submission.objects.get(title='Submission 2')
     JudgeAssignment.objects.create(submission=submission,
                                    judge=alex_profile)
     self.assertEqual(set(s.title for s in get_submissions(self.phase)),
                      set(['Submission %d' % n for n in [1, 3, 4, 5]]))
 def test_no_judged_submissions(self):
     """Test judged submissions aren't included for assignment."""
     alex_profile = User.objects.get(username='******').get_profile()
     submission = Submission.objects.get(title='Submission 3')
     Judgement.objects.create(judge=alex_profile, submission=submission,
                              notes='Blah')
     self.assertEqual(set(s.title for s in get_submissions(self.phase)),
                      set(['Submission %d' % n for n in [1, 2, 4, 5]]))
 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)
Example #7
0
 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_no_assigned_judged_submissions(self):
     """Test previously-assigned, judged submissions."""
     alex_profile = User.objects.get(username='******').get_profile()
     submission_a = Submission.objects.get(title='Submission 4')
     submission_b = Submission.objects.get(title='Submission 2')
     Judgement.objects.create(judge=alex_profile, submission=submission_a,
                              notes='Blah')
     JudgeAssignment.objects.create(submission=submission_b,
                                    judge=alex_profile)
     self.assertEqual(set(s.title for s in get_submissions(self.phase)),
                      set(['Submission %d' % n for n in [1, 3, 5]]))
    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_no_excluded_submissions(self):
     excluded = Submission.objects.get(title='Submission 3')
     ExclusionFlag.objects.create(submission=excluded)
     
     self.assertEqual(set(s.title for s in get_submissions(self.phase)),
                      set(['Submission %d' % n for n in [1, 2, 4, 5]]))
 def test_submissions(self):
     self.assertEqual(len(get_submissions(self.phase)), 5)