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)
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)
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()