]> de.git.xonotic.org Git - xonotic/xonstat.git/blobdiff - xonstat/views/game.py
Make the active players/servers/maps use the cache.
[xonotic/xonstat.git] / xonstat / views / game.py
index 46970f4168196aacbed23fdd0330861697846a21..7af7c142957ac6b17ab40dc27e72bf19df8707b4 100644 (file)
@@ -6,6 +6,7 @@ from collections import OrderedDict
 from pyramid import httpexceptions
 from pyramid.response import Response
 from sqlalchemy import desc, func, over
+from sqlalchemy.orm.exc import *
 from webhelpers.paginate import Page, PageURL
 from xonstat.models import *
 from xonstat.util import page_url
@@ -18,15 +19,10 @@ log = logging.getLogger(__name__)
 def _game_info_data(request):
     game_id = int(request.matchdict['id'])
 
-    show_elo = False
-    if request.params.has_key('show_elo'):
-        show_elo = True
-
-    show_latency = False
+    # show an extra column if "show_elo" is a GET parameter
+    show_elo = bool(request.params.get("show_elo", False))
 
     try:
-        notfound = False
-
         (game, server, map, gametype) = DBSession.query(Game, Server, Map, GameType).\
                 filter(Game.game_id == game_id).\
                 filter(Game.server_id == Server.server_id).\
@@ -39,10 +35,13 @@ def _game_info_data(request):
                 order_by(PlayerGameStat.score).\
                 all()
 
-        # if at least one player has a valid latency, we'll show the column
+        # Really old games don't have latency sent, so we have to check. If at
+        # least one player has a latency value, we'll show the ping column.
+        show_latency = False
         for pgstat in pgstats:
             if pgstat.avg_latency is not None:
                 show_latency = True
+                break
 
         q = DBSession.query(TeamGameStat).\
                 filter(TeamGameStat.game_id == game_id)
@@ -82,18 +81,10 @@ def _game_info_data(request):
                         weapon.weapon_cd, pwstat.actual, pwstat.max,
                         pwstat.hit, pwstat.fired, pwstat.frags))
 
-    except Exception as inst:
-        game = None
-        server = None
-        map = None
-        gametype = None
-        pgstats = None
-        tgstats = None
-        pwstats = None
-        captimes = None
-        show_elo = False
-        show_latency = False
-        stats_by_team = None
+    except NoResultFound as e:
+        raise httpexceptions.HTTPNotFound("Could not find that game!")
+
+    except Exception as e:
         raise inst
 
     return {'game':game,
@@ -125,17 +116,22 @@ def game_info_json(request):
 
 
 def _rank_index_data(request):
-    if request.params.has_key('page'):
-        current_page = request.params['page']
-    else:
-        current_page = 1
+    current_page = request.params.get("page", 1)
+
+    # game type whitelist
+    game_types_allowed = ["ca", "ctf", "dm", "duel", "ft", "ka", "tdm"]
 
     game_type_cd = request.matchdict['game_type_cd']
+    if game_type_cd not in game_types_allowed:
+        raise httpexceptions.HTTPNotFound()
 
     ranks_q = DBSession.query(PlayerRank).\
             filter(PlayerRank.game_type_cd==game_type_cd).\
             order_by(PlayerRank.rank)
 
+    game_type = DBSession.query(GameType).\
+            filter(GameType.game_type_cd == game_type_cd).one()
+
     ranks = Page(ranks_q, current_page, url=page_url)
 
     if len(ranks) == 0:
@@ -144,6 +140,7 @@ def _rank_index_data(request):
     return {
             'ranks':ranks,
             'game_type_cd':game_type_cd,
+            'game_type': game_type,
            }