]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/views/server.py
Make pagination a GET parameter, not part of the URL.
[xonotic/xonstat.git] / xonstat / views / server.py
1 import logging\r
2 import sqlalchemy.sql.functions as func\r
3 import sqlalchemy.sql.expression as expr\r
4 import time\r
5 from datetime import datetime, timedelta\r
6 from pyramid.response import Response\r
7 from sqlalchemy import desc\r
8 from webhelpers.paginate import Page, PageURL\r
9 from xonstat.models import *\r
10 from xonstat.util import page_url, html_colors\r
11 \r
12 log = logging.getLogger(__name__)\r
13 \r
14 def server_index(request):\r
15     """\r
16     Provides a list of all the current servers. \r
17     """\r
18     if request.params.has_key('page'):\r
19         current_page = request.params['page']\r
20     else:\r
21         current_page = 1\r
22 \r
23     try:\r
24         server_q = DBSession.query(Server).\\r
25                 order_by(Server.server_id.desc())\r
26 \r
27         servers = Page(server_q, current_page, items_per_page=10, url=page_url)\r
28 \r
29         \r
30     except Exception as e:\r
31         servers = None\r
32 \r
33     return {'servers':servers, }\r
34 \r
35 \r
36 def server_info(request):\r
37     """\r
38     List the stored information about a given server.\r
39     """\r
40     server_id = request.matchdict['id']\r
41 \r
42     try: \r
43         leaderboard_lifetime = int(\r
44                 request.registry.settings['xonstat.leaderboard_lifetime'])\r
45     except:\r
46         leaderboard_lifetime = 30\r
47 \r
48     leaderboard_count = 10\r
49     recent_games_count = 20\r
50 \r
51     try:\r
52         server = DBSession.query(Server).filter_by(server_id=server_id).one()\r
53 \r
54         # top maps by total times played\r
55         top_maps = DBSession.query(Game.map_id, Map.name, \r
56                 func.count()).\\r
57                 filter(Map.map_id==Game.map_id).\\r
58                 filter(Game.server_id==server.server_id).\\r
59                 filter(Game.create_dt > \r
60                     (datetime.utcnow() - timedelta(days=leaderboard_lifetime))).\\r
61                 order_by(expr.desc(func.count())).\\r
62                 group_by(Game.map_id).\\r
63                 group_by(Map.name).all()[0:10]\r
64 \r
65         for i in range(leaderboard_count-len(top_maps)):\r
66             top_maps.append(('-', '-', '-'))\r
67 \r
68         # top players by score\r
69         top_scorers = DBSession.query(Player.player_id, Player.nick, \r
70                 func.sum(PlayerGameStat.score)).\\r
71                 filter(Player.player_id == PlayerGameStat.player_id).\\r
72                 filter(Game.game_id == PlayerGameStat.game_id).\\r
73                 filter(Game.server_id == server.server_id).\\r
74                 filter(Player.player_id > 2).\\r
75                 filter(PlayerGameStat.create_dt > \r
76                         (datetime.utcnow() - timedelta(days=leaderboard_lifetime))).\\r
77                 order_by(expr.desc(func.sum(PlayerGameStat.score))).\\r
78                 group_by(Player.nick).\\r
79                 group_by(Player.player_id).all()[0:10]\r
80 \r
81         top_scorers = [(player_id, html_colors(nick), score) \\r
82                 for (player_id, nick, score) in top_scorers]\r
83 \r
84         for i in range(leaderboard_count-len(top_scorers)):\r
85             top_scorers.append(('-', '-', '-'))\r
86 \r
87         # top players by playing time\r
88         top_players = DBSession.query(Player.player_id, Player.nick, \r
89                 func.sum(PlayerGameStat.alivetime)).\\r
90                 filter(Player.player_id == PlayerGameStat.player_id).\\r
91                 filter(Game.game_id == PlayerGameStat.game_id).\\r
92                 filter(Game.server_id == server.server_id).\\r
93                 filter(Player.player_id > 2).\\r
94                 filter(PlayerGameStat.create_dt > \r
95                         (datetime.utcnow() - timedelta(days=leaderboard_lifetime))).\\r
96                 order_by(expr.desc(func.sum(PlayerGameStat.alivetime))).\\r
97                 group_by(Player.nick).\\r
98                 group_by(Player.player_id).all()[0:10]\r
99 \r
100         top_players = [(player_id, html_colors(nick), score) \\r
101                 for (player_id, nick, score) in top_players]\r
102 \r
103         for i in range(leaderboard_count-len(top_players)):\r
104             top_players.append(('-', '-', '-'))\r
105 \r
106         # recent games played in descending order\r
107         recent_games = DBSession.query(Game, Server, Map, PlayerGameStat).\\r
108             filter(Game.server_id==Server.server_id).\\r
109             filter(Game.map_id==Map.map_id).\\r
110             filter(PlayerGameStat.game_id==Game.game_id).\\r
111             filter(PlayerGameStat.rank==1).\\r
112             filter(Server.server_id==server.server_id).\\r
113             order_by(expr.desc(Game.start_dt)).all()[0:recent_games_count]\r
114 \r
115         for i in range(recent_games_count-len(recent_games)):\r
116             recent_games.append(('-', '-', '-', '-'))\r
117 \r
118     except Exception as e:\r
119         server = None\r
120         recent_games = None\r
121         top_players = None\r
122         raise e\r
123     return {'server':server,\r
124             'recent_games':recent_games,\r
125             'top_players': top_players,\r
126             'top_scorers': top_scorers,\r
127             'top_maps': top_maps,\r
128             }\r
129 \r
130 \r
131 def server_game_index(request):\r
132     """\r
133     List the games played on a given server. Paginated.\r
134     """\r
135     server_id = request.matchdict['server_id']\r
136     current_page = request.matchdict['page']\r
137 \r
138     try:\r
139         server = DBSession.query(Server).filter_by(server_id=server_id).one()\r
140 \r
141         games_q = DBSession.query(Game, Server, Map).\\r
142                 filter(Game.server_id == server_id).\\r
143                 filter(Game.server_id == Server.server_id).\\r
144                 filter(Game.map_id == Map.map_id).\\r
145                 order_by(Game.game_id.desc())\r
146 \r
147         games = Page(games_q, current_page, url=page_url)\r
148     except Exception as e:\r
149         server = None\r
150         games = None\r
151         raise e\r
152 \r
153     return {'games':games,\r
154             'server':server}\r