]> 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 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
 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'])
 
 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:
 
     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).\
         (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()
 
                 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
         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)
 
         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))
 
                         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,
         raise inst
 
     return {'game':game,
@@ -125,17 +116,22 @@ def game_info_json(request):
 
 
 def _rank_index_data(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']
 
     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)
 
 
     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:
     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,
     return {
             'ranks':ranks,
             'game_type_cd':game_type_cd,
+            'game_type': game_type,
            }
 
 
            }