]> de.git.xonotic.org Git - xonotic/xonstat.git/blobdiff - xonstat/views/game.py
Adding links to access gametype-filtered lists
[xonotic/xonstat.git] / xonstat / views / game.py
index f9389e0bc10821a4c73aae68324c96ee44b625c1..1ed1741f52eb4cbec54bf1ccbceed7f058e9cf85 100644 (file)
@@ -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)