def fetch(self, team, year, return_valid_years=False): """ returns: events_sorted, matches_by_event_key, awards_by_event_key, valid_years of a team for a given year """ awards_future = award_query.TeamYearAwardsQuery(team.key.id(), year).fetch_async() events_future = event_query.TeamYearEventsQuery(team.key.id(), year).fetch_async() matches_future = match_query.TeamYearMatchesQuery(team.key.id(), year).fetch_async() if return_valid_years: valid_years_future = team_query.TeamParticipationQuery(team.key.id()).fetch_async() events_sorted = sorted(events_future.get_result(), key=lambda e: e.start_date if e.start_date else datetime.datetime(year, 12, 31)) # unknown goes last matches_by_event_key = {} for match in matches_future.get_result(): if match.event in matches_by_event_key: matches_by_event_key[match.event].append(match) else: matches_by_event_key[match.event] = [match] awards_by_event_key = {} for award in awards_future.get_result(): if award.event in awards_by_event_key: awards_by_event_key[award.event].append(award) else: awards_by_event_key[award.event] = [award] if return_valid_years: valid_years = sorted(valid_years_future.get_result()) else: valid_years = [] return events_sorted, matches_by_event_key, awards_by_event_key, valid_years
def get_last_event_stats(cls, team_list, event_key): year = int(event_key.id()[:4]) cur_event = event_key.get() # Check cache for stored OPRs cache_key = '{}:last_event_stats'.format(event_key.id()) last_event_stats = memcache.get(cache_key) if last_event_stats is None: last_event_stats = defaultdict(dict) # Make necessary queries for missing stats futures = [] for team in team_list: if team not in last_event_stats: events_future = event_query.TeamYearEventsQuery( 'frc{}'.format(team), year).fetch_async() futures.append((team, events_future)) # Add missing stats to last_event_stats for team, events_future in futures: events = events_future.get_result() # Find last event before current event last_event = None last_event_start = None for event in events: if event.official and event.start_date < cur_event.start_date and event.event_type_enum != EventType.CMP_FINALS: if last_event is None or event.start_date > last_event_start: last_event = event last_event_start = event.start_date if last_event is not None and last_event.matchstats: for stat, values in last_event.matchstats.items(): if values and team in values: last_event_stats[stat][team] = values[team] memcache.set(cache_key, last_event_stats, 60 * 60 * 24) return last_event_stats