def even_more_setup(env): from vignewton.managers.util import parse_odds_html games = parse_odds_html(text) env['games'] = games #from vignewton.models.main import NFLGame gm = NFLGameManager(db) env['gm'] = gm dbgames = [gm.get_game_from_odds(g) for g in games] env['dbgames'] = dbgames from vignewton.managers.odds import NFLOddsManager om = NFLOddsManager(db) env['om'] = om om.oddscache.set_url(odds_url)
class NFLOddsManager(object): def __init__(self, session): self.session = session self.games = NFLGameManager(self.session) self.teams = NFLTeamManager(self.session) self.oddscache = NFLOddsCache(self.session) def query(self): return self.session.query(NFLGameOdds) def get(self, game_id): return self.query().get(game_id) def archive_cache_table(self): return self.oddscache.archive_table("odds") def get_odds(self, game_id): q = self.query() q = q.filter_by(game_id=game_id) return q.one() def get_data(self, odds): data = dict(favored_id=odds.favored_id, underdog_id=odds.underdog_id, total=odds.total, spread=odds.spread) return data def _fix_number(self, numstr): numstr = numstr.encode("utf-8") numstr = numstr.strip() add_one_half = False if numstr.endswith("\xc2\xbd"): add_one_half = True numstr = numstr[:-2] if not numstr or numstr == "-": number = 0 else: number = int(numstr) if add_one_half: number = number + 0.5 return number def _determine_favored(self, game): away = game["away"] home = game["home"] if game["away_line"] == "-": favored_id = self.games.fnlookup[home] underdog_id = self.games.fnlookup[home] spread = "0" else: plusminus = game["away_line"][0] if plusminus == "-": favored_id = self.games.fnlookup[away] underdog_id = self.games.fnlookup[home] if game["home_line"][0] == "-": raise RuntimeError, "bad values for game %s" % game else: favored_id = self.games.fnlookup[home] underdog_id = self.games.fnlookup[away] if game["home_line"][0] == "+": raise RuntimeError, "bad values for game %s" % game spread = game["away_line"][1:].split("(")[0] spread = self._fix_number(spread) return favored_id, underdog_id, spread def add_game_odds(self, game_id, game): favored_id, underdog_id, spread = self._determine_favored(game) total = game["total"] total = self._fix_number(total) now = datetime.now() with transaction.manager: odds = NFLGameOdds() odds.game_id = game_id odds.retrieved = now odds.favored_id = favored_id odds.underdog_id = underdog_id odds.total = total odds.spread = spread self.session.add(odds) return self.session.merge(odds) def update_game_odds(self, game_id, game, odds): total = self._fix_number(game["total"]) spread = game["away_line"][1:].split("(")[0] spread = self._fix_number(spread) now = datetime.now() with transaction.manager: odds.retrieved = now odds.total = total odds.spread = spread odds = self.session.merge(odds) return odds def _populate_odds(self, games): olist = list() for game in games: print "GAMEODDS", game game_id = self.games.get_game_from_odds(game).id odds = self.get(game_id) if odds is not None: raise OddsPresentError, "odds table should be empty" odds = self.add_game_odds(game_id, game) olist.append(odds) olist = [self.session.merge(o) for o in olist] return olist # this is for testing and needs # an html file to parse def populate_current_odds(self, filename): oc = self.oddscache html = file(filename).read() oc.parser.set_html(html) oc.parser.parse() games = oc.parser.games latest = oc.add(games) olist = self._populate_odds(latest.content) return olist def populate_from_pickle(self, filename): games = Pickle.load(file(filename)) return self._populate_odds(games) def update_current_odds(self): latest, updated = self.oddscache.get_latest() oddslist = list() for game in latest.content: game_id = self.games.get_game_from_odds(game).id odds = self.get(game_id) if odds is None: odds = self.add_game_odds(game_id, game) else: odds = self.update_game_odds(game_id, game, odds) oddslist.append(odds) oddslist = [self.session.merge(o) for o in oddslist] return oddslist, updated def _filter_zero_odds(self, query): query = query.filter(NFLGameOdds.total > 0) query = query.filter(NFLGameOdds.spread > 0) return query def get_current_odds(self): now = datetime.now() q = self.query() q = q.filter(NFLGame.start >= now) q = q.order_by(NFLGame.start) # q = self._filter_zero_odds(q) return q.all()
class NFLOddsManager(object): def __init__(self, session): self.session = session self.games = NFLGameManager(self.session) self.teams = NFLTeamManager(self.session) self.oddscache = NFLOddsCache(self.session) def query(self): return self.session.query(NFLGameOdds) def get(self, game_id): return self.query().get(game_id) def archive_cache_table(self): return self.oddscache.archive_table('odds') def get_odds(self, game_id): q = self.query() q = q.filter_by(game_id=game_id) return q.one() def get_data(self, odds): data = dict(favored_id=odds.favored_id, underdog_id=odds.underdog_id, total=odds.total, spread=odds.spread) return data def _fix_number(self, numstr): numstr = numstr.encode('utf-8') numstr = numstr.strip() add_one_half = False if numstr.endswith('\xc2\xbd'): add_one_half = True numstr = numstr[:-2] if not numstr or numstr == '-': number = 0 else: number = int(numstr) if add_one_half: number = number + 0.5 return number def _determine_favored(self, game): away = game['away'] home = game['home'] if game['away_line'] == '-': favored_id = self.games.fnlookup[home] underdog_id = self.games.fnlookup[home] spread = '0' else: plusminus = game['away_line'][0] if plusminus == '-': favored_id = self.games.fnlookup[away] underdog_id = self.games.fnlookup[home] if game['home_line'][0] == '-': raise RuntimeError, "bad values for game %s" % game else: favored_id = self.games.fnlookup[home] underdog_id = self.games.fnlookup[away] if game['home_line'][0] == '+': raise RuntimeError, "bad values for game %s" % game spread = game['away_line'][1:].split('(')[0] spread = self._fix_number(spread) return favored_id, underdog_id, spread def add_game_odds(self, game_id, game): favored_id, underdog_id, spread = self._determine_favored(game) total = game['total'] total = self._fix_number(total) now = datetime.now() with transaction.manager: odds = NFLGameOdds() odds.game_id = game_id odds.retrieved = now odds.favored_id = favored_id odds.underdog_id = underdog_id odds.total = total odds.spread = spread self.session.add(odds) return self.session.merge(odds) def update_game_odds(self, game_id, game, odds): total = self._fix_number(game['total']) spread = game['away_line'][1:].split('(')[0] spread = self._fix_number(spread) now = datetime.now() with transaction.manager: odds.retrieved = now odds.total = total odds.spread = spread odds = self.session.merge(odds) return odds def _populate_odds(self, games): olist = list() for game in games: print "GAMEODDS", game game_id = self.games.get_game_from_odds(game).id odds = self.get(game_id) if odds is not None: raise OddsPresentError, "odds table should be empty" odds = self.add_game_odds(game_id, game) olist.append(odds) olist = [self.session.merge(o) for o in olist] return olist # this is for testing and needs # an html file to parse def populate_current_odds(self, filename): oc = self.oddscache html = file(filename).read() oc.parser.set_html(html) oc.parser.parse() games = oc.parser.games latest = oc.add(games) olist = self._populate_odds(latest.content) return olist def populate_from_pickle(self, filename): games = Pickle.load(file(filename)) return self._populate_odds(games) def update_current_odds(self): latest, updated = self.oddscache.get_latest() oddslist = list() for game in latest.content: game_id = self.games.get_game_from_odds(game).id odds = self.get(game_id) if odds is None: odds = self.add_game_odds(game_id, game) else: odds = self.update_game_odds(game_id, game, odds) oddslist.append(odds) oddslist = [self.session.merge(o) for o in oddslist] return oddslist, updated def _filter_zero_odds(self, query): query = query.filter(NFLGameOdds.total > 0) query = query.filter(NFLGameOdds.spread > 0) return query def get_current_odds(self): now = datetime.now() q = self.query() q = q.filter(NFLGame.start >= now) q = q.order_by(NFLGame.start) #q = self._filter_zero_odds(q) return q.all()