import re\r
import time\r
from pyramid.response import Response\r
-from sqlalchemy import desc\r
+from sqlalchemy import desc, func, over\r
from webhelpers.paginate import Page, PageURL\r
from xonstat.models import *\r
from xonstat.util import page_url\r
try:\r
notfound = False\r
\r
- (start_dt, game_type_cd, server_id, server_name, map_id, map_name) = \\r
- DBSession.query("start_dt", "game_type_cd", "server_id", \r
- "server_name", "map_id", "map_name").\\r
- from_statement("select g.start_dt, g.game_type_cd, "\r
- "g.server_id, s.name as server_name, g.map_id, "\r
- "m.name as map_name "\r
- "from games g, servers s, maps m "\r
- "where g.game_id = :game_id "\r
- "and g.server_id = s.server_id "\r
- "and g.map_id = m.map_id").\\r
- params(game_id=game_id).one()\r
-\r
- player_game_stats = DBSession.query(PlayerGameStat).\\r
- from_statement("select * from player_game_stats "\r
- "where game_id = :game_id "\r
- "order by score desc").\\r
- params(game_id=game_id).all()\r
+ (game, server, map) = DBSession.query(Game, Server, Map).\\r
+ filter(Game.game_id == game_id).\\r
+ filter(Game.server_id == Server.server_id).\\r
+ filter(Game.map_id == Map.map_id).one()\r
+\r
+ pgstats = DBSession.query(PlayerGameStat).\\r
+ filter(PlayerGameStat.game_id == game_id).\\r
+ order_by(PlayerGameStat.rank).\\r
+ order_by(PlayerGameStat.score).\\r
+ all()\r
+\r
+ pwstats = {}\r
+ for (pwstat, pgstat, weapon) in DBSession.query(PlayerWeaponStat, PlayerGameStat, Weapon).\\r
+ filter(PlayerWeaponStat.game_id == game_id).\\r
+ filter(PlayerWeaponStat.weapon_cd == Weapon.weapon_cd).\\r
+ filter(PlayerWeaponStat.player_game_stat_id == \\r
+ PlayerGameStat.player_game_stat_id).\\r
+ order_by(PlayerGameStat.rank).\\r
+ order_by(PlayerGameStat.score).\\r
+ order_by(Weapon.descr).\\r
+ all():\r
+ if pgstat.player_game_stat_id not in pwstats:\r
+ pwstats[pgstat.player_game_stat_id] = []\r
+\r
+ # NOTE adding pgstat to position 6 in order to display nick.\r
+ # You have to use a slice [0:5] to pass to the accuracy \r
+ # template\r
+ pwstats[pgstat.player_game_stat_id].append((weapon.descr, \r
+ weapon.weapon_cd, pwstat.actual, pwstat.max, \r
+ pwstat.hit, pwstat.fired, pgstat))\r
+\r
except Exception as inst:\r
- notfound = True\r
- start_dt = None\r
- game_type_cd = None\r
- server_id = None\r
- server_name = None\r
- map_id = None\r
- map_name = None\r
- player_game_stats = None\r
-\r
- return {'notfound':notfound,\r
- 'start_dt':start_dt,\r
+ game = None\r
+ server = None\r
+ map = None\r
+ pgstats = None\r
+ pwstats = None\r
+ raise inst\r
+\r
+ return {'game':game,\r
+ 'server':server,\r
+ 'map':map,\r
+ 'pgstats':pgstats,\r
+ 'pwstats':pwstats,\r
+ }\r
+\r
+\r
+def rank_index(request):\r
+ """\r
+ Provide a list of gametype ranks, paginated.\r
+ """\r
+ if 'page' in request.matchdict:\r
+ current_page = request.matchdict['page']\r
+ else:\r
+ current_page = 1\r
+\r
+ game_type_cd = request.matchdict['game_type_cd']\r
+\r
+ ranks_q = DBSession.query(PlayerRank).\\r
+ filter(PlayerRank.game_type_cd==game_type_cd).\\r
+ order_by(PlayerRank.rank)\r
+\r
+ ranks = Page(ranks_q, current_page, url=page_url)\r
+\r
+ if len(ranks) == 0:\r
+ ranks = None\r
+\r
+ return {\r
+ 'ranks':ranks,\r
'game_type_cd':game_type_cd,\r
- 'server_id':server_id,\r
- 'server_name':server_name,\r
- 'map_id':map_id,\r
- 'map_name':map_name,\r
- 'player_game_stats':player_game_stats}\r
+ }\r