def get(self, week): week = int(week) data = [] for g in games.games_for_week(week): data.append({ 'date_str': g.date.strftime('%A, %b. %d'), 'time_str': g.date.strftime('%I:%M %p').lstrip('0'), 'datetime': time.mktime(g.tz_date().timetuple()), 'deadline': time.mktime(g.tz_deadline().timetuple()), 'favorite': teams.mascotname(g.favorite), 'spread': g.spread, 'home_team': { 'short': teams.shortname(g.home), 'city': teams.cityname(g.home), 'mascot': teams.mascotname(g.home), 'id': g.home, 'logo_x': g.home_x(), 'logo_y': g.home_y(), }, 'visiting_team': { 'short': teams.shortname(g.visiting), 'city': teams.cityname(g.visiting), 'mascot': teams.mascotname(g.visiting), 'id': g.visiting, 'logo_x': g.visiting_x(), 'logo_y': g.visiting_y(), } }) if not data: return None return view.render_json(self, data)
def load_schedule(week, force=False): if Game.gql('WHERE week = :1', week).count() > 0 and not force: logging.warning('Schedule for week %s is already loaded', week) x = _load_url('http://football.myfantasyleague.com/2012/export?TYPE=nflSchedule&W=%d' % week, type='xml') if int(x.get('week', 0)) != week: logging.warning('Could not load schedule for week %d', week) return games = [] for game in x.matchup: date = datetime.fromtimestamp(int(game.get('kickoff'))) date = date.replace(tzinfo=timezone.utc).astimezone(timezone.Pacific).replace(tzinfo=None) deadline = datetime(date.year, date.month, date.day, 23, 0) - timedelta(days=1) assert game.team[0].get('isHome') == '0' visiting = teams.id(game.team[0].get('id')) home = teams.id(game.team[1].get('id')) g = Game(week=week, home=home, visiting=visiting, date=date, deadline=deadline) logging.info('Adding game %s vs %s on %s, deadline %s', teams.shortname(visiting), teams.shortname(home), date, deadline) g.put() games.append(g) return games
def load_old_scores(week): x = _load_url('http://football.myfantasyleague.com/2012/export?TYPE=nflSchedule&W=%d' % week, type='xml') scores = {} for game in x.matchup: visiting_name = teams.shortname(teams.id(game.team[0].get('id'))) home_name = teams.shortname(teams.id(game.team[1].get('id'))) visiting_score = int(game.team[0].get('score')) home_score = int(game.team[1].get('score')) logging.debug('Found score for old game %s vs %s', home_name, visiting_name) scores[home_name] = (home_score, visiting_score) return scores
def get(self): data = defaultdict(list) entries_by_id = {} for e in entries.get_all_entries(): entries_by_id[e.key().id()] = e current_entry_id = None current_entry = None current_week = 1 for pick in entries.iterpicks(True): if current_entry_id != pick.entry_id: current_entry_id = pick.entry_id current_entry = entries_by_id[current_entry_id] current_week = 1 # fill empty weeks with buybacks while current_week < pick.week: data[current_entry.name].append({"status": "buyback", "team": ""}) current_week += 1 team = teams.shortname(pick.team) if pick.status not in (entries.Status.WIN, entries.Status.NONE): status = "violation" if pick.status == entries.Status.LOSS: status = "loss" if pick.buyback: status = "buyback" team = {"team": team, "status": status} data[entries_by_id[pick.entry_id].name].append(team) current_week += 1 return view.render_json(self, data)
def _set_rankings(team): team_id = teams.shortname(teams.id(team.get('id'))) rankings = TeamRanking.get_or_insert(team_id) rankings.rush_defense_rank = int(team.get('rushDefenseRank')) rankings.rush_offense_rank = int(team.get('rushOffenseRank')) rankings.pass_defense_rank = int(team.get('passDefenseRank')) rankings.pass_offense_rank = int(team.get('passOffenseRank')) rankings.put()
def update(game, home_score, visiting_score): logging.info('Updating status for game %s (%d) vs %s (%d)', teams.shortname(game.home), home_score, teams.shortname(game.visiting), visiting_score) game.home_score = home_score game.visiting_score = visiting_score if home_score > visiting_score: winner = game.home loser = game.visiting elif home_score < visiting_score: winner = game.visiting loser = game.home else: game.put() # save scores return (None, None, True) game.winner = winner game.put() return (winner, loser, False)
def update_spreads(): week = weeks.current() changed_games = [] x = _load_url('http://www.sportsbook.ag/rss/live-nfl-football.rss', type='xml') for game in x.channel.item: team_names = _team_re.search(str(game.title)).group(1, 2) visiting_spread = _find_spread(team_names[0], game.description) home_spread = _find_spread(team_names[1], game.description) g = Game.gql('WHERE week = :1 AND home = :2 AND visiting = :3', week, teams.id(team_names[1]), teams.id(team_names[0])).get() if not g: continue if visiting_spread > 0: g.favorite = g.home elif home_spread > 0: g.favorite = g.visiting g.spread = abs(home_spread) changed_games.append(g) logging.info('%s vs %s, Favorite: %s, spread %f', teams.shortname(g.visiting), teams.shortname(g.home), teams.shortname(g.favorite), g.spread) db.put(changed_games)
def update_standings(): standings = defaultdict(lambda: [0, 0]) for g in Game.all(): if g.winner == -1: continue _update_team_standings(standings, g.home, g.winner) _update_team_standings(standings, g.visiting, g.winner) changed_rankings = [] for team_id, (wins, losses) in standings.iteritems(): ranking = TeamRanking.get_by_key_name(teams.shortname(team_id)) ranking.wins = wins ranking.losses = losses changed_rankings.append(ranking) db.put(changed_rankings)
def load_scores(week): j = _load_url('http://www.nfl.com/liveupdate/scorestrip/ss.json', type='json') in_progress = 0 if j['w'] != week: scores = load_old_scores(week) else: scores = {} for g in j['gms']: if 'F' in g['q']: logging.debug('Found score for %s vs %s', g['h'], g['v']) scores[g['h']] = (g['hs'], g['vs']) elif 'P' != g['q']: logging.debug('Game %s v %s in progress, state %s', g['v'], g['h'], g['q']) in_progress += 1 else: logging.debug('Skipping game %s vs %s, game state is %s', g['v'], g['h'], g['q']) games = Game.gql('WHERE week = :1 AND winner = -1', week) winners = set() losers = set() for g in games: if g.complete(): continue home_team = teams.shortname(g.home) s = scores.get(home_team) if s: logging.info('Setting score for %s (%d) vs %s (%d)', home_team, s[0], teams.shortname(g.visiting), s[1]) (winner, loser, tie) = update(g, s[0], s[1]) if tie: losers.add(g.home) losers.add(g.visiting) else: winners.add(winner) losers.add(loser) return ((winners, losers), in_progress)
def post(self, entry_id): entry_id = int(entry_id) team = int(self.request.POST.get('team')) week = weeks.current() game = games.game_for_team(week, team) current_pick = entries.pick_for_entry(entry_id, week) current_game = games.game_for_team(week, current_pick.team) current_time = weeks.current_time() if current_time < weeks.deadline(week) and \ current_time < game.tz_deadline() and \ (current_game is None or current_time < current_game.tz_deadline()): entries.select_team(entry_id, weeks.current(), team) else: logging.warning('Attempt to set pick after deadline, user %s, team %s', self.user.name, teams.shortname(team)) self.abort(403)
def update_power_ranks(): t = _load_url('http://espn.go.com/nfl/powerrankings', type='text') x = lxml.html.document_fromstring(t) logging.info('Updating power ranks') rankings = [] for row in x.find_class('oddrow'): rankings.append(_extract_team_power_rank(row)) for row in x.find_class('evenrow'): rankings.append(_extract_team_power_rank(row)) changed_rankings = [] for team_id,rank in rankings: if team_id is None: continue logging.info('Looking up team %s', team_id) ranking = TeamRanking.get_by_key_name(teams.shortname(team_id)) ranking.power_rank = rank changed_rankings.append(ranking) db.put(changed_rankings)
def select_team(entry_id, week, team): key = _pick_key(week, entry_id) logging.info('Selecting team: pick key = %s, team = %s', key, teams.shortname(team)) p = Pick.get_by_key_name(key) p.team = team p.put()
def team_shortname(self): return teams.shortname(self.team)