def make_newgame(self, players, mrx_pos, code="code"): if type(players) != list or len(players) < 2: return {"status": "fail", "msg": "Not enough players"} mrx_username = players[int(mrx_pos)] try: game = Game(status="mrx_active", code=code, start=datetime.now(), duration=timedelta(hours=2, minutes=30)) cherrypy.request.db.add(game) #create roles for player in players: users = cherrypy.request.db.query(User).filter(User.username == player).all() if len(users) > 1: raise cherrypy.HTTPError(500, "more than one user with given username") elif len(users) == 0: # cherrypy.request.db.rollback() return {"status":"fail", "msg":"No user found %s" % player} else: user = users[0] active_games = cherrypy.request.db.query(Game).join(Game.roles).filter( Game.status == "active").filter(Role.user_id == user.id).all() if len(active_games) > 0: # cherrypy.request.db.rollback() return {"status":"fail", "msg":"User %s already has active game" % player} if player == mrx_username: role_name = "mrx" else: role_name = "detective" role = Role(user_id=user.id, game=game, role=role_name) cherrypy.request.db.add(role) #create tasks photo_points = cherrypy.request.db.query(Point).all() for point in photo_points: mrx_task = Task(game=game, status="pending") det_task = Task(game=game, status="unavailable") real_center = LatLon(Latitude(point.lat), Longitude(point.lng)) offset = GeoVector(initial_heading=random.randint(0,360), distance=random.randint(0,point.radius)/1000.0) print offset task_center = real_center + offset crime = Crime( game_id=game.id, point_id=point.id, center_lat=task_center.lat.decimal_degree, center_lng=task_center.lon.decimal_degree, radius=point.radius, status="not_commited", mrx_task=mrx_task, det_task=det_task ) mrx_task.crime = crime det_task.crime = crime cherrypy.request.db.add(mrx_task) cherrypy.request.db.add(det_task) cherrypy.request.db.add(crime) cherrypy.request.db.commit() return {"status": "success"} except Exception: cherrypy.request.db.rollback() raise