def post(self): template_params = handle_user() if not 'admin' in template_params: self.redirect('/') return tournament_url = self.request.get("url") # Check for input if tournament_url == "": self.redirect("/addTournaments") return dup_check = TournamentModel.query( TournamentModel.url == convert_url(tournament_url)) if dup_check.get() is not None: render_template(self, 'error_dup_league.html', template_params) return api.set_credentials(CHALLONGE_USERNAME, CHALLONGE_API) #Handle tournament not found error tournament = tournaments.show(tournament_url) tournament_object = TournamentModel() tournament_object.name = tournament['name'] tournament_object.url = convert_url(tournament_url) timestamp = parser.parse(tournament['created-at'][:-6]) tournament_object.timestamp = timestamp tournament_object.put() # Extract the matches # Move participant seach to preindex'd list rather than 3 challonge requests match_list = matches.index(tournament['id']) participant_list = participants.index(tournament['id']) self.response.out.write(participant_list) for match in match_list: match_object = MatchModel(parent=tournament_object.key) # Find names via challonge #match_object.player1 = participants.show(tournament['id'], match['player1-id'])['name'] #match_object.player2 = participants.show(tournament['id'], match['player2-id'])['name'] # Find names via list for p in participant_list: if p['id'] == match['player1-id']: match_object.player1 = p['name'] if p['id'] == match['player2-id']: match_object.player2 = p['name'] if match['scores-csv'] != "": parts = match['scores-csv'].split('-') match_object.player1Score = int(parts[0]) match_object.player2Score = int(parts[1]) winner = participants.show(tournament['id'], match['winner-id']) match_object.winner = winner['name'] match_object.label = match['identifier'] timestamp = parser.parse(match['started-at'][:-6]) match_object.timestamp = timestamp match_object.put() self.redirect("/listTournaments")
def post(self): a = MatchModel() a.player1 = self.request.POST['player1'] a.player2 = self.request.POST['player2'] a.scores = utils.calculate_score_from_post(self.request) #TODO: Break rest of the score calculation into utils.py players = ndb.get_multi([ndb.Key(PlayerModel, a.player1), ndb.Key(PlayerModel, a.player2)]) p1_total = [a.scores[0].player1, a.scores[1].player1, a.scores[2].player1] p2_total = [a.scores[0].player2, a.scores[1].player2, a.scores[2].player2] logging.info("Match between %s %s and %s %s" % (players[0].first_name, players[0].last_name, players[1].first_name, players[1].last_name)) p1_wins = 0 p2_wins = 0 for i in range(0, len(p1_total)): logging.info("Game %d: %d - %d" % (i + 1, p1_total[i], p2_total[i])) if p1_total[i] > p2_total[i]: p1_wins += 1 logging.info("%s wins Game %d" % (players[0].first_name, i + 1)) elif p2_total[i] > p1_total[i]: p2_wins += 1 logging.info("%s wins Game %d" % (players[1].first_name, i + 1)) logging.info("%s won %d games; %s won %d games" % (players[0].first_name, p1_wins, players[1].first_name, p2_wins)) if p1_wins > p2_wins: winner = players[0] loser = players[1] elif p2_wins > p1_wins: winner = players[1] loser = players[0] else: logging.info("No score submitted, loading ladder") self.get() return logging.info("Winner: %s" % winner) logging.info("Loser: %s" % loser) logging.info("%s %s's old rank was %d" % (winner.first_name, winner.last_name, winner.skillScore)) logging.info("%s %s's old rank was %d" % (loser.first_name, loser.last_name, loser.skillScore)) winnerRank, loserRank = utils.calculate_elo_rank(winner.skillScore, loser.skillScore) # Try returning the point change for some interesting data point_change = int(winnerRank - winner.skillScore) logging.info("%s %s's rank is now %d, a change of %d points" % (winner.first_name, winner.last_name, winnerRank, winnerRank - winner.skillScore)) logging.info("%s %s's rank is now %d, a change of %d points" % (loser.first_name, loser.last_name, loserRank, loser.skillScore - loserRank)) winner.skillScore = int(winnerRank) loser.skillScore = int(loserRank) basePoints = int((loser.skillScore - winner.skillScore) * 0.3) # #print basePoints if basePoints < -100 : basePoints = 5 elif basePoints < -20: basePoints = 10 #todo: This is wrong, but better. elif basePoints < 20: basePoints = 20 a.baseValue = basePoints a.put() # Not needed with ELO calculations from utils.py # bonusPoints = int((basePoints*point_dff)/10) # winner.skillScore = winner.skillScore + basePoints + bonusPoints # loser.skillScore = loser.skillScore - basePoints - bonusPoints winner.gamesWon += 1 winner.gamesPlayed += 1 loser.gamesPlayed += 1 winner.put() loser.put() user = users.get_current_user() user_email = str(user.email()) if user_email != str(a.player1): opponent_email = str(a.player1) else: opponent_email = str(a.player2) #TODO: Break email dispatch into utils.py message = mail.EmailMessage() message.sender = user_email message.to = opponent_email message.subject = "Match Entry - Vendasta Foosball Ladder" if winner == players[0]: message.html = """ <p>A match was entered between %s (winner) and %s (loser).</p> <p>The game scores were %d-%d, %d-%d, %d-%d</p> <p>Check out the ladder by going <a href='http://vendladder.appspot.com'>here</a>.</p> """ % (winner.first_name + " " + winner.last_name, loser.first_name + " " + loser.last_name, a.scores[0].player1, a.scores[0].player2, a.scores[1].player1, a.scores[1].player2, a.scores[2].player1, a.scores[2].player2) else: message.html = """ <p>A match was entered between %s (winner) and %s (loser).</p> <p>The game scores were %d-%d, %d-%d, %d-%d</p> <p>Check out the ladder by going <a href='http://vendladder.appspot.com'>here</a>.</p> """ % (winner.first_name + " " + winner.last_name, loser.first_name + " " + loser.last_name, a.scores[0].player2, a.scores[0].player1, a.scores[1].player2, a.scores[1].player1, a.scores[2].player2, a.scores[2].player1) logging.info("Emailing %s from %s" % (user_email, opponent_email)) message.send() self.get(success=True, point_change=point_change)