mirror of
https://github.com/FAUSheppy/open-web-leaderboard.git
synced 2025-12-06 07:01:36 +01:00
fix search with multiple results
This commit is contained in:
24
database.py
24
database.py
@@ -96,17 +96,21 @@ class DatabaseConnection:
|
|||||||
playerNamePrepared = "%{}%".format(playerName.replace("%", "%%"))
|
playerNamePrepared = "%{}%".format(playerName.replace("%", "%%"))
|
||||||
cursor.execute("SELECT * FROM players WHERE name == ?", (playerName,))
|
cursor.execute("SELECT * FROM players WHERE name == ?", (playerName,))
|
||||||
row = cursor.fetchone()
|
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
|
return playerRows
|
||||||
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
|
|
||||||
|
|
||||||
def getPlayerRank(self, player):
|
def getPlayerRank(self, player):
|
||||||
'''Calculate player rank - a player rank may change rapidly and
|
'''Calculate player rank - a player rank may change rapidly and
|
||||||
|
|||||||
55
server.py
55
server.py
@@ -180,37 +180,42 @@ def leaderboard():
|
|||||||
cannotFindPlayer = ""
|
cannotFindPlayer = ""
|
||||||
searchName = ""
|
searchName = ""
|
||||||
|
|
||||||
|
playerList = None
|
||||||
|
doNotComputeRank = True
|
||||||
if playerName:
|
if playerName:
|
||||||
playerInLeaderboard = db.findPlayerByName(playerName)
|
playersInLeaderboard = db.findPlayerByName(playerName)
|
||||||
if not playerInLeaderboard:
|
if not playersInLeaderboard:
|
||||||
cannotFindPlayer = flask.Markup("<div class=noPlayerFound>No player of that name</div>")
|
cannotFindPlayer = flask.Markup("<div class=noPlayerFound>No player of that name</div>")
|
||||||
start = 0
|
start = 0
|
||||||
else:
|
else:
|
||||||
rank = playerInLeaderboard.rank
|
if len(playersInLeaderboard) == 1:
|
||||||
if(playerInLeaderboard.games < 10):
|
rank = playersInLeaderboard[0].rank
|
||||||
return flask.redirect("/player?id={}".format(playerInLeaderboard.playerId))
|
if(playersInLeaderboard[0].games < 10):
|
||||||
searchName = playerInLeaderboard.name
|
return flask.redirect("/player?id={}".format(playersInLeaderboard[0].playerId))
|
||||||
start = rank - (rank % SEGMENT)
|
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
|
reachedEnd = False
|
||||||
if end > maxEntry:
|
maxEntry = 0
|
||||||
start = maxEntry - ( maxEntry % SEGMENT ) - 1
|
if not playerList:
|
||||||
end = maxEntry - 1
|
# compute range #
|
||||||
reachedEnd = True
|
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)
|
playerList = db.getRankRange(start, end)
|
||||||
|
|
||||||
columContent = flask.Markup(flask.render_template("playerLine.html", \
|
|
||||||
playerRank="Rank", \
|
|
||||||
playerName="Player", \
|
|
||||||
playerRating="Rating", \
|
|
||||||
playerGames="Games", \
|
|
||||||
playerWinratio="Winratio"))
|
|
||||||
|
|
||||||
endOfBoardIndicator = ""
|
endOfBoardIndicator = ""
|
||||||
if reachedEnd:
|
if reachedEnd:
|
||||||
@@ -222,7 +227,7 @@ def leaderboard():
|
|||||||
start = max(start, 0)
|
start = max(start, 0)
|
||||||
|
|
||||||
finalResponse = flask.render_template("base.html", playerList=playerList, \
|
finalResponse = flask.render_template("base.html", playerList=playerList, \
|
||||||
columNames=columContent, \
|
doNotComputeRank=doNotComputeRank, \
|
||||||
start=start, \
|
start=start, \
|
||||||
endOfBoardIndicator=endOfBoardIndicator, \
|
endOfBoardIndicator=endOfBoardIndicator, \
|
||||||
findPlayer=cannotFindPlayer, \
|
findPlayer=cannotFindPlayer, \
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
{% for p in playerList %}
|
{% for p in playerList %}
|
||||||
{% set count = loop.index + start %}
|
{% set count = loop.index + start %}
|
||||||
<tr {% if searchName and searchName == p.name %} id="targetPlayer" {% endif %}>
|
<tr {% if searchName and searchName == p.name %} id="targetPlayer" {% endif %}>
|
||||||
<td>{{ count }}</td>
|
<td>{% if doNotComputeRank %} {{ count }} {% else %} {{ p.rankStr }} {% endif %}</td>
|
||||||
<td><a href="/player?id={{ p.playerId }}">{{ p.name }}</a></td>
|
<td><a href="/player?id={{ p.playerId }}">{{ p.name }}</a></td>
|
||||||
<td>{{ p.games }}</td>
|
<td>{{ p.games }}</td>
|
||||||
<td>{{ p.rating }}</td>
|
<td>{{ p.rating }}</td>
|
||||||
|
|||||||
Reference in New Issue
Block a user