]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/views/player.py
Move the accuracy table rendering into a callable template, modify views and other...
[xonotic/xonstat.git] / xonstat / views / player.py
1 import datetime\r
2 import logging\r
3 import re\r
4 import time\r
5 from pyramid.response import Response\r
6 from sqlalchemy import desc\r
7 from webhelpers.paginate import Page, PageURL\r
8 from xonstat.models import *\r
9 from xonstat.util import page_url\r
10 \r
11 log = logging.getLogger(__name__)\r
12 \r
13 \r
14 def player_index(request):\r
15     """\r
16     Provides a list of all the current players. \r
17     """\r
18     players = DBSession.query(Player)\r
19 \r
20     return {'players':players}\r
21 \r
22 def player_info(request):\r
23     """\r
24     Provides detailed information on a specific player\r
25     """\r
26     player_id = request.matchdict['id']\r
27     try:\r
28         player = DBSession.query(Player).filter_by(player_id=player_id).one()\r
29 \r
30         weapon_stats = DBSession.query("descr", "weapon_cd", "actual_total", \r
31                 "max_total", "hit_total", "fired_total", "frags_total").\\r
32                 from_statement(\r
33                     "select cw.descr, cw.weapon_cd, sum(actual) actual_total, "\r
34                     "sum(max) max_total, sum(hit) hit_total, "\r
35                     "sum(fired) fired_total, sum(frags) frags_total "\r
36                     "from xonstat.player_weapon_stats ws, xonstat.cd_weapon cw "\r
37                     "where ws.weapon_cd = cw.weapon_cd "\r
38                     "and player_id = :player_id "\r
39                     "group by descr, cw.weapon_cd "\r
40                     "order by descr"\r
41                 ).params(player_id=player_id).all()\r
42 \r
43         recent_games = DBSession.query(PlayerGameStat, Game, Server, Map).\\r
44                 filter(PlayerGameStat.player_id == player_id).\\r
45                 filter(PlayerGameStat.game_id == Game.game_id).\\r
46                 filter(Game.server_id == Server.server_id).\\r
47                 filter(Game.map_id == Map.map_id).\\r
48                 order_by(Game.game_id.desc())[0:10]\r
49 \r
50     except Exception as e:\r
51         player = None\r
52         weapon_stats = None\r
53         recent_games = None\r
54     return {'player':player, \r
55             'recent_games':recent_games,\r
56             'weapon_stats':weapon_stats}\r
57 \r
58 \r
59 def player_game_index(request):\r
60     """\r
61     Provides an index of the games in which a particular\r
62     player was involved. This is ordered by game_id, with\r
63     the most recent game_ids first. Paginated.\r
64     """\r
65     player_id = request.matchdict['player_id']\r
66 \r
67     if 'page' in request.matchdict:\r
68         current_page = request.matchdict['page']\r
69     else:\r
70         current_page = 1\r
71 \r
72     try:\r
73         player = DBSession.query(Player).filter_by(player_id=player_id).one()\r
74 \r
75         games_q = DBSession.query(PlayerGameStat, Game, Server, Map).\\r
76                 filter(PlayerGameStat.player_id == player_id).\\r
77                 filter(PlayerGameStat.game_id == Game.game_id).\\r
78                 filter(Game.server_id == Server.server_id).\\r
79                 filter(Game.map_id == Map.map_id).\\r
80                 order_by(Game.game_id.desc())\r
81 \r
82         games = Page(games_q, current_page, url=page_url)\r
83 \r
84         \r
85     except Exception as e:\r
86         player = None\r
87         games = None\r
88 \r
89     return {'player':player,\r
90             'games':games}\r
91 \r
92 \r
93 def player_weapon_stats(request):\r
94     """\r
95     List the accuracy statistics for the given player_id in a particular\r
96     game.\r
97     """\r
98     game_id = request.matchdict['game_id']\r
99     pgstat_id = request.matchdict['pgstat_id']\r
100     try:\r
101         pwstats = DBSession.query(PlayerWeaponStat, Weapon).\\r
102                 filter(PlayerWeaponStat.weapon_cd==Weapon.weapon_cd).\\r
103                 filter_by(game_id=game_id).\\r
104                 filter_by(player_game_stat_id=pgstat_id).\\r
105                 order_by(Weapon.descr).\\r
106                 all()\r
107 \r
108         # turn this into something the accuracy template can use\r
109         weapon_stats = []\r
110         for (pwstat, weapon) in pwstats:\r
111             weapon_stats.append((weapon.descr, pwstat.weapon_cd, pwstat.fired,\r
112                 pwstat.hit, pwstat.max, pwstat.actual))\r
113 \r
114         pgstat = DBSession.query(PlayerGameStat).\\r
115                 filter_by(player_game_stat_id=pgstat_id).one()\r
116 \r
117         game = DBSession.query(Game).filter_by(game_id=game_id).one()\r
118 \r
119     except Exception as e:\r
120         weapon_stats = None\r
121         pgstat = None\r
122         game = None\r
123     return {'weapon_stats':weapon_stats, 'pgstat':pgstat, 'game':game}\r