예제 #1
0
파일: tests.py 프로젝트: cytadela8/oioioi
    def test_menu(self):
        contest = Contest.objects.get()
        pg = _create_PG(contest=contest, name='PG', key='single')
        prize = _create_PR(contest=contest,
                           prize_giving=pg,
                           name='Prize',
                           quantity=2,
                           order=10)

        dashboard_url = reverse('contest_dashboard',
                                kwargs={'contest_id': contest.id})
        prizes_url = reverse('default_prizes',
                             kwargs={'contest_id': contest.id})

        response = self.client.get(dashboard_url)
        self.assertNotIn(prizes_url.encode('utf-8'), response.content)
        response = self.client.get(prizes_url)
        self.assertEqual(403, response.status_code)

        test_user = User.objects.get(username='******')
        PrizeForUser(user=test_user, prize=prize).save()
        pg.state = 'SUCCESS'
        pg.save()

        response = self.client.get(dashboard_url)
        self.assertIn(prizes_url.encode('utf-8'), response.content)
        response = self.client.get(prizes_url)
        self.assertEqual(200, response.status_code)
예제 #2
0
def assign_from_order(prize_giving, order):
    """Take an iterable of (place, user) pairs as order (places may repeat) and
       assign prizes to users.

       In case a fair assignment can't be found (happens only with draws)
       FairAssignmentNotFound is raised.
    """
    order = sorted(list(order), key=itemgetter(0))
    places, users = list(zip(*order)) if order else ([], [])

    # Construct a list of avaiable prizes
    # Note that Prize instances are intended to repeat
    prizes = []
    for p in prize_giving.prize_set.all():
        prizes += [p] * min(p.quantity, len(users) - len(prizes))

    padding = len(users) - len(prizes)
    prizes += [None] * padding

    match = list(zip(places, users, prizes))

    for nr, (current, next_) in enumerate(zip(match, match[1:])):
        if current[2] is None:
            break
        if current[0] == next_[0] and \
                (next_[2] is None or current[2].order < next_[2].order):
            raise FairAssignmentNotFound(prize_giving, match, nr)

    result = [
        PrizeForUser(user=x[1], prize=x[2])
        for x in match[:len(prizes) - padding]
    ]
    PrizeForUser.objects.bulk_create(result)
예제 #3
0
파일: tests.py 프로젝트: cytadela8/oioioi
def _single_prize_for_user(pg):
    test_user = User.objects.get(username='******')
    test_prize = pg.prize_set.all()[0]
    PrizeForUser(user=test_user, prize=test_prize).save()