def _update_ratings(): calc = RatingCalculator() START_RATING = cur_config().rating_start players = {} match_ids = list(set(PlayerResult.objects.filter(rating=None).values_list('match_id', flat=True))) for match in Match.objects.filter(id__in=match_ids).order_by('date', 'id'): player_positions = match.get_positions() rating_results = [] for p in player_positions: # Fetch the current rating value #if not players.get(p['id'], False): rated_results = PlayerResult.objects.filter(player=p['id']).exclude(rating=None).order_by('-match__date', '-match__id') if not rated_results.exists(): rating = START_RATING else: rating = rated_results[0].rating #else: # rating = players[p['id']] rating_results.append(RatingResult(p['id'], rating, p['position'])) # Calculate new ratings new_player_ratings = calc.new_ratings(rating_results) # Update for p in new_player_ratings: players[p.dbid] = p.rating PlayerResult.objects.filter(player=p.dbid).filter(match=match).update(rating=p.rating)
def _update_ratings(): calc = RatingCalculator() START_RATING = cur_config().rating_start players = {} match_ids = list( set( PlayerResult.objects.filter(rating=None).values_list('match_id', flat=True))) for match in Match.objects.filter(id__in=match_ids).order_by('date', 'id'): player_positions = match.get_positions() rating_results = [] for p in player_positions: # Fetch the current rating value rated_results = PlayerResult.objects.filter( player=p['id']).exclude(rating=None).order_by( '-match__date', '-match__id') if not rated_results.exists(): rating = START_RATING else: rating = rated_results[0].rating rating_results.append(RatingResult(p['id'], rating, p['position'])) # Calculate new ratings new_player_ratings = calc.new_ratings(rating_results) # Update for p in new_player_ratings: players[p.dbid] = p.rating PlayerResult.objects.filter(player=p.dbid).filter( match=match).update(rating=p.rating)
class TestRatingCalculator(unittest.TestCase): # NOTE: Tests will fail, currently only used to check differences. Assertequals not updated. def setUp(self): self.calc = RatingCalculator() def testWin5players(self): results = [ RatingResult("Andriod", Decimal('100.0'), 1), RatingResult("Tine", Decimal('100.0'), 2), RatingResult("Ole", Decimal('100.0'), 3), RatingResult("Johnny", Decimal('100.0'), 4), RatingResult("Stian", Decimal('100.0'), 5) ] new_player_ratings = self.calc.new_ratings(results) for p_rating in new_player_ratings: if p_rating.dbid == "Andriod": self.assertEqual(p_rating.rating, 104.5) elif p_rating.dbid == "Tine": self.assertEqual(p_rating.rating, 101.5) elif p_rating.dbid == "Ole": self.assertEqual(p_rating.rating, 98.5) elif p_rating.dbid == "Johnny": self.assertEqual(p_rating.rating, 95.5) elif p_rating.dbid == "Stian": self.assertEqual(p_rating.rating, 95.5) def testWin4players(self): results = [ RatingResult("Andriod", Decimal('100.0'), 1), RatingResult("Tine", Decimal('100.0'), 2), RatingResult("Ole", Decimal('100.0'), 3), RatingResult("Johnny", Decimal('100.0'), 4) ] new_player_ratings = self.calc.new_ratings(results) for p_rating in new_player_ratings: if p_rating.dbid == "Andriod": self.assertEqual(p_rating.rating, 104.5) elif p_rating.dbid == "Tine": self.assertEqual(p_rating.rating, 101.5) elif p_rating.dbid == "Ole": self.assertEqual(p_rating.rating, 98.5) elif p_rating.dbid == "Johnny": self.assertEqual(p_rating.rating, 95.5) def testWin3players(self): results = [ RatingResult("Andriod", Decimal('100.0'), 1), RatingResult("Tine", Decimal('100.0'), 2), RatingResult("Ole", Decimal('100.0'), 3) ] new_player_ratings = self.calc.new_ratings(results) for p_rating in new_player_ratings: if p_rating.dbid == "Andriod": self.assertEqual(p_rating.rating, 104.5) elif p_rating.dbid == "Tine": self.assertEqual(p_rating.rating, 101.5) elif p_rating.dbid == "Ole": self.assertEqual(p_rating.rating, 98.5) def testWin3players2(self): results = [ RatingResult("Andriod", Decimal('200.0'), 1), RatingResult("Tine", Decimal('100.0'), 2), RatingResult("Ole", Decimal('100.0'), 3) ] new_player_ratings = self.calc.new_ratings(results) for p_rating in new_player_ratings: if p_rating.dbid == "Andriod": self.assertEqual(p_rating.rating, 104.5) elif p_rating.dbid == "Tine": self.assertEqual(p_rating.rating, 101.5) elif p_rating.dbid == "Ole": self.assertEqual(p_rating.rating, 98.5) def testDraw(self): results = [ RatingResult("Andriod", Decimal('100.0'), 4), RatingResult("Tine", Decimal('100.0'), 2), RatingResult("Ole", Decimal('100.0'), 2), RatingResult("Johnny", Decimal('100.0'), 1) ] new_player_ratings = self.calc.new_ratings(results) for p_rating in new_player_ratings: if p_rating.dbid == "Andriod": self.assertEqual(p_rating.rating, 95.5) elif p_rating.dbid == "Tine": self.assertEqual(p_rating.rating, 100.0) elif p_rating.dbid == "Ole": self.assertEqual(p_rating.rating, 100.0) elif p_rating.dbid == "Johnny": self.assertEqual(p_rating.rating, 104.5) def testDraw2(self): results = [ RatingResult("Andriod", Decimal('100.0'), 1), RatingResult("Tine", Decimal('100.0'), 1), RatingResult("Ole", Decimal('100.0'), 3), RatingResult("Johnny", Decimal('100.0'), 4) ] new_player_ratings = self.calc.new_ratings(results) for p_rating in new_player_ratings: if p_rating.dbid == "Andriod": self.assertEqual(p_rating.rating, 103.0) elif p_rating.dbid == "Tine": self.assertEqual(p_rating.rating, 103.0) elif p_rating.dbid == "Ole": self.assertEqual(p_rating.rating, 98.5) elif p_rating.dbid == "Johnny": self.assertEqual(p_rating.rating, 95.5)
class TestRatingCalculator(unittest.TestCase): # NOTE: Tests will fail, currently only used to check differences. Assertequals not updated. def setUp(self): self.calc = RatingCalculator() def testWin5players(self): results = [ RatingResult("Andriod", Decimal("100.0"), 1), RatingResult("Tine", Decimal("100.0"), 2), RatingResult("Ole", Decimal("100.0"), 3), RatingResult("Johnny", Decimal("100.0"), 4), RatingResult("Stian", Decimal("100.0"), 5), ] new_player_ratings = self.calc.new_ratings(results) for p_rating in new_player_ratings: if p_rating.dbid == "Andriod": self.assertEqual(p_rating.rating, 104.5) elif p_rating.dbid == "Tine": self.assertEqual(p_rating.rating, 101.5) elif p_rating.dbid == "Ole": self.assertEqual(p_rating.rating, 98.5) elif p_rating.dbid == "Johnny": self.assertEqual(p_rating.rating, 95.5) elif p_rating.dbid == "Stian": self.assertEqual(p_rating.rating, 95.5) def testWin4players(self): results = [ RatingResult("Andriod", Decimal("100.0"), 1), RatingResult("Tine", Decimal("100.0"), 2), RatingResult("Ole", Decimal("100.0"), 3), RatingResult("Johnny", Decimal("100.0"), 4), ] new_player_ratings = self.calc.new_ratings(results) for p_rating in new_player_ratings: if p_rating.dbid == "Andriod": self.assertEqual(p_rating.rating, 104.5) elif p_rating.dbid == "Tine": self.assertEqual(p_rating.rating, 101.5) elif p_rating.dbid == "Ole": self.assertEqual(p_rating.rating, 98.5) elif p_rating.dbid == "Johnny": self.assertEqual(p_rating.rating, 95.5) def testWin3players(self): results = [ RatingResult("Andriod", Decimal("100.0"), 1), RatingResult("Tine", Decimal("100.0"), 2), RatingResult("Ole", Decimal("100.0"), 3), ] new_player_ratings = self.calc.new_ratings(results) for p_rating in new_player_ratings: if p_rating.dbid == "Andriod": self.assertEqual(p_rating.rating, 104.5) elif p_rating.dbid == "Tine": self.assertEqual(p_rating.rating, 101.5) elif p_rating.dbid == "Ole": self.assertEqual(p_rating.rating, 98.5) def testWin3players2(self): results = [ RatingResult("Andriod", Decimal("200.0"), 1), RatingResult("Tine", Decimal("100.0"), 2), RatingResult("Ole", Decimal("100.0"), 3), ] new_player_ratings = self.calc.new_ratings(results) for p_rating in new_player_ratings: if p_rating.dbid == "Andriod": self.assertEqual(p_rating.rating, 104.5) elif p_rating.dbid == "Tine": self.assertEqual(p_rating.rating, 101.5) elif p_rating.dbid == "Ole": self.assertEqual(p_rating.rating, 98.5) def testDraw(self): results = [ RatingResult("Andriod", Decimal("100.0"), 4), RatingResult("Tine", Decimal("100.0"), 2), RatingResult("Ole", Decimal("100.0"), 2), RatingResult("Johnny", Decimal("100.0"), 1), ] new_player_ratings = self.calc.new_ratings(results) for p_rating in new_player_ratings: if p_rating.dbid == "Andriod": self.assertEqual(p_rating.rating, 95.5) elif p_rating.dbid == "Tine": self.assertEqual(p_rating.rating, 100.0) elif p_rating.dbid == "Ole": self.assertEqual(p_rating.rating, 100.0) elif p_rating.dbid == "Johnny": self.assertEqual(p_rating.rating, 104.5) def testDraw2(self): results = [ RatingResult("Andriod", Decimal("100.0"), 1), RatingResult("Tine", Decimal("100.0"), 1), RatingResult("Ole", Decimal("100.0"), 3), RatingResult("Johnny", Decimal("100.0"), 4), ] new_player_ratings = self.calc.new_ratings(results) for p_rating in new_player_ratings: if p_rating.dbid == "Andriod": self.assertEqual(p_rating.rating, 103.0) elif p_rating.dbid == "Tine": self.assertEqual(p_rating.rating, 103.0) elif p_rating.dbid == "Ole": self.assertEqual(p_rating.rating, 98.5) elif p_rating.dbid == "Johnny": self.assertEqual(p_rating.rating, 95.5)