Example #1
0
 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)
Example #2
0
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
Example #3
0
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)
Example #5
0
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()
Example #6
0
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)
Example #7
0
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)
Example #8
0
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)
Example #9
0
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)
Example #10
0
 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)
Example #11
0
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)
Example #12
0
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()
Example #13
0
 def team_shortname(self):
     return teams.shortname(self.team)