From 3b678ab4a85a4a5959b5d984c586281e4b35a7da Mon Sep 17 00:00:00 2001 From: Sheppy Date: Fri, 18 Dec 2020 12:24:52 +0100 Subject: [PATCH] fix search with multiple results --- database.py | 24 +++++++++++--------- server.py | 55 ++++++++++++++++++++++++--------------------- templates/base.html | 2 +- 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/database.py b/database.py index df86105..11c3430 100644 --- a/database.py +++ b/database.py @@ -96,17 +96,21 @@ class DatabaseConnection: playerNamePrepared = "%{}%".format(playerName.replace("%", "%%")) cursor.execute("SELECT * FROM players WHERE name == ?", (playerName,)) row = cursor.fetchone() + + # if there is exactly one hit for the exact name just return that # + if row and not cursor.fetchone(): + p = player.PlayerInLeaderboard(row) + p.rank = self.getPlayerRank(p) + return [p] + + playerRows = [] + cursor.execute("SELECT * FROM players WHERE name LIKE ?", (playerNamePrepared,)) + for pr in cursor: + p = player.PlayerInLeaderboard(pr) + p.rank = self.getPlayerRank(p) + playerRows += [p] - playerRow = None - if not playerRow: - cursor.execute("SELECT * FROM players WHERE name LIKE ?", (playerNamePrepared,)) - playerRow = cursor.fetchone() - if not playerRow: - return None - - playerInLeaderboard = player.PlayerInLeaderboard(playerRow) - playerInLeaderboard.rank = self.getPlayerRank(playerInLeaderboard) - return playerInLeaderboard + return playerRows def getPlayerRank(self, player): '''Calculate player rank - a player rank may change rapidly and diff --git a/server.py b/server.py index 438ac84..a4197d9 100755 --- a/server.py +++ b/server.py @@ -180,37 +180,42 @@ def leaderboard(): cannotFindPlayer = "" searchName = "" + playerList = None + doNotComputeRank = True if playerName: - playerInLeaderboard = db.findPlayerByName(playerName) - if not playerInLeaderboard: + playersInLeaderboard = db.findPlayerByName(playerName) + if not playersInLeaderboard: cannotFindPlayer = flask.Markup("
No player of that name
") start = 0 else: - rank = playerInLeaderboard.rank - if(playerInLeaderboard.games < 10): - return flask.redirect("/player?id={}".format(playerInLeaderboard.playerId)) - searchName = playerInLeaderboard.name - start = rank - (rank % SEGMENT) + if len(playersInLeaderboard) == 1: + rank = playersInLeaderboard[0].rank + if(playersInLeaderboard[0].games < 10): + return flask.redirect("/player?id={}".format(playersInLeaderboard[0].playerId)) + searchName = playersInLeaderboard[0].name + start = rank - (rank % SEGMENT) + else: + playerList = playersInLeaderboard + for p in playerList: + if p.rank == -1: + p.rankStr = "N/A" + else: + p.rankStr = str(p.rank) + doNotComputeRank = False - end = start + SEGMENT - - - # compute range # - maxEntry = db.getTotalPlayers() reachedEnd = False - if end > maxEntry: - start = maxEntry - ( maxEntry % SEGMENT ) - 1 - end = maxEntry - 1 - reachedEnd = True + maxEntry = 0 + if not playerList: + # compute range # + end = start + SEGMENT + maxEntry = db.getTotalPlayers() + reachedEnd = False + if end > maxEntry: + start = maxEntry - ( maxEntry % SEGMENT ) - 1 + end = maxEntry - 1 + reachedEnd = True - playerList = db.getRankRange(start, end) - - columContent = flask.Markup(flask.render_template("playerLine.html", \ - playerRank="Rank", \ - playerName="Player", \ - playerRating="Rating", \ - playerGames="Games", \ - playerWinratio="Winratio")) + playerList = db.getRankRange(start, end) endOfBoardIndicator = "" if reachedEnd: @@ -222,7 +227,7 @@ def leaderboard(): start = max(start, 0) finalResponse = flask.render_template("base.html", playerList=playerList, \ - columNames=columContent, \ + doNotComputeRank=doNotComputeRank, \ start=start, \ endOfBoardIndicator=endOfBoardIndicator, \ findPlayer=cannotFindPlayer, \ diff --git a/templates/base.html b/templates/base.html index bbddef4..baa4ee7 100644 --- a/templates/base.html +++ b/templates/base.html @@ -25,7 +25,7 @@ {% for p in playerList %} {% set count = loop.index + start %} - {{ count }} + {% if doNotComputeRank %} {{ count }} {% else %} {{ p.rankStr }} {% endif %} {{ p.name }} {{ p.games }} {{ p.rating }}