def _update_games(self, stream): events = parse_ical_nflschedule(stream) latest_game = self._get_latest_scored_game() updated = False for event in events: edata = parse_ical_nflgame(event) if latest_game is None: self.insert_new_game(event, data=edata) updated = True else: new_game = False if edata['start'] > latest_game.start: try: game = self.get_game_from_ical_event(event) except NoResultFound: new_game = True game = self.insert_new_game(event) updated = True if not new_game: # check score q = self.session.query(NFLGameScore) score = q.get(game.id) if score is None: game, game_updated = self.update_game(game, event) if game_updated: updated = True return updated
def update_game(self, game, event, data=None): if data is None: data = parse_ical_nflgame(event) away_id = self.teams.getbynick(data['away']).id home_id = self.teams.getbynick(data['home']).id updated = False with transaction.manager: if game.away_id != away_id: game.away_id = away_id updated = True if game.home_id != home_id: game.home_id = home_id updated = True fields = ['summary', 'uid', 'description', 'location', 'start', 'end'] for f in fields: if getattr(game, f) != data[f]: setattr(game, f, data[f]) updated = True if game.game_class != data['class']: game.game_class = data['class'] updated = True scores, away_score, home_score = data['scores'] if scores: gs = self.session.query(NFLGameScore).get(game.id) if gs is None: updated = True gs = NFLGameScore() gs.game_id = game.id gs.away_score = away_score gs.home_score = home_score self.session.add(gs) game = self.session.merge(game) return game, updated
def get_game_from_ical_event(self, event, data=None): if data is None: data = parse_ical_nflgame(event) away_id = self.teams.getbynick(data['away']).id home_id = self.teams.getbynick(data['home']).id start = data['start'] q = self.query() q = q.filter(func.DATE(NFLGame.start) == start.date()) q = q.filter(NFLGame.away_id == away_id) q = q.filter(NFLGame.home_id == home_id) try: return q.one() except MultipleResultsFound: early = gt - five_minutes late = gt + five_minutes q = q.filter(NFLGame.start >= early) q = q.filter(NFLGame.start <= late) return q.one()
def insert_new_game(self, event, data=None): if data is None: data = parse_ical_nflgame(event) with transaction.manager: g = NFLGame() away, home = data['away'], data['home'] g.away_id = self.teams.getbynick(away).id g.home_id = self.teams.getbynick(home).id fields = ['summary', 'uid', 'description', 'location', 'start', 'end'] for f in fields: setattr(g, f, data[f]) g.game_class = data['class'] self.session.add(g) scores, away_score, home_score = data['scores'] if scores: g = self.session.merge(g) gs = NFLGameScore() gs.game_id = g.id gs.away_score = away_score gs.home_score = home_score self.session.add(gs) return self.session.merge(g)