def player(player_id): ''' Yksittäisen pelaajan tiedot. Käyttäjä voi lisätä/poistaa pelaajan seurattavien pelaajien listasta. ''' all_players = fetch_from_api("/api/json/players") if not player_id in all_players: abort(400) all_seasons = fetch_from_api("/api/json/players/%s" % player_id) if not all_seasons: # TODO all_seasons voi olla None tai tyhjä tietorakenne; # jälkimmäisessä tapauksessa pelaaja ei ole pelannut yhtään ottelua, # tulee käsitellä! abort(400) season_games = fetch_from_api( "/api/json/games?pid=%s&year=2012" % player_id) name = all_players[str(player_id)]['name'] position = all_players[str(player_id)]['pos'].lower() team = all_players[str(player_id)]['team'] this_season = all_seasons['2012'] career = all_seasons['career'] del all_seasons['career'] # Poistetaan pelaaja-lista-dictionary -rakenteesta yksi dictionary-taso, # jotta Jinja template-engine osaa loopata tietorakenteen läpi ilman ongelmaa. career_list = [] for k, v in all_seasons.iteritems(): new_dict = v new_dict['year'] = k career_list.append(new_dict) # Järjestetään pelaajalista career_list = sorted(career_list, key=lambda x: x["year"], reverse=False) return render_template( "player.html", name=name, team=team, this_season=this_season, all_seasons=career_list, position=position, career=career, games=season_games, pid=player_id)
def standings(year): """ Sarjataulukko joka sisältää kaikkien joukkueiden nykyisen kauden tilastot. Järjestetty pisteiden mukaan, divisioonittain. """ stats = fetch_from_api("/api/json/teams?&year=%s" % year) if not stats: abort(400) teams_dict = {} # Dict, jossa avaimena on divisioona ja arvona joukkue teams = sorted( # Järjestetään joukkueet listaan pts:n mukaan stats.iteritems(), key=lambda (k, v): v["pts"], reverse=True) # Järjestetään joukkueet divisioonittain for k, v in teams: div = v["div"] v["team"] = k if not div in teams_dict: teams_dict[div] = [v] else: teams_dict[div].append(v) return render_template("standings.html", teams=teams_dict, year=str(year))
def team(team): """ Yksittäisen joukkueen tiedot. """ logging.info("Haetaan joukkueen %s tiedot" % team) stats = fetch_from_api("/api/json/teams?team=%s" % team) if not stats: abort(400) games = fetch_from_api("/api/json/games?team=" + team) #Haetaan joukkueen pelaajat: all_skaters = fetch_from_api("/api/json/top?goalies=0&limit=1000") all_goalies = fetch_from_api("/api/json/top?goalies=1&limit=1000") team_skaters = [skater for skater in all_skaters if skater["team"] == team] team_goalies = [goalie for goalie in all_goalies if goalie["team"] == team] return render_template( "team.html", team=team, stats=stats, skaters=team_skaters, goalies=team_goalies, games=games)
def top(): """ Kauden parhaiden pelaajien lista. Url-parametrit: year: määrittää kauden, oletuksena nykyinen kausi. sort: määrittää järjestyksen, vaihtoehdot ovat - pelaajilla name, team, gp, g, a, pts, +/-, pim, hits, bks, fw, fl, fo%, ppg, ppa, shg, sha, gw, sog, pct (oletuksena pts) - maalivahdeilla name, team, gp, gs, min, w, l, otl, ega, ga, gaa, sa, sv, sv%, so (oletuksena w) goalies: (0 tai 1) määrittää haetaanko maalivahteja, oletuksena ei. playoffs: (0 tai 1) playoffit vai runkosarja, oletuksena runkosarja. reverse: (0 tai 1) määrittää järjestyksen suunnan, oletuksena reverse=1, eli suurin arvo ensin. limit: määrittää tulosten maksimimäärän, oletuksena 30. """ year = request.args.get("year", "2012") goalies = request.args.get("goalies", "0") playoffs = request.args.get("playoffs", "0") reverse = request.args.get("reverse", "1") limit = request.args.get("limit", "30") default_sort = "w" if goalies == "1" else "pts" sort = request.args.get("sort", default_sort) goalie_sorts = ["gs", "min", "w", "l", "otl", "ega", "ga", "gaa", "sa", "sv", "sv%", "so"] if goalies == "1": if sort not in ["name", "team", "gp"] + goalie_sorts: sort = "w" elif sort in goalie_sorts: sort = "pts" params = dict(year=year, sort=sort, goalies=goalies, playoffs=playoffs, reverse=reverse, limit=limit) players = fetch_from_api("/api/json/top?" + urllib.urlencode(params)) if not players: abort(400) return render_template( "top.html", players=players, year=year, playoffs=playoffs, goalies=goalies, reverse=reverse, sort=sort, limit=limit)
def game(game_id): ''' Yksittäisen ottelun tiedot. ''' logging.info("Haetaan pelin %s tiedot" % game_id) game = fetch_from_api("/api/json/games/%s" % game_id) if not game: abort(400) # Lisätään dictionaryyn eräkohtaisesti listat maaleista: goals_dict = {i: [] for i in range(1, 5)} for goal in game["goals"]: period = goal["period"] goals_dict[period].append(goal) # Lajitellaan pelaajat joukkueittain listoihin: players = dict(home_skaters=[], away_skaters=[], home_goalies=[], away_goalies=[]) for position in ["skaters", "goalies"]: for k, v in game[position].iteritems(): v["pid"] = k key = v["team"] + "_" + position players[key].append(v) # Järjestetään pelaajalistat sukunimen perusteella: sort_func = lambda x: x["name"].split()[-1] for k, v in players.iteritems(): players[k] = sorted(v, key=sort_func) # Selvitetään pelaajatilastojen sarakkeet (voivat vaihdella): skater_cols = game["skaters"].values()[0].keys() goalie_cols = game["goalies"].values()[0].keys() sorted_skater_cols, sorted_goalie_cols = [], [] for col in SKATER_COLS: if col.lower() in skater_cols: sorted_skater_cols.append(col) for col in GOALIE_COLS: if col.lower() in goalie_cols: sorted_goalie_cols.append(col) return render_template( "game.html", gid=game_id, game=game, goals=goals_dict, players=players, skater_cols=sorted_skater_cols, goalie_cols=sorted_goalie_cols)
def player_search(): ''' Pelaajahaku. Jos hakuehtoa ei ole määritelty, esim. "/player?q=teemu", näytetään pelkkä hakukenttä. Muuten näytetään hakukentän alla API:n palauttama lista hakuehtoa vastaavista pelaajista. ''' query = request.args.get('q') if query: logging.info("*****" + str(query)) logging.info("Haetaan pelaajia hakuehdolla: %s" % query) players = fetch_from_api("/api/json/players?query=%s" % query) return render_template( "player_search.html", players=players, query=query) else: return render_template("player_search.html")