config.add_view(stats_submit, route_name="stats_submit")
# PLAYER ROUTES
- config.add_route("player_game_index_paged",
- "/player/{player_id:\d+}/games/page/{page:\d+}")
- config.add_view(player_game_index, route_name="player_game_index_paged",
- renderer="player_game_index.mako")
-
config.add_route("player_game_index",
"/player/{player_id:\d+}/games")
config.add_view(player_game_index, route_name="player_game_index",
renderer="player_game_index.mako")
- config.add_route("player_index_paged", "/players/page/{page:\d+}")
- config.add_view(player_index, route_name="player_index_paged",
- renderer="player_index.mako")
-
config.add_route("player_index", "/players")
config.add_view(player_index, route_name="player_index",
renderer="player_index.mako")
config.add_view(game_index, route_name="game_index",
renderer="game_index.mako")
- config.add_route("game_index_paged", "/games/page/{page:\d+}")
- config.add_view(game_index, route_name="game_index_paged",
- renderer="game_index.mako")
-
config.add_route("game_info", "/game/{id:\d+}")
config.add_view(game_info, route_name="game_info",
renderer="game_info.mako")
config.add_view(rank_index, route_name="rank_index",
renderer="rank_index.mako")
- config.add_route("rank_index_paged", "/ranks/{game_type_cd:ctf|dm|tdm|duel}/page/{page:\d+}")
- config.add_view(rank_index, route_name="rank_index_paged",
- renderer="rank_index.mako")
-
# SERVER ROUTES
- config.add_route("server_index_paged", "/servers/page/{page:\d+}")
- config.add_view(server_index, route_name="server_index_paged",
- renderer="server_index.mako")
-
config.add_route("server_index", "/servers")
config.add_view(server_index, route_name="server_index",
renderer="server_index.mako")
renderer="server_info.mako")
# MAP ROUTES
- config.add_route("map_index_paged", "/maps/page/{page:\d+}")
- config.add_view(map_index, route_name="map_index_paged",
- renderer="map_index.mako")
+ config.add_route("map_index_json", "/maps.json")
+ config.add_view(map_index_json, route_name="map_index_json",
+ renderer="json")
config.add_route("map_index", "/maps")
config.add_view(map_index, route_name="map_index",
config.add_view(search, route_name="search",
renderer="search.mako")
- config.add_route("search_paged", "search/page/{page:\d+}")
- config.add_view(search, route_name="search_paged",
- renderer="search.mako")
-
-
return config.make_wsgi_app()
+import json
import logging
import math
import sqlalchemy
def __repr__(self):
return "<Map(%s, %s, %s)>" % (self.map_id, self.name, self.version)
+ def to_dict(self):
+ return {'map_id':self.map_id, 'name':self.name}
+
class Game(object):
def __init__(self, game_id=None, start_dt=None, game_type_cd=None,
</style>
<%block name="css">
- <link href="../assets/css/bootstrap-responsive.css" rel="stylesheet">
<!-- <link href="/static/css/style.min.css" rel="stylesheet"> -->
<link href="/static/css/style.css" rel="stylesheet">
</%block>
</div>\r
\r
<!-- navigation links -->\r
-${navlinks("game_index_paged", games.page, games.last_page)}\r
+${navlinks("game_index", games.page, games.last_page)}\r
% endif\r
\r
% endif\r
\r
<!-- navigation links -->\r
- ${navlinks("map_index_paged", maps.page, maps.last_page)}\r
+ ${navlinks("map_index", maps.page, maps.last_page)}\r
</div> <!-- /span4 -->\r
</div> <!-- /row -->\r
<option>servers</option>
<option>maps</option>
</select>
- [<a href="${request.route_url('search')}"" title="Advanced search">+</a>]
+ [<a href="${request.route_url('search')}" title="Advanced search">+</a>]
</form>
</div><!--/.nav-collapse -->
</div>
<%def name="navlinks(view, curr, last, **kwargs)">
+<%
+kwargs['_query'] = {'page': None}
+
+if 'search_query' in kwargs.keys():
+ kwargs['_query'] = dict(kwargs['_query'].items() + kwargs['search_query'].items())
+%>
+
% if not (curr == last and curr == 1):
% if curr != 1:
- <a class="pagination" href="${request.route_url(view, page=curr-1, **kwargs)}" name="Previous Page">previous</a>
+ <% kwargs['_query']['page'] = curr-1 %>
+ <a class="pagination" href="${request.route_url(view, **kwargs)}" name="Previous Page">previous</a>
% endif
% if last < 8:
${link_page(view, i, curr, **kwargs)}
% endfor
<span class="pagination">...</span>
- <a class="pagination" href="${request.route_url(view, page=last, **kwargs)}" name="Last Page">${last}</a>
+ <% kwargs['_query']['page'] = last %>
+ <a class="pagination" href="${request.route_url(view, **kwargs)}" name="Last Page">${last}</a>
% elif last-curr < 6:
- <a class="pagination" href="${request.route_url(view, page=1, **kwargs)}" name="First Page">1</a>
+ <% kwargs['_query']['page'] = 1 %>
+ <a class="pagination" href="${request.route_url(view, **kwargs)}" name="First Page">1</a>
<span class="pagination">...</span>
% for i in range(last-5, last+1):
${link_page(view, i, curr, **kwargs)}
% endfor
% else:
- <a class="pagination" href="${request.route_url(view, page=1, **kwargs)}" name="First Page">1</a>
+ <% kwargs['_query']['page'] = 1 %>
+ <a class="pagination" href="${request.route_url(view, **kwargs)}" name="First Page">1</a>
<span class="pagination">...</span>
% for i in range(curr-2, curr+3):
${link_page(view, i, curr, **kwargs)}
% endfor
<span class="pagination">...</span>
- <a class="pagination" href="${request.route_url(view, page=last, **kwargs)}" name="Last Page">${last}</a>
+ <% kwargs['_query']['page'] = last %>
+ <a class="pagination" href="${request.route_url(view, **kwargs)}" name="Last Page">${last}</a>
% endif
% endif
% if curr != last:
- <a class="pagination" href="${request.route_url(view, page=curr+1, **kwargs)}" name="Next Page">next</a>
+ <% kwargs['_query']['page'] = curr+1 %>
+ <a class="pagination" href="${request.route_url(view, **kwargs)}" name="Next Page">next</a>
% endif
% endif
</%def>
% if page_num == curr_page:
<span class="pagination" style="color:#d95b00;">${page_num}</span>
% else:
- <a class="pagination" href="${request.route_url(view, page=page_num, **kwargs)}" name="Go to page ${page_num}">${page_num}</a>
+ <% kwargs['_query']['page'] = page_num %>
+ <a class="pagination" href="${request.route_url(view, **kwargs)}" name="Go to page ${page_num}">${page_num}</a>
% endif
</%def>
</table>\r
% endif\r
\r
- ${navlinks("player_index_paged", players.page, players.last_page)}\r
+ ${navlinks("player_index", players.page, players.last_page)}\r
</div> <!-- /span4 -->\r
</div> <!-- /row -->\r
</table>\r
\r
<!-- navigation links -->\r
-${navlinks("rank_index_paged", ranks.page, ranks.last_page, game_type_cd=game_type_cd)}\r
+${navlinks("rank_index", ranks.page, ranks.last_page, game_type_cd=game_type_cd)}\r
% endif\r
% endif
<!-- navigation links -->
-${navlinks("search_paged", results.page, results.last_page, _query=query)}
+${navlinks("search", results.page, results.last_page, search_query=query)}
% endif
<%block name="js">
</table>\r
% endif\r
\r
- ${navlinks("server_index_paged", servers.page, servers.last_page)}\r
+ ${navlinks("server_index", servers.page, servers.last_page)}\r
</div> <!-- /span4 -->\r
</div> <!-- /row -->\r
from xonstat.views.player import player_index, player_info, player_game_index\r
from xonstat.views.player import player_accuracy\r
from xonstat.views.game import game_index, game_info, rank_index\r
-from xonstat.views.map import map_info, map_index\r
+from xonstat.views.map import map_info, map_index, map_index_json\r
from xonstat.views.server import server_info, server_game_index, server_index\r
from xonstat.views.search import *\r
from xonstat.views.main import main_index\r
These games are ordered by game_id, with the most current ones first.\r
Paginated.\r
"""\r
- if 'page' in request.matchdict:\r
- current_page = request.matchdict['page']\r
+ if request.params.has_key('page'):\r
+ current_page = request.params['page']\r
else:\r
current_page = 1\r
\r
filter(Game.map_id == Map.map_id).\\r
order_by(Game.game_id.desc())\r
\r
- games = Page(games_q, current_page, url=page_url)\r
+ games = Page(games_q, current_page, items_per_page=10, url=page_url)\r
\r
pgstats = {}\r
for (game, server, map) in games:\r
"""\r
Provide a list of gametype ranks, paginated.\r
"""\r
- if 'page' in request.matchdict:\r
- current_page = request.matchdict['page']\r
+ if request.params.has_key('page'):\r
+ current_page = request.params['page']\r
else:\r
current_page = 1\r
\r
\r
log = logging.getLogger(__name__)\r
\r
-def map_index(request):\r
+def _map_index_data(request):\r
"""\r
Provides a list of all the current maps. \r
"""\r
- if 'page' in request.matchdict:\r
- current_page = request.matchdict['page']\r
+ if request.params.has_key('page'):\r
+ current_page = request.params['page']\r
else:\r
current_page = 1\r
\r
map_q = DBSession.query(Map).\\r
order_by(Map.map_id.desc())\r
\r
- maps = Page(map_q, current_page, url=page_url)\r
+ maps = Page(map_q, current_page, items_per_page=10, url=page_url)\r
\r
- \r
except Exception as e:\r
maps = None\r
\r
return {'maps':maps, }\r
\r
\r
+def map_index(request):\r
+ """\r
+ Provides a list of all the current maps. \r
+ """\r
+ return _map_index_data(request)\r
+\r
+\r
+def map_index_json(request):\r
+ """\r
+ Provides a JSON-serialized list of all the current maps. \r
+ """\r
+ view_data = _map_index_data(request)\r
+\r
+ maps = [m.to_dict() for m in view_data['maps']]\r
+\r
+ return maps\r
+\r
+\r
def map_info(request):\r
"""\r
List the information stored about a given map. \r
"""\r
Provides a list of all the current players. \r
"""\r
- if 'page' in request.matchdict:\r
- current_page = int(request.matchdict['page'])\r
+ if request.params.has_key('page'):\r
+ current_page = request.params['page']\r
else:\r
current_page = 1\r
\r
\r
players = Page(player_q, current_page, items_per_page=10, url=page_url)\r
\r
- last_linked_page = current_page + 4\r
- if last_linked_page > players.last_page:\r
- last_linked_page = players.last_page\r
-\r
- pages_to_link = range(current_page+1, last_linked_page+1)\r
-\r
except Exception as e:\r
players = None\r
raise e\r
\r
- return {'players':players,\r
- 'pages_to_link':pages_to_link,\r
- }\r
+ return {'players':players\r
+ }\r
\r
\r
def get_games_played(player_id):\r
query = None
_query = {}
- if 'page' in request.matchdict:
- current_page = request.matchdict['page']
+
+ if request.params.has_key('page'):
+ current_page = request.params['page']
else:
current_page = 1
try:
if q != None:
- results = Page(q, current_page, url=page_url)
+ results = Page(q, current_page, items_per_page=10, url=page_url)
except Exception as e:
raise e
result_type = None
"""\r
Provides a list of all the current servers. \r
"""\r
- if 'page' in request.matchdict:\r
- current_page = request.matchdict['page']\r
+ if request.params.has_key('page'):\r
+ current_page = request.params['page']\r
else:\r
current_page = 1\r
\r
server_q = DBSession.query(Server).\\r
order_by(Server.server_id.desc())\r
\r
- servers = Page(server_q, current_page, url=page_url)\r
+ servers = Page(server_q, current_page, items_per_page=10, url=page_url)\r
\r
\r
except Exception as e:\r
log.debug("ERROR: Blank game")\r
raise pyramid.httpexceptions.HTTPOk("OK")\r
\r
- # FIXME: if we have two players and game type is 'dm',\r
- # change this into a 'duel' gametype. This should be\r
- # removed when the stats actually send 'duel' instead of 'dm'\r
+ # the "duel" gametype is fake\r
if num_real_players(players, count_bots=True) == 2 and \\r
game_meta['G'] == 'dm':\r
game_meta['G'] = 'duel'\r
\r
+\r
+ # fix for DTG, who didn't #ifdef WATERMARK to set the revision info\r
+ try:\r
+ revision = game_meta['R']\r
+ except:\r
+ revision = "unknown"\r
+\r
server = get_or_create_server(session=session, hashkey=idfp, \r
- name=game_meta['S'], revision=game_meta['R'],\r
+ name=game_meta['S'], revision=revision,\r
ip_addr=get_remote_addr(request))\r
\r
gmap = get_or_create_map(session=session, name=game_meta['M'])\r