def import_players(self, player_index):
     while (player_index < len(self.lines)
            and len(self.lines[player_index].split(",")) > 1):
         info = self.lines[player_index].split(",")
         self.logger.debug(info, len(info))
         if len(info) < 3:
             raise InvalidField(payload={"details": "Missing a category"})
         name = info[self.name_index].strip()
         email = info[self.email_index].strip()
         gender = info[self.gender_index].strip()
         if not name.lower().startswith("ex."): 
             player = (DB.session.query(Player)
                         .filter(Player.email==email)).first()
             if player is None:
                 self.logger.debug(name + " " + email + " " + gender)
                 player = Player(name, email,gender=gender)
                 DB.session.add(player)
                 self.logger.debug("Player was created")
             else:
                 # this player is active
                 player.active = True
             self.team.players.append(player)
             if name == self.captain_name:
                 self.captain = player
         else:
             self.warnings.append("Player Example was left")
         player_index += 1
     return
Exemple #2
0
 def import_players(self, player_index):
     """Import a list of players"""
     while (player_index < len(self.lines)
            and len(self.lines[player_index].split(",")) > 1):
         info = self.lines[player_index].split(",")
         self.logger.debug(info, len(info))
         if len(info) < 3:
             raise InvalidField(payload={"details": "Missing a category"})
         name = info[self.name_index].strip()
         email = info[self.email_index].strip()
         gender = info[self.gender_index].strip()
         if not name.lower().startswith("ex."):
             player = (DB.session.query(Player).filter(
                 Player.email == email)).first()
             if player is None:
                 self.logger.debug(name + " " + email + " " + gender)
                 player = Player(name, email, gender=gender)
                 self.session.add(player)
                 self.logger.debug("Player was created")
             else:
                 # this player is active
                 player.active = True
             self.team.players.append(player)
             if name == self.captain_name:
                 self.captain = player
         else:
             self.warnings.append("Player Example was left")
         player_index += 1
     return
Exemple #3
0
    def add_team_functional(self):
        """ Add a team to the database using functions instead of methods"""
        # parse out the parts - background, header, players
        parts = parse_lines(self.lines)
        self.warnings = parts['warnings']

        # extract the background such a league, sponsor and color
        background = extract_background(parts['background'])

        # extract the players using the header as lookup
        lookup = extract_column_indices_lookup(parts['header'])
        players = extract_players(parts["players"], lookup)
        self.warnings = self.warnings + players['warnings']

        # add the players
        player_models = []
        for player_json in players['player_info']:
            try:
                if (player_json['player_id'] is None):
                    # need to create the player
                    player = Player(player_json['name'],
                                    player_json['email'],
                                    gender=player_json["gender"])
                    self.session.add(player)
                    self.session.commit()
                else:
                    email = player_json['email']
                    player = Player.query.filter(
                        func.lower(Player.email) == func.lower(email)).first()
                player_models.append(player.json())
            except Exception as error:
                player_info = "-".join(
                    [player_json["name"], player_json["email"]])
                self.warnings.append(
                    INVALID_PLAYER.format(player_info, str(error)))

        # get the team, create if does not exist
        if background['team']['team_id'] is None:
            team = Team(color=background['team']['color'],
                        sponsor_id=background['sponsor']['sponsor_id'],
                        league_id=background['league']['league_id'],
                        year=date.today().year)
            self.session.add(team)
        else:

            # get the team and remove all players
            team = Team.query.get(background['team']['team_id'])
            team.players = []
        set_captain = False
        for player in player_models:
            if (player["player_name"].lower() == background["captain"]
                ["player_name"].lower()):
                set_captain = True
                team.insert_player(player["player_id"], captain=True)
            else:
                team.insert_player(player["player_id"], captain=False)
        if not set_captain:
            self.warnings.append(CAPTAIN_NOT_ASSIGNED)
        self.session.commit()
 def post(self):
     """
         POST request for Player List
         Route: Routes['player']
         Parameters :
             player_name: The player's name (string)
             gender: a one letter character representing gender (string)
             email: the email of the player (string)
             password: the password of the player(string)
             active: 1 if player is active and 0 otherwise (int)
         Returns:
             if successful
                 status: 200
                 mimetype: application/json
                 data: the created player id (int)
             if email is duplicate
                 status: NUESC
                 mimetype: application/json
                 data: None
             if invalid field
                 status: IFSC
                 mimetype: application/json
                 data: None
             othwerwise
                 status: 404
                 mimetype: application/json
                 data: None
     """
     # create a new user
     args = post_parser.parse_args()
     gender = None
     player_name = None
     email = None
     password = "******"
     active = True
     if args['player_name']:
         player_name = args['player_name']
     if args['gender']:
         gender = args['gender']
     if args['email']:
         email = args['email']
     if args['password']:
         password = args['password']
     if args['active']:
         active = args['active'] == 1 if True else False
     player = Player(player_name, email, gender, password, active=active)
     DB.session.add(player)
     DB.session.commit()
     result = player.id
     handle_table_change(Tables.PLAYER, item=player.json())
     return Response(dumps(result), status=201, mimetype="application/json")
Exemple #5
0
def pull_players(url):
    """
    pull_players
        Returns a lookup of players that were pulled
        from the website into local DB
        Parameters:
            url: the url of the main site
        Returns:
            a dictionary lookup
                for the website sponsor id to local player object
                e.g. player_lookup = {1: Player(), etc..}
    """
    _players = requests.get(url + "/api/players").json()
    if isinstance(_players, dict):
        _players = pull_all_pages(url, _players)
    players_lookup = {}
    for player in tqdm(_players, desc="Pulling players from {}".format(url)):
        if (player['player_name'].lower() != "unassigned"):
            temp = Player(player['player_name'],
                          create_email(player['player_name']),
                          gender=player['gender'],
                          active=False)
            players_lookup[player['player_id']] = temp
            DB.session.add(temp)
    DB.session.commit()
    return players_lookup
def create_and_login():
    """Creates a player if they do not exist and login them in."""
    player_info = request.get_json(silent=True)
    player = Player.query.filter(
        Player.email == player_info.get('email')).first()
    if player is None:
        LOGGER.info(f"Adding player to league: {player_info}")
        player = Player(player_info.get("player_name", str(uuid.uuid1())),
                        player_info.get("email"),
                        gender=player_info.get("gender", "m"))
        DB.session.add(player)
        DB.session.commit()
    login_user(player)
    return Response(json.dumps(player.json()),
                    200,
                    mimetype='application/json')
def init_database(mock, create_db):
    """
    init_database
        Initialize the database either by mocking data or copying main
        website locally
        Parameters:
            mock: whether to mock some data for the current year
            create_db: True if database should be created
        Returns:
            None
    """
    if (create_db):
        create_fresh_tables()
        DB.session.add(Player("UNASSIGNED", UNASSIGNED_EMAIL, gender="F"))
        DB.session.commit()
    if (mock):
        print("Adding mock data ...")
        # add the unassigned bats player
        mock_fun_count()
        sponsor_lookup = mock_sponsors()
        league = mock_league()
        mock_teams_games(league, mock_division(), sponsor_lookup)
        mock_teams_games(league, mock_division(division="Tuesday & Thursday"),
                         sponsor_lookup)
    return
Exemple #8
0
 def testPlayerInit(self):
     player_name = str(uuid.uuid1())
     email = player_name + "@mlsb.ca"
     Player(player_name, email)
     Player(player_name, email, gender="m", password="******")
     # now bad stuff
     try:
         Player(1, email)
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
     try:
         Player(player_name, 1)
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
     try:
         some_email = str(uuid.uuid1()) + "@mlsb.ca"
         self.add_player(str(uuid.uuid1()), some_email)
         Player(str(uuid.uuid1()), some_email)
         self.assertEqual(False, True, "Should raise email exception")
     except NonUniqueEmail:
         pass
     try:
         Player(player_name, email, gender="XX")
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
Exemple #9
0
 def testPlayerInit(self):
     Player("Good Player", "*****@*****.**")
     Player("Good Player",
            "*****@*****.**",
            gender="m",
            password="******")
     # now bad stuff
     try:
         Player(1, "*****@*****.**")
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
     try:
         Player("Good Player", 1)
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
     try:
         self.add_player("first player", "*****@*****.**")
         Player("second player", "*****@*****.**")
         self.assertEqual(False, True, "Should raise email exception")
     except NonUniqueEmail:
         pass
     try:
         Player("Good Player", "*****@*****.**", gender="XX")
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
Exemple #10
0
def init_database(mock, copy_locally, url, create_db):
    """
    init_database
        Initialize the database either by mocking data or copying main
        website locally
        Parameters:
            mock: whether to mock some data for the current year
            copy_locally: whether to copy the main website locally
            url: the main website main url (https://www.mlsb.ca)
            create_db: True if database should be created
        Returns:
            None
    """
    if (create_db):
        create_fresh_tables()
        DB.session.add(Player("UNASSIGNED", UNASSIGNED_EMAIL, gender="F"))
        pull_fun_count(url)
        sponsor_lookup = pull_sponsors(url)
    if (mock):
        print("Adding mock data ...")
        # add the unassigned bats player
        league = mock_league()
        mock_teams_games(league, sponsor_lookup)
        league_2 = mock_league(league_name="Mock League 2")
        mock_teams_games(league_2, sponsor_lookup)
    else:
        if (copy_locally):
            print("Pulling a local copy of the given website")
            player_lookup = pull_players(url)
            league_lookup = pull_leagues(url)
            team_lookup = pull_teams(url, player_lookup, sponsor_lookup,
                                     league_lookup)
            game_lookup = pull_games(url, team_lookup, league_lookup)
            pull_bats(url, team_lookup, player_lookup, game_lookup)
            pull_espys(url, team_lookup, sponsor_lookup)
    return
Exemple #11
0
 def testPlayerUpdate(self):
     p1 =  Player("Good Player", "*****@*****.**")
     p1.update(name="new name",
               email="*****@*****.**",
               gender="f",
               password="******")
     # now bad stuff
     try:
         p1.update(name=1, email="*****@*****.**")
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
     try:
         p1.update(name="Good Player", email=1)
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
     try:
         p2 = Player("first player", "*****@*****.**")
         DB.session.add(p2)
         DB.session.commit()
         p1.update(name="second player", email="*****@*****.**")
         self.assertEqual(False, True, "Should raise email exception")
     except NonUniqueEmail:
         pass
     try:
         p1.update(name="Good Player", email="*****@*****.**", gender="XX")
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
Exemple #12
0
def mock_teams_games(league, sponsor_lookup):
    """
    mock_team_games
        Mocks up some data for the league by add some players to a team,
        then a few games to the league and a few scores for some games
        Parameters:
            league: the league object
            sponsor_lookup: a dictionary lookup for a id to its given sponsor
        Returns:
            None
    """
    # add some players
    domain = "@" + league.name.replace(" ", "")
    team_one_players = [
        Player("Captain1", "captain1" + domain, gender="M"),
        Player("MalePlayer1", "mp1" + domain, gender="M"),
        Player("FemalePlayer1", "fp1" + domain, gender="F")
    ]
    team_two_players = [
        Player("Captain2", "captain2" + domain, gender="F"),
        Player("MalePlayer2", "mp2" + domain, gender="M"),
        Player("FemalePlayer2", "fp2" + domain, gender="F")
    ]
    team_three_players = [
        Player("Captain3", "captain3" + domain, gender="M"),
        Player("MalePlayer3", "mp3" + domain, gender="M"),
        Player("FemalePlayer3", "fp3" + domain, gender="F")
    ]
    team_four_players = [
        Player("Captain4", "captain4" + domain, gender="F"),
        Player("MalePlayer4", "mp4" + domain, gender="M"),
        Player("FemalePlayer4", "fp4" + domain, gender="F")
    ]
    team_players = [
        team_one_players, team_two_players, team_three_players,
        team_four_players
    ]
    for team in tqdm(team_players, desc="Adding mock Players"):
        for player in team:
            DB.session.add(player)
    DB.session.commit()

    # add four teams with some players
    teams = [
        Team(color="Black",
             sponsor_id=random_value_lookup(sponsor_lookup).id,
             league_id=league.id),
        Team(color="Blue",
             sponsor_id=random_value_lookup(sponsor_lookup).id,
             league_id=league.id),
        Team(color="Red",
             sponsor_id=random_value_lookup(sponsor_lookup).id,
             league_id=league.id),
        Team(color="Green",
             sponsor_id=random_value_lookup(sponsor_lookup).id,
             league_id=league.id)
    ]
    for i in tqdm(range(0, len(teams)), desc="Adding mock players to Teams"):
        team = teams[i]
        DB.session.add(team)
        # add the players to the team
        for player in team_players[i]:
            team.insert_player(player.id, "captain" in player.name.lower())
    DB.session.commit()

    # add some random espsy to each team and
    # create a lookup for team id to players
    team_player_lookup = {}
    random_prices = [9.99, 4.75, 100, 15.50, 12.99]
    for i in tqdm(range(0, len(teams)), desc="Adding mock espys to Teams"):
        team_player_lookup[team.id] = team_players[i]
        team = teams[i]
        for __ in range(0, 4):
            points = random_value_list(random_prices)
            espy = Espys(team.id,
                         sponsor_id=random_value_lookup(sponsor_lookup).id,
                         description="Purchase",
                         points=points)
            DB.session.add(espy)
    DB.session.commit()

    # add some games between the teams
    # need a bunch of games
    today = datetime.date.today()
    games = []
    for day in range(-3, 3):
        date_string = (today +
                       datetime.timedelta(days=day)).strftime("%Y-%m-%d")
        status = "Completed" if day < 0 else "To Be Played"
        games.append(
            Game(date_string,
                 "10:00",
                 teams[0].id,
                 teams[1].id,
                 league.id,
                 status=status,
                 field="WP1"))
        games.append(
            Game(date_string,
                 "10:00",
                 teams[2].id,
                 teams[3].id,
                 league.id,
                 status=status,
                 field="WP2"))
        games.append(
            Game(date_string,
                 "11:00",
                 teams[0].id,
                 teams[2].id,
                 league.id,
                 status=status,
                 field="WP1"))
        games.append(
            Game(date_string,
                 "11:00",
                 teams[2].id,
                 teams[1].id,
                 league.id,
                 status=status,
                 field="WP2"))
        games.append(
            Game(date_string,
                 "12:00",
                 teams[0].id,
                 teams[3].id,
                 league.id,
                 status=status,
                 field="WP1"))
        games.append(
            Game(date_string,
                 "12:00",
                 teams[2].id,
                 teams[1].id,
                 league.id,
                 status=status,
                 field="WP2"))
    for game in tqdm(games, "Adding mock games"):
        DB.session.add(game)
    DB.session.commit()

    # now add a random score to the game
    for game in tqdm(games[:18], desc="Mocking scores for games"):
        add_random_score(game.id, game.away_team_id,
                         team_player_lookup[game.away_team_id])
        add_random_score(game.id, game.home_team_id,
                         team_player_lookup[game.home_team_id])
    DB.session.commit()
Exemple #13
0
 def testPlayerUpdate(self):
     player_name = str(uuid.uuid1())
     email = player_name + "@mlsb.ca"
     new_player_name = str(uuid.uuid1())
     new_email = new_player_name + "@mlsb.ca"
     p1 = Player(player_name, email)
     p1.update(name=new_player_name,
               email=new_email,
               gender="f",
               password="******")
     # now bad stuff
     try:
         p1.update(name=1, email=email)
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
     try:
         p1.update(name=player_name, email=1)
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
     try:
         some_email = str(uuid.uuid1()) + "@mlsb.ca"
         self.add_player(str(uuid.uuid1()), some_email)
         p1.update(name=str(uuid.uuid1()), email=some_email)
         self.assertEqual(False, True, "Should raise email exception")
     except NonUniqueEmail:
         pass
     try:
         p1.update(name=player_name, email=email, gender="XX")
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
Exemple #14
0
 def testPlayerUpdate(self):
     p1 = Player("Good Player", "*****@*****.**")
     p1.update(name="new name",
               email="*****@*****.**",
               gender="f",
               password="******")
     # now bad stuff
     try:
         p1.update(name=1, email="*****@*****.**")
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
     try:
         p1.update(name="Good Player", email=1)
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass
     try:
         self.add_player("first player", "*****@*****.**")
         p1.update(name="second player", email="*****@*****.**")
         self.assertEqual(False, True, "Should raise email exception")
     except NonUniqueEmail:
         pass
     try:
         p1.update(name="Good Player", email="*****@*****.**", gender="XX")
         self.assertEqual(False, True, "Should raise invalid field")
     except InvalidField:
         pass