X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=xonstat%2Fviews%2Fhelpers.py;h=d8b3211e1c231b7c806d799c69bdfc34e8c9e548;hb=0d5147701fea4653c2bf1ca697fc27886d18ca83;hp=01ef1431387a24b31718afea01db9d7343193bec;hpb=90499e2a01eebca95b55b22ed12accc112635c48;p=xonotic%2Fxonstat.git diff --git a/xonstat/views/helpers.py b/xonstat/views/helpers.py index 01ef143..d8b3211 100644 --- a/xonstat/views/helpers.py +++ b/xonstat/views/helpers.py @@ -1,6 +1,7 @@ import logging import sqlalchemy.sql.expression as expr from datetime import datetime +from sqlalchemy.orm import aliased from xonstat.models import * from xonstat.util import * @@ -16,8 +17,9 @@ class RecentGame(object): The constructor takes a query row that has been fetched, and it requires the following columns to be present in the row: - game_id, game_type_cd, winner, create_dt, server_id, server_name, - map_id, map_name, player_id, nick, rank, team + game_id, game_type_cd, game_type_descr, winner, start_dt, + server_id, server_name, map_id, map_name, player_id, nick, + rank, team The following columns are optional: @@ -29,10 +31,11 @@ class RecentGame(object): def __init__(self, row): self.game_id = row.game_id self.game_type_cd = row.game_type_cd + self.game_type_descr = row.game_type_descr self.winner = row.winner - self.create_dt = row.create_dt - self.fuzzy_date = pretty_date(row.create_dt) - self.epoch = timegm(row.create_dt.timetuple()) + self.start_dt = row.start_dt + self.fuzzy_date = pretty_date(row.start_dt) + self.epoch = timegm(row.start_dt.timetuple()) self.server_id = row.server_id self.server_name = row.server_name self.map_id = row.map_id @@ -48,8 +51,33 @@ class RecentGame(object): except: self.elo_delta = None - -def recent_games_q(server_id=None, map_id=None, player_id=None, cutoff=None): + def _asdict(self): + return { + "game_id": self.game_id, + "game_type_cd": self.game_type_cd, + "game_type_descr": self.game_type_descr, + "winner": self.winner, + "start_dt": self.start_dt, + "fuzzy_dt": self.fuzzy_date, + "epoch": self.epoch, + "server_id": self.server_id, + "server_name": self.server_name, + "map_id": self.map_id, + "map_name": self.map_name, + "player_id": self.player_id, + "nick": self.nick, + "nick_html_colors": self.nick_html_colors, + "rank": self.rank, + "team": self.team, + "elo_delta": self.elo_delta, + } + + def __repr__(self): + return "" % (self.game_id, self.game_type_cd, self.server_name, self.map_name) + + +def recent_games_q(server_id=None, map_id=None, player_id=None, + game_type_cd=None, cutoff=None, force_player_id=False): ''' Returns a SQLA query of recent game data. Parameters filter the results returned if they are provided. If not, it is @@ -59,16 +87,19 @@ def recent_games_q(server_id=None, map_id=None, player_id=None, cutoff=None): look when querying. Only games that happened on or after the cutoff (which is a datetime object) will be returned. ''' - recent_games_q = DBSession.query(Game.game_id, Game.game_type_cd, - Game.winner, Game.create_dt, Server.server_id, - Server.name.label('server_name'), Map.map_id, + pgstat_alias = aliased(PlayerGameStat, name='pgstat_alias') + + recent_games_q = DBSession.query(Game.game_id, GameType.game_type_cd, + Game.winner, Game.start_dt, GameType.descr.label('game_type_descr'), + Server.server_id, Server.name.label('server_name'), Map.map_id, Map.name.label('map_name'), PlayerGameStat.player_id, PlayerGameStat.nick, PlayerGameStat.rank, PlayerGameStat.team, PlayerGameStat.elo_delta).\ filter(Game.server_id==Server.server_id).\ filter(Game.map_id==Map.map_id).\ filter(Game.game_id==PlayerGameStat.game_id).\ - order_by(expr.desc(Game.create_dt)) + filter(Game.game_type_cd==GameType.game_type_cd).\ + order_by(expr.desc(Game.game_id)) # the various filters provided get tacked on to the query if server_id is not None: @@ -79,12 +110,27 @@ def recent_games_q(server_id=None, map_id=None, player_id=None, cutoff=None): recent_games_q = recent_games_q.\ filter(Map.map_id==map_id) + # Note: force_player_id makes the pgstat row returned be from the + # specified player_id. Otherwise it will just look for a game + # *having* that player_id, but returning the #1 player's pgstat row if player_id is not None: - recent_games_q = recent_games_q.\ - filter(PlayerGameStat.player_id==player_id) + if force_player_id: + recent_games_q = recent_games_q.\ + filter(PlayerGameStat.player_id==player_id).\ + filter(Game.players.contains([player_id])) + else: + recent_games_q = recent_games_q.\ + filter(PlayerGameStat.scoreboardpos==1).\ + filter(Game.game_id==pgstat_alias.game_id).\ + filter(Game.players.contains([player_id])).\ + filter(pgstat_alias.player_id==player_id) else: recent_games_q = recent_games_q.\ - filter(PlayerGameStat.rank==1) + filter(PlayerGameStat.scoreboardpos==1) + + if game_type_cd is not None: + recent_games_q = recent_games_q.\ + filter(Game.game_type_cd==game_type_cd.lower()) if cutoff is not None: right_now = datetime.utcnow()