Exemple #1
0
    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