]> de.git.xonotic.org Git - xonotic/xonstat.git/blobdiff - xonstat/views/player.py
Python 2.6.x doesn't have total_seconds().
[xonotic/xonstat.git] / xonstat / views / player.py
index 9eaf218f20026eb89a567ba03450f88abd727920..b1fbd5d8ca643ef2f84613fc345dbace2126000f 100644 (file)
@@ -15,7 +15,7 @@ from xonstat.util import page_url
 log = logging.getLogger(__name__)
 
 
-def _player_index_data(request):
+def player_index_data(request):
     if request.params.has_key('page'):
         current_page = request.params['page']
     else:
@@ -42,7 +42,7 @@ def player_index(request):
     """
     Provides a list of all the current players.
     """
-    return _player_index_data(request)
+    return player_index_data(request)
 
 
 def player_index_json(request):
@@ -121,23 +121,46 @@ def _get_fav_map(player_id):
     as the map that he or she has played the most in the past 
     90 days.
 
-    Returns a map object.
+    Returns a dictionary with keys for the map's name and id.
     """
     # 90 day window
     back_then = datetime.datetime.utcnow() - datetime.timedelta(days=90)
 
-    fav_map = DBSession.query(Map).\
+    raw_fav_map = DBSession.query(Map.name, Map.map_id).\
             filter(Game.game_id == PlayerGameStat.game_id).\
             filter(Game.map_id == Map.map_id).\
             filter(PlayerGameStat.player_id == player_id).\
             filter(PlayerGameStat.create_dt > back_then).\
-            group_by(Map.map_id).\
+            group_by(Map.name, Map.map_id).\
             order_by(func.count().desc()).\
             limit(1).one()
 
+    fav_map = {}
+    fav_map['name'] = raw_fav_map[0]
+    fav_map['id'] = raw_fav_map[1]
+
     return fav_map
 
 
+def _get_rank(player_id):
+    """
+    Get the player's rank as well as the total number of ranks.
+    """
+    rank = DBSession.query("game_type_cd", "rank", "max_rank").\
+            from_statement(
+                "select pr.game_type_cd, pr.rank, overall.max_rank "
+                "from player_ranks pr,  "
+                   "(select game_type_cd, max(rank) max_rank "
+                    "from player_ranks  "
+                    "group by game_type_cd) overall "
+                "where pr.game_type_cd = overall.game_type_cd  "
+                "and player_id = :player_id "
+                "order by rank").\
+            params(player_id=player_id).all()
+
+    return rank;
+
+
 def get_accuracy_stats(player_id, weapon_cd, games):
     """
     Provides accuracy for weapon_cd by player_id for the past N games.
@@ -219,7 +242,7 @@ def get_damage_stats(player_id, weapon_cd, games):
     return (avg, dmgs)
 
 
-def _player_info_data(request):
+def player_info_data(request):
     player_id = int(request.matchdict['id'])
     if player_id <= 2:
         player_id = -1;
@@ -235,7 +258,10 @@ def _player_info_data(request):
         (total_games, games_breakdown) = _get_games_played(player.player_id)
 
         # favorite map from the past 90 days
-        fav_map = _get_fav_map(player.player_id)
+        try:
+            fav_map = _get_fav_map(player.player_id)
+        except:
+            fav_map = None
 
         # friendly display of elo information and preliminary status
         elos = DBSession.query(PlayerElo).filter_by(player_id=player_id).\
@@ -252,6 +278,12 @@ def _player_info_data(request):
             elos_display.append(str.format(round(elo.elo, 3),
                 elo.game_type_cd))
 
+        # get current rank information
+        ranks = _get_rank(player_id)
+        ranks_display = ', '.join(["{1} of {2} ({0})".format(gtc, rank,
+            max_rank) for gtc, rank, max_rank in ranks])
+
+
         # which weapons have been used in the past 90 days
         # and also, used in 5 games or more?
         back_then = datetime.datetime.utcnow() - datetime.timedelta(days=90)
@@ -281,6 +313,7 @@ def _player_info_data(request):
         games_breakdown = None
         recent_weapons = []
         fav_map = None
+        ranks_display = None;
 
     return {'player':player,
             'elos_display':elos_display,
@@ -290,6 +323,7 @@ def _player_info_data(request):
             'games_breakdown':games_breakdown,
             'recent_weapons':recent_weapons,
             'fav_map':fav_map,
+            'ranks_display':ranks_display,
             }
 
 
@@ -297,7 +331,7 @@ def player_info(request):
     """
     Provides detailed information on a specific player
     """
-    return _player_info_data(request)
+    return player_info_data(request)
 
 
 def player_info_json(request):
@@ -307,7 +341,7 @@ def player_info_json(request):
     return [{'status':'not implemented'}]
 
 
-def _player_game_index_data(request):
+def player_game_index_data(request):
     player_id = request.matchdict['player_id']
 
     if request.params.has_key('page'):
@@ -347,7 +381,7 @@ def player_game_index(request):
     player was involved. This is ordered by game_id, with
     the most recent game_ids first. Paginated.
     """
-    return _player_game_index_data(request)
+    return player_game_index_data(request)
 
 
 def player_game_index_json(request):
@@ -359,7 +393,7 @@ def player_game_index_json(request):
     return [{'status':'not implemented'}]
 
 
-def _player_accuracy_data(request):
+def player_accuracy_data(request):
     player_id = request.matchdict['id']
     allowed_weapons = ['nex', 'rifle', 'shotgun', 'uzi', 'minstanex']
     weapon_cd = 'nex'
@@ -400,7 +434,7 @@ def player_accuracy(request):
     """
     Provides the accuracy for the given weapon. (JSON only)
     """
-    return _player_accuracy_data(request)
+    return player_accuracy_data(request)
 
 
 def player_accuracy_json(request):
@@ -412,10 +446,10 @@ def player_accuracy_json(request):
                 'shotgun', 'uzi', and 'minstanex'.
        games = over how many games to display accuracy. Can be up to 50.
     """
-    return _player_accuracy_data(request)
+    return player_accuracy_data(request)
 
 
-def _player_damage_data(request):
+def player_damage_data(request):
     player_id = request.matchdict['id']
     allowed_weapons = ['grenadelauncher', 'electro', 'crylink', 'hagar',
             'rocketlauncher', 'laser']
@@ -463,4 +497,4 @@ def player_damage_json(request):
          'laser'.
        games = over how many games to display damage. Can be up to 50.
     """
-    return _player_damage_data(request)
+    return player_damage_data(request)