]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/views/helpers.py
Use gametype description for icon tooltips (e.g. ca -> Clan Arena)
[xonotic/xonstat.git] / xonstat / views / helpers.py
1 import logging
2 import sqlalchemy.sql.expression as expr
3 from datetime import datetime
4 from xonstat.models import *
5 from xonstat.util import *
6
7 log = logging.getLogger(__name__)
8
9 class RecentGame(object):
10     '''
11     This is a helper class to facilitate showing recent games
12     data within mako. The idea is to take the results of a query
13     and transform it into class members easily accessible later.
14     It is like a namedtuple but a little easier to form.
15
16     The constructor takes a query row that has been fetched, and
17     it requires the following columns to be present in the row:
18
19         game_id, game_type_cd, game_type_descr, winner, start_dt,
20         server_id, server_name, map_id, map_name, player_id, nick,
21         rank, team
22
23     The following columns are optional:
24
25         elo_delta
26
27     This class is meant to be used in conjunction with recent_games_q,
28     which will return rows matching this specification.
29     '''
30     def __init__(self, row):
31         self.game_id = row.game_id
32         self.game_type_cd = row.game_type_cd
33         self.game_type_descr = row.game_type_descr
34         self.winner = row.winner
35         self.start_dt = row.start_dt
36         self.fuzzy_date = pretty_date(row.start_dt)
37         self.epoch = timegm(row.start_dt.timetuple())
38         self.server_id = row.server_id
39         self.server_name = row.server_name
40         self.map_id = row.map_id
41         self.map_name = row.map_name
42         self.player_id = row.player_id
43         self.nick = row.nick
44         self.nick_html_colors = html_colors(row.nick)
45         self.rank = row.rank
46         self.team = row.team
47
48         try:
49             self.elo_delta = row.elo_delta
50         except:
51             self.elo_delta = None
52
53     def _asdict(self):
54         return {
55             "game_id": self.game_id,
56             "game_type_cd": self.game_type_cd,
57             "game_type_descr": self.game_type_descr,
58             "winner": self.winner,
59             "start_dt": self.start_dt,
60             "fuzzy_dt": self.fuzzy_date,
61             "epoch": self.epoch,
62             "server_id": self.server_id,
63             "server_name": self.server_name,
64             "map_id": self.map_id,
65             "map_name": self.map_name,
66             "player_id": self.player_id,
67             "nick": self.nick,
68             "nick_html_colors": self.nick_html_colors,
69             "rank": self.rank,
70             "team": self.team,
71             "elo_delta": self.elo_delta,
72             }
73
74     def __repr__(self):
75         return "<RecentGame(id=%s, gametype=%s, server=%s, map=%s)>" % (self.game_id, self.game_type_cd, self.server_name, self.map_name)
76
77
78 def recent_games_q(server_id=None, map_id=None, player_id=None, cutoff=None):
79     '''
80     Returns a SQLA query of recent game data. Parameters filter
81     the results returned if they are provided. If not, it is
82     assumed that results from all servers and maps is desired.
83
84     The cutoff parameter provides a way to limit how far back to
85     look when querying. Only games that happened on or after the
86     cutoff (which is a datetime object) will be returned.
87     '''
88     recent_games_q = DBSession.query(Game.game_id, GameType.game_type_cd,
89             Game.winner, Game.start_dt, GameType.descr.label('game_type_descr'),
90             Server.server_id, Server.name.label('server_name'), Map.map_id,
91             Map.name.label('map_name'), PlayerGameStat.player_id,
92             PlayerGameStat.nick, PlayerGameStat.rank, PlayerGameStat.team,
93             PlayerGameStat.elo_delta).\
94             filter(Game.server_id==Server.server_id).\
95             filter(Game.map_id==Map.map_id).\
96             filter(Game.game_id==PlayerGameStat.game_id).\
97             filter(Game.game_type_cd==GameType.game_type_cd).\
98             order_by(expr.desc(Game.game_id))
99
100     # the various filters provided get tacked on to the query
101     if server_id is not None:
102         recent_games_q = recent_games_q.\
103             filter(Server.server_id==server_id)
104
105     if map_id is not None:
106         recent_games_q = recent_games_q.\
107             filter(Map.map_id==map_id)
108
109     if player_id is not None:
110         recent_games_q = recent_games_q.\
111             filter(PlayerGameStat.player_id==player_id)
112     else:
113         recent_games_q = recent_games_q.\
114             filter(PlayerGameStat.rank==1)
115
116     if cutoff is not None:
117         right_now = datetime.utcnow()
118         recent_games_q = recent_games_q.\
119             filter(expr.between(Game.create_dt, cutoff, right_now))
120
121     return recent_games_q