def update_all_players_specified_season(self, season: int = 2020): # delete all players in current season 2019: self.db["players"].delete_many({"season": season}) # scrape new players info in specified season players = scraper.scrape_players(season) for player in players: self.post_player(player)
def update_all_players_all_seasons(self): # delete all players in endpoint and re-update every players # costly, since perform unncessary updates on past players whose stats stay the same no matter what self.delete_all_players_seasons() for i in range(2015, 2021): print(f"Updating for season {i}") playerList = scraper.scrape_players(i) for player in playerList: self.post_player(player)
def search_players(): """ Palauttaa listan pelaajista, joiden nimi vastaa hakuehtoa. Tyhjä hakuehto palauttaa kaikki pelaajat. """ query = request.args.get('query', '') # TODO queryn validointi? Onko tarpeen? try: data = scraper.scrape_players(query) except Exception as e: logging.error(e) abort(404) return jsonify(data)
def user(): """ Hakee, lisää ja poistaa käyttäjän seuraamia pelaajia/joukkueita. Vaatii OAuth-allekirjoitetun pyynnön. TODO välimuisti """ # Poimitaan oauth token HTTP-pyynnön Authorization-headerista: auth_header = request.headers.get("Authorization", None) if not auth_header: abort(401) # Unauthorized for param in auth_header.split(): if param.startswith("oauth_token"): token = param.split("=")[-1][1:-2] break if not token: abort(401) # Haetaan tokenia vastaava käyttäjä: try: acc_token = AccessToken.query(AccessToken.token == token).get() user = acc_token.resource_owner.get() except KeyError: # Access tokenia tai käyttäjää ei löydy abort(401) # Poimitaan ids_only-parametri joko urlista tai post-parametreista: if "ids_only" in request.form: ids_only = request.form["ids_only"] else: ids_only = request.args.get("ids_only", "0") try: ids_only = int(ids_only) except ValueError: abort(400) if request.method == "GET": # Palautetaan käyttäjän seuraamat pelaajat ja joukkueet: if ids_only: # Palautetaan vain id:t: ret = dict(players=user.players, teams=user.teams) else: # Jos ids_only == 1, palautetaan tunnusten lisäksi tilastoja: ret = get_players_and_teams(user.players, user.teams) ret["name"] = user.name return jsonify(ret) if request.method == "POST": # Lisätään seurattava pelaaja tai joukkue: if "pid" in request.form: pid = request.form["pid"] # Validoitaan pelaajan id: if pid in user.players: abort(400) # Pelaaja on jo seurattavien listassa all_players = scraper.scrape_players() if not pid in all_players: abort(400) # pid:tä vastaavaa pelaajaa ei löydy # Lisätään pid käyttäjän seurattavien pelaajien listalle: user.players.append(pid) user.put() # Palautetaan päivittynyt seurantalista, kuten GET-pyynnössä: if ids_only: ret = dict(players=user.players, teams=user.teams) else: ret = get_players_and_teams(user.players, user.teams) ret["name"] = user.name return jsonify(ret) if "team" in request.form: team = request.form["team"].lower() # Validoitaan joukkueen tunnus if team in user.teams: abort(400) # Joukkue on jo seurattavien listassa if not team in scraper.TEAMS: abort(400) # Epäkelpo joukkueen tunnus # Lisätään joukkue käyttäjän seurattavien joukkueiden listalle: user.teams.append(team) user.put() # Palautetaan päivittynyt seurantalista, kuten GET-pyynnössä: if ids_only: ret = dict(players=user.players, teams=user.teams) else: ret = get_players_and_teams(user.players, user.teams) ret["name"] = user.name return jsonify(ret) else: abort(400) # Lisättävä pelaaja tai joukkue tulee määrittää if request.method == "DELETE": # Poistetaan seurattava pelaaja tai joukkue: pid = request.args.get("pid", None) team = request.args.get("team", None) if pid: if not pid in user.players: abort(400) # pelaajaa ei löydy seurattavien listasta user.players.remove(pid) elif team: if not team in user.teams: abort(400) # joukkuetta ei löydy seurattavien listasta user.teams.remove(team) else: abort(400) # joko poistettava pelaaja tai joukkue tulee määrittää user.put() if ids_only: ret = dict(players=user.players, teams=user.teams) else: ret = get_players_and_teams(user.players, user.teams) ret["name"] = user.name return jsonify(ret)
# -*- coding: utf-8 -*- """ The top-level module is run in order to collect data and ensure they remain up to date for the project's MongoDB database. @author: Darren Vong """ import sys from scraper import scrape_players from db_updater import insert_players, enforce_injective_name_mapping, update_heroku_db from views.helpers import connect client, col = connect() try: players_list = scrape_players() except: sys.exit(1) else: insert_players(col, players_list) enforce_injective_name_mapping(col) finally: client.close() # update_heroku_db(client)