2 import sqlalchemy.sql.expression as expr
3 from datetime import datetime
4 from xonstat.models import *
5 from xonstat.util import *
7 log = logging.getLogger(__name__)
9 class RecentGame(object):
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.
16 The constructor takes a query row that has been fetched, and
17 it requires the following columns to be present in the row:
19 game_id, game_type_cd, game_type_descr, winner, start_dt,
20 server_id, server_name, map_id, map_name, player_id, nick,
23 The following columns are optional:
27 This class is meant to be used in conjunction with recent_games_q,
28 which will return rows matching this specification.
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
44 self.nick_html_colors = html_colors(row.nick)
49 self.elo_delta = row.elo_delta
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,
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,
68 "nick_html_colors": self.nick_html_colors,
71 "elo_delta": self.elo_delta,
75 return "<RecentGame(id=%s, gametype=%s, server=%s, map=%s)>" % (self.game_id, self.game_type_cd, self.server_name, self.map_name)
78 def recent_games_q(server_id=None, map_id=None, player_id=None, game_type_cd=None, cutoff=None):
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.
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.
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))
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)
105 if map_id is not None:
106 recent_games_q = recent_games_q.\
107 filter(Map.map_id==map_id)
109 if player_id is not None:
110 recent_games_q = recent_games_q.\
111 filter(PlayerGameStat.player_id==player_id)
113 recent_games_q = recent_games_q.\
114 filter(PlayerGameStat.rank==1)
116 if game_type_cd is not None:
117 recent_games_q = recent_games_q.\
118 filter(Game.game_type_cd==game_type_cd.lower())
120 if cutoff is not None:
121 right_now = datetime.utcnow()
122 recent_games_q = recent_games_q.\
123 filter(expr.between(Game.create_dt, cutoff, right_now))
125 return recent_games_q