X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=xonstat%2Fviews%2Fgame.py;h=1ed1741f52eb4cbec54bf1ccbceed7f058e9cf85;hb=3b8781019d65300747c6d7de8a9b9641fa3aafe4;hp=f9389e0bc10821a4c73aae68324c96ee44b625c1;hpb=de9c8abb10785f0944ffbb066826e1338dfcf029;p=xonotic%2Fxonstat.git diff --git a/xonstat/views/game.py b/xonstat/views/game.py index f9389e0..1ed1741 100644 --- a/xonstat/views/game.py +++ b/xonstat/views/game.py @@ -7,32 +7,46 @@ from sqlalchemy import desc, func, over from webhelpers.paginate import Page, PageURL from xonstat.models import * from xonstat.util import page_url +from xonstat.views.helpers import RecentGame, recent_games_q log = logging.getLogger(__name__) def _game_index_data(request): + if request.matchdict.has_key('game_type_cd'): + game_type_cd = request.matchdict['game_type_cd'] + else: + game_type_cd = None + if request.params.has_key('page'): current_page = request.params['page'] else: current_page = 1 - - games_q = DBSession.query(Game, Server, Map).\ - filter(Game.server_id == Server.server_id).\ - filter(Game.map_id == Map.map_id).\ - order_by(Game.game_id.desc()) - - games = Page(games_q, current_page, items_per_page=10, url=page_url) - - pgstats = {} - for (game, server, map) in games: - pgstats[game.game_id] = DBSession.query(PlayerGameStat).\ - filter(PlayerGameStat.game_id == game.game_id).\ - order_by(PlayerGameStat.rank).\ - order_by(PlayerGameStat.score).all() + + try: + rgs_q = recent_games_q(game_type_cd=game_type_cd) + + games = Page(rgs_q, current_page, items_per_page=10, url=page_url) + + # replace the items in the canned pagination class with more rich ones + games.items = [RecentGame(row) for row in games.items] + + pgstats = {} + for game in games.items: + pgstats[game.game_id] = DBSession.query(PlayerGameStat).\ + filter(PlayerGameStat.game_id == game.game_id).\ + order_by(PlayerGameStat.scoreboardpos).\ + order_by(PlayerGameStat.score).all() + + except Exception as e: + games = None + pgstats = None + game_type_cd = None return {'games':games, - 'pgstats':pgstats} + 'pgstats':pgstats, + 'game_type_cd':game_type_cd, + } def game_index(request): @@ -61,27 +75,33 @@ def _game_info_data(request): else: show_elo = False + if request.params.has_key('show_latency'): + show_latency = True + else: + show_latency = False + try: notfound = False - (game, server, map) = DBSession.query(Game, Server, Map).\ + (game, server, map, gametype) = DBSession.query(Game, Server, Map, GameType).\ filter(Game.game_id == game_id).\ filter(Game.server_id == Server.server_id).\ - filter(Game.map_id == Map.map_id).one() + filter(Game.map_id == Map.map_id).\ + filter(Game.game_type_cd == GameType.game_type_cd).one() pgstats = DBSession.query(PlayerGameStat).\ filter(PlayerGameStat.game_id == game_id).\ - order_by(PlayerGameStat.rank).\ + order_by(PlayerGameStat.scoreboardpos).\ order_by(PlayerGameStat.score).\ all() captimes = [] if game.game_type_cd == 'ctf': for pgstat in pgstats: - if pgstat.fastest_cap is not None: + if pgstat.fastest is not None: captimes.append(pgstat) - captimes = sorted(captimes, key=lambda x:x.fastest_cap) + captimes = sorted(captimes, key=lambda x:x.fastest) pwstats = {} for (pwstat, pgstat, weapon) in DBSession.query(PlayerWeaponStat, PlayerGameStat, Weapon).\ @@ -89,7 +109,7 @@ def _game_info_data(request): filter(PlayerWeaponStat.weapon_cd == Weapon.weapon_cd).\ filter(PlayerWeaponStat.player_game_stat_id == \ PlayerGameStat.player_game_stat_id).\ - order_by(PlayerGameStat.rank).\ + order_by(PlayerGameStat.scoreboardpos).\ order_by(PlayerGameStat.score).\ order_by(Weapon.descr).\ all(): @@ -107,19 +127,23 @@ def _game_info_data(request): game = None server = None map = None + gametype = None pgstats = None pwstats = None captimes = None show_elo = False + show_latency = False raise inst return {'game':game, 'server':server, 'map':map, + 'gametype':gametype, 'pgstats':pgstats, 'pwstats':pwstats, 'captimes':captimes, 'show_elo':show_elo, + 'show_latency':show_latency, } @@ -172,3 +196,53 @@ def rank_index_json(request): Provide a list of gametype ranks, paginated. JSON. """ return [{'status':'not implemented'}] + + +def game_finder_data(request): + if request.params.has_key('page'): + current_page = request.params['page'] + else: + current_page = 1 + + query = {} + + server_id, map_id, player_id = None, None, None + range_start, range_end = None, None + # these become WHERE clauses when present + if request.params.has_key('server_id'): + server_id = request.params['server_id'] + query['server_id'] = server_id + + if request.params.has_key('map_id'): + map_id = request.params['map_id'] + query['map_id'] = map_id + + if request.params.has_key('player_id'): + player_id = request.params['player_id'] + query['player_id'] = player_id + + if request.params.has_key('range_start'): + range_start = request.params['range_start'] + query['range_start'] = range_start + + if request.params.has_key('range_end'): + range_end = request.params['range_end'] + query['range_end'] = range_end + + rgs_q = recent_games_q(server_id=server_id, map_id=map_id, + player_id=player_id) + + recent_games = Page(rgs_q, current_page, url=page_url) + + recent_games.items = [RecentGame(row) for row in recent_games.items] + + return { + 'recent_games':recent_games, + 'query':query, + } + +def game_finder(request): + """ + Provide a list of recent games with an advanced filter. + """ + return game_finder_data(request)