]> de.git.xonotic.org Git - xonotic/xonstat.git/blobdiff - xonstat/views/submission.py
Fix partitioned table error. Change to new registry view.
[xonotic/xonstat.git] / xonstat / views / submission.py
index 74466edb4ebfcdb13787294c672ac2d4cf066d05..96bd85e3ec41e8427d58ad3058b8534ab73d4239 100755 (executable)
@@ -1,9 +1,10 @@
 import datetime\r
 import logging\r
 import datetime\r
 import logging\r
+import pyramid.httpexceptions\r
 import re\r
 import time\r
 import re\r
 import time\r
-from pyramid.config import get_current_registry\r
 from pyramid.response import Response\r
 from pyramid.response import Response\r
+from sqlalchemy import Sequence\r
 from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound\r
 from xonstat.d0_blind_id import d0_blind_id_verify\r
 from xonstat.models import *\r
 from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound\r
 from xonstat.d0_blind_id import d0_blind_id_verify\r
 from xonstat.models import *\r
@@ -22,17 +23,21 @@ def is_supported_gametype(gametype):
 \r
 \r
 def verify_request(request):\r
 \r
 \r
 def verify_request(request):\r
-    (idfp, status) = d0_blind_id_verify(\r
-            sig=request.headers['X-D0-Blind-Id-Detached-Signature'],\r
-            querystring='',\r
-            postdata=request.body)\r
+    try:\r
+        (idfp, status) = d0_blind_id_verify(\r
+                sig=request.headers['X-D0-Blind-Id-Detached-Signature'],\r
+                querystring='',\r
+                postdata=request.body)\r
 \r
 \r
-    log.debug('\nidfp: {0}\nstatus: {1}'.format(idfp, status))\r
+        log.debug('\nidfp: {0}\nstatus: {1}'.format(idfp, status))\r
+    except: \r
+        idfp = None\r
+        status = None\r
 \r
     return (idfp, status)\r
 \r
 \r
 \r
     return (idfp, status)\r
 \r
 \r
-def has_minimum_real_players(player_events):\r
+def has_minimum_real_players(settings, player_events):\r
     """\r
     Determines if the collection of player events has enough "real" players\r
     to store in the database. The minimum setting comes from the config file\r
     """\r
     Determines if the collection of player events has enough "real" players\r
     to store in the database. The minimum setting comes from the config file\r
@@ -40,7 +45,6 @@ def has_minimum_real_players(player_events):
     """\r
     flg_has_min_real_players = True\r
 \r
     """\r
     flg_has_min_real_players = True\r
 \r
-    settings = get_current_registry().settings\r
     try: \r
         minimum_required_players = int(\r
                 settings['xonstat.minimum_required_players'])\r
     try: \r
         minimum_required_players = int(\r
                 settings['xonstat.minimum_required_players'])\r
@@ -202,11 +206,11 @@ def create_game(session=None, start_dt=None, game_type_cd=None,
     map_id - map on which the game was played\r
     winner - the team id of the team that won\r
     """\r
     map_id - map on which the game was played\r
     winner - the team id of the team that won\r
     """\r
-\r
-    game = Game(start_dt=start_dt, game_type_cd=game_type_cd,\r
+    seq = Sequence('games_game_id_seq')\r
+    game_id = session.execute(seq)\r
+    game = Game(game_id=game_id, start_dt=start_dt, game_type_cd=game_type_cd,\r
                 server_id=server_id, map_id=map_id, winner=winner)\r
     session.add(game)\r
                 server_id=server_id, map_id=map_id, winner=winner)\r
     session.add(game)\r
-    session.flush()\r
     log.debug("Created game id {0} on server {1}, map {2} at \\r
             {3}".format(game.game_id, \r
                 server_id, map_id, start_dt))\r
     log.debug("Created game id {0} on server {1}, map {2} at \\r
             {3}".format(game.game_id, \r
                 server_id, map_id, start_dt))\r
@@ -273,7 +277,10 @@ def create_player_game_stat(session=None, player=None,
     # in here setup default values (e.g. if game type is CTF then\r
     # set kills=0, score=0, captures=0, pickups=0, fckills=0, etc\r
     # TODO: use game's create date here instead of now()\r
     # in here setup default values (e.g. if game type is CTF then\r
     # set kills=0, score=0, captures=0, pickups=0, fckills=0, etc\r
     # TODO: use game's create date here instead of now()\r
-    pgstat = PlayerGameStat(create_dt=datetime.datetime.now())\r
+    seq = Sequence('player_game_stats_player_game_stat_id_seq')\r
+    pgstat_id = session.execute(seq)\r
+    pgstat = PlayerGameStat(player_game_stat_id=pgstat_id, \r
+            create_dt=datetime.datetime.now())\r
 \r
     # set player id from player record\r
     pgstat.player_id = player.player_id\r
 \r
     # set player id from player record\r
     pgstat.player_id = player.player_id\r
@@ -330,7 +337,6 @@ def create_player_game_stat(session=None, player=None,
         session.add(game)\r
 \r
     session.add(pgstat)\r
         session.add(game)\r
 \r
     session.add(pgstat)\r
-    session.flush()\r
 \r
     return pgstat\r
 \r
 \r
     return pgstat\r
 \r
@@ -354,7 +360,10 @@ def create_player_weapon_stats(session=None, player=None,
         matched = re.search("acc-(.*?)-cnt-fired", key)\r
         if matched:\r
             weapon_cd = matched.group(1)\r
         matched = re.search("acc-(.*?)-cnt-fired", key)\r
         if matched:\r
             weapon_cd = matched.group(1)\r
+            seq = Sequence('player_weapon_stats_player_weapon_stats_id_seq')\r
+            pwstat_id = session.execute(seq)\r
             pwstat = PlayerWeaponStat()\r
             pwstat = PlayerWeaponStat()\r
+            pwstat.player_weapon_stats_id = pwstat_id\r
             pwstat.player_id = player.player_id\r
             pwstat.game_id = game.game_id\r
             pwstat.player_game_stat_id = pgstat.player_game_stat_id\r
             pwstat.player_id = player.player_id\r
             pwstat.game_id = game.game_id\r
             pwstat.player_game_stat_id = pgstat.player_game_stat_id\r
@@ -381,7 +390,9 @@ def create_player_weapon_stats(session=None, player=None,
                 pwstat.frags = int(round(float(\r
                         player_events['acc-' + weapon_cd + '-frags'])))\r
 \r
                 pwstat.frags = int(round(float(\r
                         player_events['acc-' + weapon_cd + '-frags'])))\r
 \r
+            log.debug(pwstat)\r
             session.add(pwstat)\r
             session.add(pwstat)\r
+            log.debug(pwstat)\r
             pwstats.append(pwstat)\r
 \r
     return pwstats\r
             pwstats.append(pwstat)\r
 \r
     return pwstats\r
@@ -464,33 +475,36 @@ def stats_submit(request):
 \r
         (idfp, status) = verify_request(request)\r
         if not idfp:\r
 \r
         (idfp, status) = verify_request(request)\r
         if not idfp:\r
-            raise Exception("Request is not verified.")\r
-\r
+            raise pyramid.httpexceptions.HTTPUnauthorized\r
+     \r
         (game_meta, players) = parse_body(request)  \r
         (game_meta, players) = parse_body(request)  \r
-    \r
+     \r
         if not has_required_metadata(game_meta):\r
         if not has_required_metadata(game_meta):\r
-            log.debug("Required game meta fields (T, G, M, or S) missing. "\\r
+            log.debug("Required game meta fields missing. "\\r
                     "Can't continue.")\r
                     "Can't continue.")\r
-            raise Exception("Required game meta fields (T, G, M, or S) missing.")\r
-   \r
+            raise pyramid.exceptions.HTTPUnprocessableEntity\r
+     \r
         if not is_supported_gametype(game_meta['G']):\r
         if not is_supported_gametype(game_meta['G']):\r
-            raise Exception("Gametype not supported.")\r
+            raise pyramid.httpexceptions.HTTPOk\r
+     \r
+        if not has_minimum_real_players(request.registry.settings, players):\r
+            log.debug("The number of real players is below the minimum. " + \r
+                "Stats will be ignored.")\r
+            raise pyramid.httpexceptions.HTTPOk\r
      \r
      \r
-        if not has_minimum_real_players(players):\r
-            raise Exception("The number of real players is below the minimum. "\\r
-                    "Stats will be ignored.")\r
-\r
         server = get_or_create_server(session=session, hashkey=idfp, \r
                 name=game_meta['S'])\r
         server = get_or_create_server(session=session, hashkey=idfp, \r
                 name=game_meta['S'])\r
-\r
+     \r
         gmap = get_or_create_map(session=session, name=game_meta['M'])\r
         gmap = get_or_create_map(session=session, name=game_meta['M'])\r
-\r
+        log.debug(gmap)\r
+     \r
         game = create_game(session=session, \r
                 start_dt=datetime.datetime(\r
                     *time.gmtime(float(game_meta['T']))[:6]), \r
                 server_id=server.server_id, game_type_cd=game_meta['G'], \r
         game = create_game(session=session, \r
                 start_dt=datetime.datetime(\r
                     *time.gmtime(float(game_meta['T']))[:6]), \r
                 server_id=server.server_id, game_type_cd=game_meta['G'], \r
-                map_id=gmap.map_id)\r
-    \r
+                   map_id=gmap.map_id)\r
+        log.debug(gmap)\r
+     \r
         # find or create a record for each player\r
         # and add stats for each if they were present at the end\r
         # of the game\r
         # find or create a record for each player\r
         # and add stats for each if they were present at the end\r
         # of the game\r
@@ -499,15 +513,15 @@ def stats_submit(request):
                 nick = player_events['n']\r
             else:\r
                 nick = None\r
                 nick = player_events['n']\r
             else:\r
                 nick = None\r
-\r
\r
             if 'matches' in player_events and 'scoreboardvalid' \\r
             if 'matches' in player_events and 'scoreboardvalid' \\r
-                    in player_events:\r
+                in player_events:\r
                 player = get_or_create_player(session=session, \r
                     hashkey=player_events['P'], nick=nick)\r
                 log.debug('Creating stats for %s' % player_events['P'])\r
                 create_player_stats(session=session, player=player, game=game, \r
                         player_events=player_events)\r
                 player = get_or_create_player(session=session, \r
                     hashkey=player_events['P'], nick=nick)\r
                 log.debug('Creating stats for %s' % player_events['P'])\r
                 create_player_stats(session=session, player=player, game=game, \r
                         player_events=player_events)\r
-    \r
+     \r
         session.commit()\r
         log.debug('Success! Stats recorded.')\r
         return Response('200 OK')\r
         session.commit()\r
         log.debug('Success! Stats recorded.')\r
         return Response('200 OK')\r