def _render(self, team_number): self.response.headers['content-type'] = 'text/plain; charset="utf-8"' user = self.request.get('user') if user: user_str = '@{}, '.format(user) else: user_str = '' team_event_or_error = validate_team(user_str, team_number) if type(team_event_or_error) == str: return team_event_or_error _, event = team_event_or_error event_code_upper = event.event_short.upper() matches_future = TeamEventMatchesQuery('frc{}'.format(team_number), event.key.id()).fetch_async() matches = MatchHelper.play_order_sort_matches(matches_future.get_result()) # No match schedule yet if not matches: return "{}[{}] Team {} has no scheduled matches yet.".format(user_str, event_code_upper, team_number) next_match = None for match in matches: if not match.has_been_played: next_match = match break if next_match is None: return "{}[{}] Team {} has no more scheduled matches.".format(user_str, event_code_upper, team_number) return "{}[{}] Team {} will be playing in match {}.".format(user_str, event_code_upper, team_number, match.short_name)
def _render(self, team_number, tz_str=None): import pytz from pytz.exceptions import UnknownTimeZoneError user = self.request.get('user') if user: user_str = '@{}, '.format(user) else: user_str = '' try: arg_tz = pytz.timezone(tz_str) if tz_str else None except UnknownTimeZoneError: arg_tz = None team_event_or_error = validate_team(user_str, team_number) if type(team_event_or_error) == str: return team_event_or_error _, event = team_event_or_error event_code_upper = event.event_short.upper() matches_future = TeamEventMatchesQuery('frc{}'.format(team_number), event.key.id()).fetch_async() matches = MatchHelper.play_order_sort_matches( matches_future.get_result()) # No match schedule yet if not matches: return "{}[{}] Team {} has no scheduled matches yet.".format( user_str, event_code_upper, team_number) next_match = None for match in matches: if not match.has_been_played: next_match = match break if next_match is None: return "{}[{}] Team {} has no more scheduled matches.".format( user_str, event_code_upper, team_number) predicted_str = "predicted" if next_match.predicted_time else "scheduled" match_time = next_match.predicted_time if next_match.predicted_time else next_match.time timezone = arg_tz if arg_tz else pytz.timezone(event.timezone_id) predicted_time_local = pytz.utc.localize(match_time).astimezone( timezone) if timezone else match_time time_string = ", {} to start at {}".format( predicted_str, predicted_time_local.strftime("%a %H:%M %Z")) if match_time else "" return "{}[{}] Team {} will be playing in match {}{}".format( user_str, event_code_upper, team_number, next_match.short_name, time_string)
def _render(self, team_number, tz_str=None): import pytz from pytz.exceptions import UnknownTimeZoneError user = self.request.get('user') if user: user_str = '@{}, '.format(user) else: user_str = '' try: arg_tz = pytz.timezone(tz_str) if tz_str else None except UnknownTimeZoneError: arg_tz = None team_event_or_error = validate_team(user_str, team_number) if type(team_event_or_error) == str: return team_event_or_error _, event = team_event_or_error event_code_upper = event.event_short.upper() matches_future = TeamEventMatchesQuery('frc{}'.format(team_number), event.key.id()).fetch_async() matches = MatchHelper.play_order_sort_matches(matches_future.get_result()) # No match schedule yet if not matches: return "{}[{}] Team {} has no scheduled matches yet.".format(user_str, event_code_upper, team_number) next_match = None for match in matches: if not match.has_been_played: next_match = match break if next_match is None: return "{}[{}] Team {} has no more scheduled matches.".format(user_str, event_code_upper, team_number) predicted_str = "predicted" if next_match.predicted_time else "scheduled" match_time = next_match.predicted_time if next_match.predicted_time else next_match.time timezone = arg_tz if arg_tz else pytz.timezone(event.timezone_id) predicted_time_local = pytz.utc.localize(match_time).astimezone(timezone) if timezone else match_time time_string = ", {} to start at {}".format(predicted_str, predicted_time_local.strftime("%a %H:%M %Z")) if match_time else "" return "{}[{}] Team {} will be playing in match {}{}".format(user_str, event_code_upper, team_number, next_match.short_name, time_string)
def generateTeamAtEventStatus(cls, team_key, event): """ Generate Team@Event status items :return: a tuple <long summary string, qual record, qual ranking, playoff status> """ team_number = team_key[3:] matches_future = TeamEventMatchesQuery(team_key, event.key.id()).fetch_async() matches = MatchHelper.organizeMatches(matches_future.get_result()) # Compute alliances alliance_number = cls._get_alliance_number(team_key, event) # Playoff Status status, short_playoff_status = cls._get_playoff_status(team_key, matches, alliance_number) # Still in quals or team did not make it to elims # Compute qual W-L-T wins, losses, ties, unplayed_qual = cls._get_qual_wlt(team_key, matches) if wins == 0 and losses == 0 and ties == 0: # No matches played yet status = "Team {} has not played any matches yet.".format(team_number) if not status else status # Compute rank & num_teams # Gets record from ranking data to account for surrogate matches rank, ranking_points, record, num_teams = cls._get_rank(team_number, event) rank_str = "Rank {} with {} RP".format(rank, ranking_points) # Compute final long status for nightbot, if one isn't already there if unplayed_qual > 0 and not status: if rank is not None: status = "Team {} is currently rank {}/{} with a record of {} and {} ranking points.".format(team_number, rank, num_teams, record, ranking_points) else: status = "Team {} currently has a record of {}.".format(team_number, record) elif not status: if alliance_number is None: status = "Team {} ended qualification matches at rank {}/{} with a record of {}.".format(team_number, rank, num_teams, record) elif alliance_number == 0: status = "Team {} ended qualification matches at rank {}/{} with a record of {} and was not picked for playoff matches.".format(team_number, rank, num_teams, record) else: status = "Team {} will be competing in the playoff matches on alliance #{}.".format(team_number, alliance_number) return status, record, rank_str, short_playoff_status
def _render(self, team_number): self.response.headers['content-type'] = 'text/plain; charset="utf-8"' team_event_or_error = validate_team(team_number) if type(team_event_or_error) == str: return team_event_or_error _, event = team_event_or_error event_code_upper = event.event_short.upper() team_key = 'frc{}'.format(team_number) matches_future = TeamEventMatchesQuery(team_key, event.key.id()).fetch_async() matches = MatchHelper.organizeMatches(matches_future.get_result()) # Compute alliances alliance_number = None if event.alliance_selections: for i, alliance in enumerate(event.alliance_selections): if team_key in alliance['picks']: alliance_number = i + 1 break else: alliance_number = 0 # Team didn't make it to elims level_map = { 'qf': 'quarters', 'sf': 'semis', 'f': 'the finals', } for comp_level in ['f', 'sf', 'qf']: # playoffs level_str = level_map[comp_level] if matches[comp_level]: wins = 0 losses = 0 for match in matches[comp_level]: if match.has_been_played: if team_key in match.alliances[match.winning_alliance]['teams']: wins += 1 else: losses += 1 if wins == 2: if comp_level == 'f': return "[{}]: Team {} won the event on alliance #{}.".format(event_code_upper, team_number, alliance_number) else: return "[{}]: Team {} won {} on alliance #{}.".format(event_code_upper, team_number, level_str, alliance_number) elif losses == 2: return "[{}]: Team {} got knocked out in {} on alliance #{}.".format(event_code_upper, team_number, level_str, alliance_number) else: return "[{}]: Team {} is currently {}-{} in {} on alliance #{}.".format(event_code_upper, team_number, wins, losses, level_str, alliance_number) # Still in quals or team did not make it to elims # Compute qual W-L-T wins = 0 losses = 0 ties = 0 unplayed_qual = 0 for match in matches['qm']: if match.has_been_played: if match.winning_alliance == '': ties += 1 elif team_key in match.alliances[match.winning_alliance]['teams']: wins += 1 else: losses += 1 else: unplayed_qual += 1 # Compute rank & num_teams rank = None if event.rankings: num_teams = len(event.rankings) - 1 for i, row in enumerate(event.rankings): if row[1] == team_number: rank = i if unplayed_qual > 0: if rank is not None: return "[{}]: Team {} is currently rank {}/{} with a record of {}-{}-{}.".format(event_code_upper, team_number, rank, num_teams, wins, losses, ties) else: return "[{}]: Team {} currently has a record of {}-{}-{} at [{}].".format(event_code_upper, team_number, wins, losses, ties) else: if alliance_number is None: return "[{}]: Team {} ended qualification matches at rank {}/{} with a record of {}-{}-{}.".format(event_code_upper, team_number, rank, num_teams, wins, losses, ties) elif alliance_number == 0: return "[{}]: Team {} ended qualification matches at rank {}/{} with a record of {}-{}-{} and was not picked for playoff matches.".format(event_code_upper, team_number, rank, num_teams, wins, losses, ties) else: return "[{}]: Team {} will be competing in the playoff matches on alliance #{}.".format(event_code_upper, team_number, alliance_number)
def _render(self, team_number): self.response.headers['content-type'] = 'text/plain; charset="utf-8"' user = self.request.get('user') if user: user_str = '@{}, '.format(user) else: user_str = '' team_event_or_error = validate_team(user_str, team_number) if type(team_event_or_error) == str: return team_event_or_error _, event = team_event_or_error event_code_upper = event.event_short.upper() team_key = 'frc{}'.format(team_number) matches_future = TeamEventMatchesQuery(team_key, event.key.id()).fetch_async() matches = MatchHelper.organizeMatches(matches_future.get_result()) # Compute alliances alliance_number = None if event.alliance_selections: for i, alliance in enumerate(event.alliance_selections): if team_key in alliance['picks']: alliance_number = i + 1 break else: alliance_number = 0 # Team didn't make it to elims level_map = { 'qf': 'quarters', 'sf': 'semis', 'f': 'the finals', } for comp_level in ['f', 'sf', 'qf']: # playoffs level_str = level_map[comp_level] if matches[comp_level]: wins = 0 losses = 0 for match in matches[comp_level]: if match.has_been_played: if team_key in match.alliances[match.winning_alliance]['teams']: wins += 1 else: losses += 1 if wins == 2: if comp_level == 'f': return "{}[{}] Team {} won the event on alliance #{}.".format(user_str, event_code_upper, team_number, alliance_number) else: return "{}[{}] Team {} won {} on alliance #{}.".format(user_str, event_code_upper, team_number, level_str, alliance_number) elif losses == 2: return "{}[{}] Team {} got knocked out in {} on alliance #{}.".format(user_str, event_code_upper, team_number, level_str, alliance_number) else: return "{}[{}] Team {} is currently {}-{} in {} on alliance #{}.".format(user_str, event_code_upper, team_number, wins, losses, level_str, alliance_number) # Still in quals or team did not make it to elims # Compute qual W-L-T wins = 0 losses = 0 ties = 0 unplayed_qual = 0 for match in matches['qm']: if match.has_been_played: if match.winning_alliance == '': ties += 1 elif team_key in match.alliances[match.winning_alliance]['teams']: wins += 1 else: losses += 1 else: unplayed_qual += 1 if wins == 0 and losses == 0 and ties == 0: # No matches played yet return "{}[{}] Team {} has not played any matches yet.".format(user_str, event_code_upper, team_number) # Compute rank & num_teams rank = None ranking_points = None if event.rankings: num_teams = len(event.rankings) - 1 for i, row in enumerate(event.rankings): if row[1] == team_number: rank = i ranking_points = int(float(row[2])) break if unplayed_qual > 0: if rank is not None: return "{}[{}] Team {} is currently rank {}/{} with a record of {}-{}-{} and {} ranking points.".format(user_str, event_code_upper, team_number, rank, num_teams, wins, losses, ties, ranking_points) else: return "{}[{}] Team {} currently has a record of {}-{}-{}.".format(user_str, event_code_upper, team_number, wins, losses, ties) else: if alliance_number is None: return "{}[{}] Team {} ended qualification matches at rank {}/{} with a record of {}-{}-{}.".format(user_str, event_code_upper, team_number, rank, num_teams, wins, losses, ties) elif alliance_number == 0: return "{}[{}] Team {} ended qualification matches at rank {}/{} with a record of {}-{}-{} and was not picked for playoff matches.".format(user_str, event_code_upper, team_number, rank, num_teams, wins, losses, ties) else: return "{}[{}] Team {} will be competing in the playoff matches on alliance #{}.".format(user_str, event_code_upper, team_number, alliance_number)