+
+
+def player_weaponstats_data_json(request):
+ player_id = int(request.matchdict["id"])
+ if player_id <= 2:
+ player_id = -1;
+
+ game_type_cd = request.params.get("game_type", None)
+ if game_type_cd == "overall":
+ game_type_cd = None
+
+ limit = 20
+ if request.params.has_key("limit"):
+ limit = int(request.params["limit"])
+
+ if limit < 0:
+ limit = 20
+ if limit > 50:
+ limit = 50
+
+
+ # the game_ids of the most recently played ones
+ # of the given game type is used for a subquery
+ games_list = DBSession.query(Game.game_id).\
+ filter(Game.players.contains([player_id]))
+
+ if game_type_cd is not None:
+ games_list = games_list.filter(Game.game_type_cd == game_type_cd)
+
+ games_list = games_list.order_by(Game.game_id.desc()).limit(limit)
+
+ weapon_stats_raw = DBSession.query(PlayerWeaponStat).\
+ filter(PlayerWeaponStat.player_id == player_id).\
+ filter(PlayerWeaponStat.game_id.in_(games_list)).\
+ all()
+
+ games_to_weapons = {}
+ weapons_used = {}
+ sum_avgs = {}
+ for ws in weapon_stats_raw:
+ if ws.game_id not in games_to_weapons:
+ games_to_weapons[ws.game_id] = [ws.weapon_cd]
+ else:
+ games_to_weapons[ws.game_id].append(ws.weapon_cd)
+
+ weapons_used[ws.weapon_cd] = weapons_used.get(ws.weapon_cd, 0) + 1
+ sum_avgs[ws.weapon_cd] = sum_avgs.get(ws.weapon_cd, 0) + float(ws.hit)/float(ws.fired)
+
+ # Creating zero-valued weapon stat entries for games where a weapon was not
+ # used in that game, but was used in another game for the set. This makes
+ # the charts look smoother
+ for game_id in games_to_weapons.keys():
+ for weapon_cd in set(weapons_used.keys()) - set(games_to_weapons[game_id]):
+ weapon_stats_raw.append(PlayerWeaponStat(player_id=player_id,
+ game_id=game_id, weapon_cd=weapon_cd))
+
+ # averages for the weapons used in the range
+ avgs = {}
+ for w in weapons_used.keys():
+ avgs[w] = round(sum_avgs[w]/float(weapons_used[w])*100, 2)
+
+ weapon_stats_raw = sorted(weapon_stats_raw, key = lambda x: x.game_id)
+ games = sorted(games_to_weapons.keys())
+ weapon_stats = [ws.to_dict() for ws in weapon_stats_raw]
+
+ return {
+ "weapon_stats": weapon_stats,
+ "weapons_used": weapons_used.keys(),
+ "games": games,
+ "averages": avgs,
+ }
+