Пример #1
0
    def _render(self, year=None, explicit_year=False):
        event_keys = Event.query(Event.year == year).fetch(1000,
                                                           keys_only=True)
        events = ndb.get_multi(event_keys)
        EventHelper.sort_events(events)

        week_events = EventHelper.groupByWeek(events)

        district_enums = set()
        for event in events:
            if event.event_district_enum is not None and event.event_district_enum != DistrictType.NO_DISTRICT:
                district_enums.add(event.event_district_enum)

        districts = []  # a tuple of (district abbrev, district name)
        for district_enum in district_enums:
            districts.append((DistrictType.type_abbrevs[district_enum],
                              DistrictType.type_names[district_enum]))
        districts = sorted(districts, key=lambda d: d[1])

        self.template_values.update({
            "events": events,
            "explicit_year": explicit_year,
            "selected_year": year,
            "valid_years": self.VALID_YEARS,
            "week_events": week_events,
            "districts": districts,
        })

        path = os.path.join(os.path.dirname(__file__),
                            '../templates/event_list.html')
        return template.render(path, self.template_values)
Пример #2
0
    def _render(self, year=None, explicit_year=False):
        events = event_query.EventListQuery(year).fetch()
        EventHelper.sort_events(events)

        week_events = EventHelper.groupByWeek(events)

        district_enums = set()
        for event in events:
            if event.event_district_enum is not None and event.event_district_enum != DistrictType.NO_DISTRICT:
                district_enums.add(event.event_district_enum)

        districts = []  # a tuple of (district abbrev, district name)
        for district_enum in district_enums:
            districts.append((DistrictType.type_abbrevs[district_enum],
                              DistrictType.type_names[district_enum]))
        districts = sorted(districts, key=lambda d: d[1])

        self.template_values.update({
            "events": events,
            "explicit_year": explicit_year,
            "selected_year": year,
            "valid_years": self.VALID_YEARS,
            "week_events": week_events,
            "districts": districts,
        })

        return jinja2_engine.render('event_list.html', self.template_values)
Пример #3
0
    def doMatchInsights(self, year):
        """
        Calculate match insights for a given year. Returns a list of Insights.
        """
        # Only fetch from DB once
        official_events = Event.query(Event.year == year).order(Event.start_date).fetch(1000)
        events_by_week = EventHelper.groupByWeek(official_events)
        week_event_matches = []  # Tuples of: (week, events) where events are tuples of (event, matches)
        for week, events in events_by_week.items():
            if week == OFFSEASON_EVENTS_LABEL:
                continue
            week_events = []
            for event in events:
                if not event.official:
                    continue
                matches = event.matches
                week_events.append((event, matches))
            week_event_matches.append((week, week_events))

        insights = []
        insights += self._calculateHighscoreMatchesByWeek(week_event_matches, year)
        insights += self._calculateHighscoreMatches(week_event_matches, year)
        insights += self._calculateMatchAveragesByWeek(week_event_matches, year)
        insights += self._calculateScoreDistribution(week_event_matches, year)
        insights += self._calculateNumMatches(week_event_matches, year)
        return insights
    def _render(self, year=None, explicit_year=False):
        events = event_query.EventListQuery(year).fetch()
        EventHelper.sort_events(events)

        week_events = EventHelper.groupByWeek(events)

        district_enums = set()
        for event in events:
            if event.event_district_enum is not None and event.event_district_enum != DistrictType.NO_DISTRICT:
                district_enums.add(event.event_district_enum)

        districts = []  # a tuple of (district abbrev, district name)
        for district_enum in district_enums:
            districts.append((DistrictType.type_abbrevs[district_enum],
                              DistrictType.type_names[district_enum]))
        districts = sorted(districts, key=lambda d: d[1])

        self.template_values.update({
            "events": events,
            "explicit_year": explicit_year,
            "selected_year": year,
            "valid_years": self.VALID_YEARS,
            "week_events": week_events,
            "districts": districts,
        })

        path = os.path.join(os.path.dirname(__file__), '../templates/event_list.html')
        return template.render(path, self.template_values)
    def doMatchInsights(self, year):
        """
        Calculate match insights for a given year. Returns a list of Insights.
        """
        # Only fetch from DB once
        official_events = Event.query(Event.year == year).order(
            Event.start_date).fetch(1000)
        events_by_week = EventHelper.groupByWeek(official_events)
        week_event_matches = [
        ]  # Tuples of: (week, events) where events are tuples of (event, matches)
        for week, events in events_by_week.items():
            if week in {OFFSEASON_EVENTS_LABEL, PRESEASON_EVENTS_LABEL}:
                continue
            week_events = []
            for event in events:
                if not event.official:
                    continue
                matches = event.matches
                week_events.append((event, matches))
            week_event_matches.append((week, week_events))

        insights = []
        insights += self._calculateHighscoreMatchesByWeek(
            week_event_matches, year)
        insights += self._calculateHighscoreMatches(week_event_matches, year)
        insights += self._calculateMatchAveragesByWeek(week_event_matches,
                                                       year)
        insights += self._calculateScoreDistribution(week_event_matches, year)
        insights += self._calculateNumMatches(week_event_matches, year)
        insights += self._calculateYearSpecific(week_event_matches, year)
        return insights
    def _render(self, year=None, explicit_year=False):
        state_prov = self.request.get('state_prov', None)

        districts_future = DistrictsInYearQuery(year).fetch_async()
        all_events_future = event_query.EventListQuery(
            year).fetch_async()  # Needed for state_prov
        if state_prov:
            events_future = Event.query(
                Event.year == year,
                Event.state_prov == state_prov).fetch_async()
        else:
            events_future = all_events_future

        events = events_future.get_result()
        if state_prov == '' or (state_prov and not events):
            self.redirect(self.request.path, abort=True)

        EventHelper.sort_events(events)

        week_events = EventHelper.groupByWeek(events)

        districts = []  # a tuple of (district abbrev, district name)
        for district in districts_future.get_result():
            districts.append((district.abbreviation, district.display_name))
        districts = sorted(districts, key=lambda d: d[1])

        valid_state_provs = set()
        for event in all_events_future.get_result():
            if event.state_prov:
                valid_state_provs.add(event.state_prov)
        valid_state_provs = sorted(valid_state_provs)

        self.template_values.update({
            "events": events,
            "explicit_year": explicit_year,
            "selected_year": year,
            "valid_years": self.VALID_YEARS,
            "week_events": week_events,
            "districts": districts,
            "state_prov": state_prov,
            "valid_state_provs": valid_state_provs,
        })

        if year == datetime.datetime.now().year:
            self._cache_expiration = self.SHORT_CACHE_EXPIRATION

        return jinja2_engine.render('event_list.html', self.template_values)
    def _render(self, year=None, explicit_year=False):
        event_keys = Event.query(Event.year == year).fetch(1000, keys_only=True)
        events = ndb.get_multi(event_keys)
        events.sort(key=EventHelper.distantFutureIfNoStartDate)

        week_events = EventHelper.groupByWeek(events)

        template_values = {
            "events": events,
            "explicit_year": explicit_year,
            "selected_year": year,
            "valid_years": self.VALID_YEARS,
            "week_events": week_events,
        }

        path = os.path.join(os.path.dirname(__file__), '../templates/event_list.html')
        return template.render(path, template_values)
    def _render(self, year=None, explicit_year=False):
        state_prov = self.request.get('state_prov', None)

        all_events_future = event_query.EventListQuery(year).fetch_async()  # Needed for state_prov
        if state_prov:
            events_future = Event.query(Event.year==year, Event.state_prov==state_prov).fetch_async()
        else:
            events_future = all_events_future

        events = events_future.get_result()
        if state_prov == '' or (state_prov and not events):
            self.redirect(self.request.path, abort=True)

        EventHelper.sort_events(events)

        week_events = EventHelper.groupByWeek(events)

        district_enums = set()
        for event in events:
            if event.event_district_enum is not None and event.event_district_enum != DistrictType.NO_DISTRICT:
                district_enums.add(event.event_district_enum)

        districts = []  # a tuple of (district abbrev, district name)
        for district_enum in district_enums:
            districts.append((DistrictType.type_abbrevs[district_enum],
                              DistrictType.type_names[district_enum]))
        districts = sorted(districts, key=lambda d: d[1])

        valid_state_provs = set()
        for event in all_events_future.get_result():
            if event.state_prov:
                valid_state_provs.add(event.state_prov)
        valid_state_provs = sorted(valid_state_provs)

        self.template_values.update({
            "events": events,
            "explicit_year": explicit_year,
            "selected_year": year,
            "valid_years": self.VALID_YEARS,
            "week_events": week_events,
            "districts": districts,
            "state_prov": state_prov,
            "valid_state_provs": valid_state_provs,
        })

        return jinja2_engine.render('event_list.html', self.template_values)
    def _render(self, year=None, explicit_year=False):
        state_prov = self.request.get('state_prov', None)

        districts_future = DistrictsInYearQuery(year).fetch_async()
        all_events_future = event_query.EventListQuery(year).fetch_async()  # Needed for state_prov
        if state_prov:
            events_future = Event.query(Event.year==year, Event.state_prov==state_prov).fetch_async()
        else:
            events_future = all_events_future

        events = events_future.get_result()
        if state_prov == '' or (state_prov and not events):
            self.redirect(self.request.path, abort=True)

        EventHelper.sort_events(events)

        week_events = EventHelper.groupByWeek(events)

        districts = []  # a tuple of (district abbrev, district name)
        for district in districts_future.get_result():
            districts.append((district.abbreviation, district.display_name))
        districts = sorted(districts, key=lambda d: d[1])

        valid_state_provs = set()
        for event in all_events_future.get_result():
            if event.state_prov:
                valid_state_provs.add(event.state_prov)
        valid_state_provs = sorted(valid_state_provs)

        self.template_values.update({
            "events": events,
            "explicit_year": explicit_year,
            "selected_year": year,
            "valid_years": self.VALID_YEARS,
            "week_events": week_events,
            "districts": districts,
            "state_prov": state_prov,
            "valid_state_provs": valid_state_provs,
        })

        if year == datetime.datetime.now().year:
            self._cache_expiration = self.SHORT_CACHE_EXPIRATION

        return jinja2_engine.render('event_list.html', self.template_values)
Пример #10
0
    def _render(self, year=None, explicit_year=False):
        event_keys = Event.query(Event.year == year).fetch(1000,
                                                           keys_only=True)
        events = ndb.get_multi(event_keys)
        EventHelper.sort_events(events)

        week_events = EventHelper.groupByWeek(events)

        template_values = {
            "events": events,
            "explicit_year": explicit_year,
            "selected_year": year,
            "valid_years": self.VALID_YEARS,
            "week_events": week_events,
        }

        path = os.path.join(os.path.dirname(__file__),
                            '../templates/event_list.html')
        return template.render(path, template_values)
Пример #11
0
    def _render(self, year=None, explicit_year=False):
        show_upcoming = (year == datetime.datetime.now().year)

        events = Event.query(Event.year == year).order(Event.start_date).fetch(1000)
        
        week_events = None
        if year >= 2005:
            week_events = EventHelper.groupByWeek(events)
    
        template_values = {
            "show_upcoming": show_upcoming,
            "events": events,
            "week_events": week_events,
            "explicit_year": explicit_year,
            "selected_year": year,
            "valid_years": self.VALID_YEARS,
        }
    
        path = os.path.join(os.path.dirname(__file__), '../templates/event_list.html')
        return template.render(path, template_values)
    def test_group_by_week(self):
        """
        All events that start in the same span of Wednesday-Tuesday
        should be considered as being in the same week.
        """
        events_by_week = {}  # we will use this as the "answer key"

        # Generate random regional events
        seed = int(time.time())
        state = random.Random()
        state.seed(seed)

        event_id_counter = 0
        week_start = datetime.datetime(2013, 2, 27)
        for i in range(1, 7):  # test for 6 weeks
            for _ in range(state.randint(
                    1, 15)):  # random number of events per week
                week_label = REGIONAL_EVENTS_LABEL.format(i)

                start_date = week_start + datetime.timedelta(
                    days=state.randint(0, 6))
                end_date = start_date + datetime.timedelta(
                    days=state.randint(0, 3))

                event = Event(id='2013tst{}'.format(event_id_counter),
                              event_short='tst{}'.format(event_id_counter),
                              start_date=start_date,
                              end_date=end_date,
                              official=True,
                              event_type_enum=state.choice([
                                  EventType.REGIONAL, EventType.DISTRICT,
                                  EventType.DISTRICT_CMP
                              ]))

                if week_label in events_by_week:
                    events_by_week[week_label].append(event)
                else:
                    events_by_week[week_label] = [event]

                event_id_counter += 1
            week_start = week_start + datetime.timedelta(days=7)

        # Generate Championship events
        week_start += datetime.timedelta(days=7)
        events_by_week[CHAMPIONSHIP_EVENTS_LABEL] = [
            Event(id='2013arc'.format(event_id_counter),
                  event_short='arc',
                  start_date=week_start,
                  end_date=week_start + datetime.timedelta(days=2),
                  official=True,
                  event_type_enum=EventType.CMP_DIVISION),
            Event(id='2013gal'.format(event_id_counter),
                  event_short='gal',
                  start_date=week_start,
                  end_date=week_start + datetime.timedelta(days=2),
                  official=True,
                  event_type_enum=EventType.CMP_DIVISION),
            Event(id='2013cmp'.format(event_id_counter),
                  event_short='cmp',
                  start_date=week_start + datetime.timedelta(days=2),
                  end_date=week_start + datetime.timedelta(days=2),
                  official=True,
                  event_type_enum=EventType.CMP_FINALS)
        ]

        # Generate official events with no dates
        events_by_week[WEEKLESS_EVENTS_LABEL] = [
            Event(id='2013weekless1'.format(event_id_counter),
                  event_short='weekless1',
                  official=True,
                  event_type_enum=state.choice([
                      EventType.REGIONAL, EventType.DISTRICT,
                      EventType.DISTRICT_CMP
                  ])),
            Event(id='2013weekless2'.format(event_id_counter),
                  event_short='weekless2',
                  official=True,
                  event_type_enum=state.choice([
                      EventType.REGIONAL, EventType.DISTRICT,
                      EventType.DISTRICT_CMP
                  ])),
            Event(id='2013weekless3'.format(event_id_counter),
                  event_short='weekless3',
                  official=True,
                  event_type_enum=state.choice([
                      EventType.REGIONAL, EventType.DISTRICT,
                      EventType.DISTRICT_CMP
                  ])),
            Event(id='2013weekless4'.format(event_id_counter),
                  event_short='weekless4',
                  start_date=datetime.datetime(2013, 12, 31),
                  end_date=datetime.datetime(2013, 12, 31),
                  official=True,
                  event_type_enum=state.choice([
                      EventType.REGIONAL, EventType.DISTRICT,
                      EventType.DISTRICT_CMP
                  ]))
        ]

        # Generate preseason events
        events_by_week[PRESEASON_EVENTS_LABEL] = [
            Event(id='2013preseason1'.format(event_id_counter),
                  event_short='preseason1',
                  official=False,
                  event_type_enum=EventType.PRESEASON),
            Event(id='2013preseason2'.format(event_id_counter),
                  event_short='preseason2',
                  start_date=datetime.datetime(2013, 1, 18),
                  end_date=datetime.datetime(2013, 1, 20),
                  official=False,
                  event_type_enum=EventType.PRESEASON),
            Event(id='2013preseason3'.format(event_id_counter),
                  event_short='preseason3',
                  start_date=datetime.datetime(2013, 7, 11),
                  end_date=datetime.datetime(2013, 7, 12),
                  official=False,
                  event_type_enum=EventType.PRESEASON)
        ]

        # Generate offseason events. Offseason events are any event that doesn't fall under one of the above categories.
        events_by_week[OFFSEASON_EVENTS_LABEL] = [
            Event(id='2013offseason1'.format(event_id_counter),
                  event_short='offseason1',
                  official=False,
                  event_type_enum=EventType.OFFSEASON),
            Event(id='2013offseason2'.format(event_id_counter),
                  event_short='offseason2',
                  start_date=datetime.datetime(2013, 8, 18),
                  end_date=datetime.datetime(2013, 8, 20),
                  official=False,
                  event_type_enum=EventType.OFFSEASON),
            Event(id='2013offseason3'.format(event_id_counter),
                  event_short='offseason3',
                  start_date=datetime.datetime(2013, 12, 30),
                  end_date=datetime.datetime(2013, 12, 31),
                  official=False,
                  event_type_enum=EventType.OFFSEASON),
            Event(id='2013offseason4'.format(event_id_counter),
                  event_short='offseason4',
                  start_date=datetime.datetime(2013, 11, 13),
                  end_date=datetime.datetime(2013, 11, 14),
                  official=False,
                  event_type_enum=EventType.REGIONAL)
        ]

        # Combine all events and shufle randomly
        events = []
        for week_events in events_by_week.values():
            events.extend(week_events)
        state.shuffle(events)

        # Begin testing
        events.sort(key=EventHelper.distantFutureIfNoStartDate)
        week_events = EventHelper.groupByWeek(events)

        for key in events_by_week.keys():
            try:
                self.assertEqual(
                    set([e.key.id() for e in events_by_week[key]]),
                    set([e.key.id() for e in week_events[key]]))
            except AssertionError, e:
                logging.warning("\n\nseed: {}".format(seed))
                logging.warning("\n\nkey: {}".format(key))
                logging.warning("\n\nevents_by_week: {}".format(
                    events_by_week[key]))
                logging.warning("\n\nweek_events: {}".format(week_events[key]))
                raise e
Пример #13
0
    def _render(self, district_abbrev, year=None, explicit_year=False):
        district = DistrictQuery('{}{}'.format(year, district_abbrev)).fetch()
        if not district:
            self.abort(404)

        events_future = DistrictEventsQuery(district.key_name).fetch_async()

        # needed for district teams
        district_teams_future = DistrictTeamsQuery(district.key_name).fetch_async()

        # needed for valid_years
        history_future = DistrictHistoryQuery(district.abbreviation).fetch_async()

        # needed for valid_districts
        districts_in_year_future = DistrictsInYearQuery(district.year).fetch_async()

        # Temp disabled on 2017-02-18 -fangeugene
        # # Needed for active team statuses
        # live_events = []
        # if year == datetime.datetime.now().year:  # Only show active teams for current year
        #     live_events = EventHelper.getWeekEvents()
        # live_eventteams_futures = []
        # for event in live_events:
        #     live_eventteams_futures.append(EventTeamsQuery(event.key_name).fetch_async())

        events = events_future.get_result()
        EventHelper.sort_events(events)
        events_by_key = {}
        for event in events:
            events_by_key[event.key.id()] = event
        week_events = EventHelper.groupByWeek(events)

        valid_districts = set()
        districts_in_year = districts_in_year_future.get_result()
        for dist in districts_in_year:
            valid_districts.add((dist.display_name, dist.abbreviation))
        valid_districts = sorted(valid_districts, key=lambda (name, _): name)

        teams = TeamHelper.sortTeams(district_teams_future.get_result())

        num_teams = len(teams)
        middle_value = num_teams / 2
        if num_teams % 2 != 0:
            middle_value += 1
        teams_a, teams_b = teams[:middle_value], teams[middle_value:]

        # Temp disabled on 2017-02-18 -fangeugene
        # # Currently Competing Team Status
        # live_events_with_teams = EventTeamStatusHelper.buildEventTeamStatus(live_events, live_eventteams_futures, teams)
        # live_events_with_teams.sort(key=lambda x: x[0].name)

        # Get valid years
        district_history = history_future.get_result()
        valid_years = map(lambda d: d.year, district_history)
        valid_years = sorted(valid_years)

        self.template_values.update({
            'explicit_year': explicit_year,
            'year': year,
            'valid_years': valid_years,
            'valid_districts': valid_districts,
            'district_name': district.display_name,
            'district_abbrev': district_abbrev,
            'week_events': week_events,
            'events_by_key': events_by_key,
            'rankings': district.rankings,
            'teams_a': teams_a,
            'teams_b': teams_b,
            # 'live_events_with_teams': live_events_with_teams,  # Temp disabled on 2017-02-18 -fangeugene
        })

        return jinja2_engine.render('district_details.html', self.template_values)
    def test_group_by_week(self):
        """
        All events that start in the same span of Wednesday-Tuesday
        should be considered as being in the same week.
        """
        events_by_week = {}  # we will use this as the "answer key"

        # Generate random regional events
        seed = int(time.time())
        state = random.Random()
        state.seed(seed)

        event_id_counter = 0
        week_start = datetime.datetime(2013, 2, 27)
        for i in range(1, 7):  # test for 6 weeks
            for _ in range(state.randint(1, 15)):  # random number of events per week
                week_label = REGIONAL_EVENTS_LABEL.format(i)

                start_date = week_start + datetime.timedelta(days=state.randint(0, 6))
                end_date = start_date + datetime.timedelta(days=state.randint(0, 3))

                event = Event(
                    id='2013tst{}'.format(event_id_counter),
                    event_short='tst{}'.format(event_id_counter),
                    start_date=start_date,
                    end_date=end_date,
                    official=True,
                    event_type_enum=state.choice([EventType.REGIONAL, EventType.DISTRICT, EventType.DISTRICT_CMP])
                )

                if week_label in events_by_week:
                    events_by_week[week_label].append(event)
                else:
                    events_by_week[week_label] = [event]

                event_id_counter += 1
            week_start = week_start + datetime.timedelta(days=7)

        # Generate Championship events
        week_start += datetime.timedelta(days=7)
        events_by_week[CHAMPIONSHIP_EVENTS_LABEL] = [
            Event(
                id='2013arc'.format(event_id_counter),
                event_short='arc',
                start_date=week_start,
                end_date=week_start + datetime.timedelta(days=2),
                official=True,
                event_type_enum=EventType.CMP_DIVISION
            ),
            Event(
                id='2013gal'.format(event_id_counter),
                event_short='gal',
                start_date=week_start,
                end_date=week_start + datetime.timedelta(days=2),
                official=True,
                event_type_enum=EventType.CMP_DIVISION
            ),
            Event(
                id='2013cmp'.format(event_id_counter),
                event_short='cmp',
                start_date=week_start + datetime.timedelta(days=2),
                end_date=week_start + datetime.timedelta(days=2),
                official=True,
                event_type_enum=EventType.CMP_FINALS
            )
        ]

        # Generate official events with no dates
        events_by_week[WEEKLESS_EVENTS_LABEL] = [
            Event(
                id='2013weekless1'.format(event_id_counter),
                event_short='weekless1',
                official=True,
                event_type_enum=state.choice([EventType.REGIONAL, EventType.DISTRICT, EventType.DISTRICT_CMP])
            ),
            Event(
                id='2013weekless2'.format(event_id_counter),
                event_short='weekless2',
                official=True,
                event_type_enum=state.choice([EventType.REGIONAL, EventType.DISTRICT, EventType.DISTRICT_CMP])
            ),
            Event(
                id='2013weekless3'.format(event_id_counter),
                event_short='weekless3',
                official=True,
                event_type_enum=state.choice([EventType.REGIONAL, EventType.DISTRICT, EventType.DISTRICT_CMP])
            ),
            Event(
                id='2013weekless4'.format(event_id_counter),
                event_short='weekless4',
                start_date=datetime.datetime(2013, 12, 31),
                end_date=datetime.datetime(2013, 12, 31),
                official=True,
                event_type_enum=state.choice([EventType.REGIONAL, EventType.DISTRICT, EventType.DISTRICT_CMP])
            )
        ]

        # Generate preseason events
        events_by_week[PRESEASON_EVENTS_LABEL] = [
            Event(
                id='2013preseason1'.format(event_id_counter),
                event_short='preseason1',
                official=False,
                event_type_enum=EventType.PRESEASON
            ),
            Event(
                id='2013preseason2'.format(event_id_counter),
                event_short='preseason2',
                start_date=datetime.datetime(2013, 1, 18),
                end_date=datetime.datetime(2013, 1, 20),
                official=False,
                event_type_enum=EventType.PRESEASON
            ),
            Event(
                id='2013preseason3'.format(event_id_counter),
                event_short='preseason3',
                start_date=datetime.datetime(2013, 7, 11),
                end_date=datetime.datetime(2013, 7, 12),
                official=False,
                event_type_enum=EventType.PRESEASON
            )
        ]

        # Generate offseason events. Offseason events are any event that doesn't fall under one of the above categories.
        events_by_week[OFFSEASON_EVENTS_LABEL] = [
            Event(
                id='2013offseason1'.format(event_id_counter),
                event_short='offseason1',
                official=False,
                event_type_enum=EventType.OFFSEASON
            ),
            Event(
                id='2013offseason2'.format(event_id_counter),
                event_short='offseason2',
                start_date=datetime.datetime(2013, 8, 18),
                end_date=datetime.datetime(2013, 8, 20),
                official=False,
                event_type_enum=EventType.OFFSEASON
            ),
            Event(
                id='2013offseason3'.format(event_id_counter),
                event_short='offseason3',
                start_date=datetime.datetime(2013, 12, 30),
                end_date=datetime.datetime(2013, 12, 31),
                official=False,
                event_type_enum=EventType.OFFSEASON
            ),
            Event(
                id='2013offseason4'.format(event_id_counter),
                event_short='offseason4',
                start_date=datetime.datetime(2013, 11, 13),
                end_date=datetime.datetime(2013, 11, 14),
                official=False,
                event_type_enum=EventType.REGIONAL
            )
        ]

        # Combine all events and shufle randomly
        events = []
        for week_events in events_by_week.values():
            events.extend(week_events)
        state.shuffle(events)

        # Begin testing
        events.sort(key=EventHelper.distantFutureIfNoStartDate)
        week_events = EventHelper.groupByWeek(events)

        for key in events_by_week.keys():
            try:
                self.assertEqual(set([e.key.id() for e in events_by_week[key]]),
                                 set([e.key.id() for e in week_events[key]]))
            except AssertionError, e:
                logging.warning("\n\nseed: {}".format(seed))
                logging.warning("\n\nkey: {}".format(key))
                logging.warning("\n\nevents_by_week: {}".format(events_by_week[key]))
                logging.warning("\n\nweek_events: {}".format(week_events[key]))
                raise e
    def _render(self, district_abbrev, year=None, explicit_year=False):
        district = DistrictQuery('{}{}'.format(year, district_abbrev)).fetch()
        if not district:
            self.abort(404)

        events_future = DistrictEventsQuery(district.key_name).fetch_async()

        # needed for district teams
        district_teams_future = DistrictTeamsQuery(
            district.key_name).fetch_async()

        # needed for valid_years
        history_future = DistrictHistoryQuery(
            district.abbreviation).fetch_async()

        # needed for valid_districts
        districts_in_year_future = DistrictsInYearQuery(
            district.year).fetch_async()

        # needed for active team statuses
        live_events = []
        if year == datetime.datetime.now(
        ).year:  # Only show active teams for current year
            live_events = EventHelper.getWeekEvents()
        live_eventteams_futures = []
        for event in live_events:
            live_eventteams_futures.append(
                EventTeamsQuery(event.key_name).fetch_async())

        events = events_future.get_result()
        EventHelper.sort_events(events)
        events_by_key = {}
        for event in events:
            events_by_key[event.key.id()] = event
        week_events = EventHelper.groupByWeek(events)

        valid_districts = set()
        districts_in_year = districts_in_year_future.get_result()
        for dist in districts_in_year:
            valid_districts.add((dist.display_name, dist.abbreviation))
        valid_districts = sorted(valid_districts, key=lambda (name, _): name)

        teams = TeamHelper.sortTeams(district_teams_future.get_result())
        team_keys = set([t.key.id() for t in teams])

        num_teams = len(teams)
        middle_value = num_teams / 2
        if num_teams % 2 != 0:
            middle_value += 1
        teams_a, teams_b = teams[:middle_value], teams[middle_value:]

        # Currently Competing Team Status
        event_team_keys = []
        for event, teams_future in zip(live_events, live_eventteams_futures):
            for team in teams_future.get_result():
                if team.key.id() in team_keys:
                    event_team_keys.append(
                        ndb.Key(EventTeam, '{}_{}'.format(
                            event.key.id(),
                            team.key.id())))  # Should be in context cache

        ndb.get_multi(event_team_keys)  # Warms context cache
        live_events_with_teams = []
        for event, teams_future in zip(live_events, live_eventteams_futures):
            teams_and_statuses = []
            has_teams = False
            for team in teams_future.get_result():
                if team.key.id() in team_keys:
                    has_teams = True
                    event_team = EventTeam.get_by_id('{}_{}'.format(
                        event.key.id(),
                        team.key.id()))  # Should be in context cache
                    status_str = {
                        'alliance':
                        EventTeamStatusHelper.
                        generate_team_at_event_alliance_status_string(
                            team.key.id(), event_team.status),
                        'playoff':
                        EventTeamStatusHelper.
                        generate_team_at_event_playoff_status_string(
                            team.key.id(), event_team.status),
                    }
                    teams_and_statuses.append(
                        (team, event_team.status, status_str))
            if has_teams:
                teams_and_statuses.sort(key=lambda x: x[0].team_number)
                live_events_with_teams.append((event, teams_and_statuses))
        live_events_with_teams.sort(key=lambda x: x[0].name)
        live_events_with_teams.sort(
            key=lambda x: EventHelper.distantFutureIfNoStartDate(x[0]))
        live_events_with_teams.sort(
            key=lambda x: EventHelper.distantFutureIfNoEndDate(x[0]))

        # Get valid years
        district_history = history_future.get_result()
        valid_years = map(lambda d: d.year, district_history)
        valid_years = sorted(valid_years)

        self.template_values.update({
            'explicit_year':
            explicit_year,
            'year':
            year,
            'valid_years':
            valid_years,
            'valid_districts':
            valid_districts,
            'district_name':
            district.display_name,
            'district_abbrev':
            district_abbrev,
            'week_events':
            week_events,
            'events_by_key':
            events_by_key,
            'rankings':
            district.rankings,
            'advancement':
            district.advancement,
            'teams_a':
            teams_a,
            'teams_b':
            teams_b,
            'live_events_with_teams':
            live_events_with_teams,
        })

        return jinja2_engine.render('district_details.html',
                                    self.template_values)
    def _render(self, district_abbrev, year=None, explicit_year=False):
        district_type = DistrictType.abbrevs[district_abbrev]

        event_keys = Event.query(
            Event.year == year,
            Event.event_district_enum == district_type).fetch(None,
                                                              keys_only=True)
        if not event_keys:
            self.abort(404)

        # needed for district teams
        district_key = '{}{}'.format(year, district_abbrev)
        district_teams_future = DistrictTeamsQuery(district_key).fetch_async()

        # needed for valid_years
        all_cmp_event_keys_future = Event.query(
            Event.event_district_enum == district_type,
            Event.event_type_enum == EventType.DISTRICT_CMP).fetch_async(
                None, keys_only=True)

        # needed for valid_districts
        district_cmp_keys_future = Event.query(
            Event.year == year,
            Event.event_type_enum == EventType.DISTRICT_CMP).fetch_async(
                None, keys_only=True)  # to compute valid_districts

        # Needed for active team statuses
        live_events = []
        if year == datetime.datetime.now(
        ).year:  # Only show active teams for current year
            live_events = EventHelper.getWeekEvents()
        live_eventteams_futures = []
        for event in live_events:
            live_eventteams_futures.append(
                EventTeamsQuery(event.key_name).fetch_async())

        event_futures = ndb.get_multi_async(event_keys)
        event_team_keys_future = EventTeam.query(
            EventTeam.event.IN(event_keys)).fetch_async(None, keys_only=True)
        team_futures = ndb.get_multi_async(
            set([
                ndb.Key(Team,
                        et_key.id().split('_')[1])
                for et_key in event_team_keys_future.get_result()
            ]))

        events = [event_future.get_result() for event_future in event_futures]
        EventHelper.sort_events(events)
        week_events = EventHelper.groupByWeek(events)

        district_cmp_futures = ndb.get_multi_async(
            district_cmp_keys_future.get_result())

        team_totals = DistrictHelper.calculate_rankings(
            events, team_futures, year)

        valid_districts = set()
        for district_cmp_future in district_cmp_futures:
            district_cmp = district_cmp_future.get_result()
            cmp_dis_type = district_cmp.event_district_enum
            if cmp_dis_type is None:
                logging.warning(
                    "District event {} has unknown district type!".format(
                        district_cmp.key.id()))
            else:
                valid_districts.add((DistrictType.type_names[cmp_dis_type],
                                     DistrictType.type_abbrevs[cmp_dis_type]))
        valid_districts = sorted(valid_districts, key=lambda (name, _): name)

        teams = TeamHelper.sortTeams(district_teams_future.get_result())

        num_teams = len(teams)
        middle_value = num_teams / 2
        if num_teams % 2 != 0:
            middle_value += 1
        teams_a, teams_b = teams[:middle_value], teams[middle_value:]

        # Currently Competing Team Status
        live_events_with_teams = EventTeamStatusHelper.buildEventTeamStatus(
            live_events, live_eventteams_futures, teams)
        live_events_with_teams.sort(key=lambda x: x[0].name)

        self.template_values.update({
            'explicit_year':
            explicit_year,
            'year':
            year,
            'valid_years':
            sorted(
                set([
                    int(event_key.id()[:4])
                    for event_key in all_cmp_event_keys_future.get_result()
                ])),
            'valid_districts':
            valid_districts,
            'district_name':
            DistrictType.type_names[district_type],
            'district_abbrev':
            district_abbrev,
            'week_events':
            week_events,
            'team_totals':
            team_totals,
            'teams_a':
            teams_a,
            'teams_b':
            teams_b,
            'live_events_with_teams':
            live_events_with_teams,
        })

        return jinja2_engine.render('district_details.html',
                                    self.template_values)
Пример #17
0
    def _render(self, district_abbrev, year=None, explicit_year=False):
        district = DistrictQuery('{}{}'.format(year, district_abbrev)).fetch()
        if not district:
            self.abort(404)

        events_future = DistrictEventsQuery(district.key_name).fetch_async()

        # needed for district teams
        district_teams_future = DistrictTeamsQuery(district.key_name).fetch_async()

        # needed for valid_years
        history_future = DistrictHistoryQuery(district.abbreviation).fetch_async()

        # needed for valid_districts
        districts_in_year_future = DistrictsInYearQuery(district.year).fetch_async()

        # needed for active team statuses
        live_events = []
        if year == datetime.datetime.now().year:  # Only show active teams for current year
            live_events = EventHelper.getWeekEvents()
        live_eventteams_futures = []
        for event in live_events:
            live_eventteams_futures.append(EventTeamsQuery(event.key_name).fetch_async())

        events = events_future.get_result()
        EventHelper.sort_events(events)
        events_by_key = {}
        for event in events:
            events_by_key[event.key.id()] = event
        week_events = EventHelper.groupByWeek(events)

        valid_districts = set()
        districts_in_year = districts_in_year_future.get_result()
        for dist in districts_in_year:
            valid_districts.add((dist.display_name, dist.abbreviation))
        valid_districts = sorted(valid_districts, key=lambda (name, _): name)

        teams = TeamHelper.sortTeams(district_teams_future.get_result())
        team_keys = set([t.key.id() for t in teams])

        num_teams = len(teams)
        middle_value = num_teams / 2
        if num_teams % 2 != 0:
            middle_value += 1
        teams_a, teams_b = teams[:middle_value], teams[middle_value:]

        # Currently Competing Team Status
        event_team_keys = []
        for event, teams_future in zip(live_events, live_eventteams_futures):
            for team in teams_future.get_result():
                if team.key.id() in team_keys:
                    event_team_keys.append(ndb.Key(EventTeam, '{}_{}'.format(event.key.id(), team.key.id())))  # Should be in context cache

        ndb.get_multi(event_team_keys)  # Warms context cache
        live_events_with_teams = []
        for event, teams_future in zip(live_events, live_eventteams_futures):
            teams_and_statuses = []
            has_teams = False
            for team in teams_future.get_result():
                if team.key.id() in team_keys:
                    has_teams = True
                    event_team = EventTeam.get_by_id('{}_{}'.format(event.key.id(), team.key.id()))  # Should be in context cache
                    status_str = {
                        'alliance': EventTeamStatusHelper.generate_team_at_event_alliance_status_string(team.key.id(), event_team.status),
                        'playoff': EventTeamStatusHelper.generate_team_at_event_playoff_status_string(team.key.id(), event_team.status),
                    }
                    teams_and_statuses.append((
                        team,
                        event_team.status,
                        status_str
                    ))
            if has_teams:
                teams_and_statuses.sort(key=lambda x: x[0].team_number)
                live_events_with_teams.append((event, teams_and_statuses))
        live_events_with_teams.sort(key=lambda x: x[0].name)
        live_events_with_teams.sort(key=lambda x: EventHelper.distantFutureIfNoStartDate(x[0]))
        live_events_with_teams.sort(key=lambda x: EventHelper.distantFutureIfNoEndDate(x[0]))

        # Get valid years
        district_history = history_future.get_result()
        valid_years = map(lambda d: d.year, district_history)
        valid_years = sorted(valid_years)

        self.template_values.update({
            'explicit_year': explicit_year,
            'year': year,
            'valid_years': valid_years,
            'valid_districts': valid_districts,
            'district_name': district.display_name,
            'district_abbrev': district_abbrev,
            'week_events': week_events,
            'events_by_key': events_by_key,
            'rankings': district.rankings,
            'advancement': district.advancement,
            'teams_a': teams_a,
            'teams_b': teams_b,
            'live_events_with_teams': live_events_with_teams,
        })

        return jinja2_engine.render('district_details.html', self.template_values)
    def _render(self, district_abbrev, year=None, explicit_year=False):
        district_type = DistrictType.abbrevs[district_abbrev]

        event_keys = Event.query(Event.year == year, Event.event_district_enum == district_type).fetch(None, keys_only=True)
        if not event_keys:
            self.abort(404)

        # needed for district teams
        district_key = '{}{}'.format(year, district_abbrev)
        district_teams_future = DistrictTeamsQuery(district_key).fetch_async()

        # needed for valid_years
        all_cmp_event_keys_future = Event.query(Event.event_district_enum == district_type, Event.event_type_enum == EventType.DISTRICT_CMP).fetch_async(None, keys_only=True)

        # needed for valid_districts
        district_cmp_keys_future = Event.query(Event.year == year, Event.event_type_enum == EventType.DISTRICT_CMP).fetch_async(None, keys_only=True)  # to compute valid_districts

        # Needed for active team statuses
        live_events = []
        if year == datetime.datetime.now().year:  # Only show active teams for current year
            live_events = EventHelper.getWeekEvents()
        live_eventteams_futures = []
        for event in live_events:
            live_eventteams_futures.append(EventTeamsQuery(event.key_name).fetch_async())

        event_futures = ndb.get_multi_async(event_keys)
        event_team_keys_future = EventTeam.query(EventTeam.event.IN(event_keys)).fetch_async(None, keys_only=True)
        team_futures = ndb.get_multi_async(set([ndb.Key(Team, et_key.id().split('_')[1]) for et_key in event_team_keys_future.get_result()]))

        events = [event_future.get_result() for event_future in event_futures]
        EventHelper.sort_events(events)
        week_events = EventHelper.groupByWeek(events)

        district_cmp_futures = ndb.get_multi_async(district_cmp_keys_future.get_result())

        team_totals = DistrictHelper.calculate_rankings(events, team_futures, year)

        valid_districts = set()
        for district_cmp_future in district_cmp_futures:
            district_cmp = district_cmp_future.get_result()
            cmp_dis_type = district_cmp.event_district_enum
            if cmp_dis_type is None:
                logging.warning("District event {} has unknown district type!".format(district_cmp.key.id()))
            else:
                valid_districts.add((DistrictType.type_names[cmp_dis_type], DistrictType.type_abbrevs[cmp_dis_type]))
        valid_districts = sorted(valid_districts, key=lambda (name, _): name)

        teams = TeamHelper.sortTeams(district_teams_future.get_result())

        num_teams = len(teams)
        middle_value = num_teams / 2
        if num_teams % 2 != 0:
            middle_value += 1
        teams_a, teams_b = teams[:middle_value], teams[middle_value:]

        # Currently Competing Team Status
        live_events_with_teams = EventTeamStatusHelper.buildEventTeamStatus(live_events, live_eventteams_futures, teams)
        live_events_with_teams.sort(key=lambda x: x[0].name)

        self.template_values.update({
            'explicit_year': explicit_year,
            'year': year,
            'valid_years': sorted(set([int(event_key.id()[:4]) for event_key in all_cmp_event_keys_future.get_result()])),
            'valid_districts': valid_districts,
            'district_name': DistrictType.type_names[district_type],
            'district_abbrev': district_abbrev,
            'week_events': week_events,
            'team_totals': team_totals,
            'teams_a': teams_a,
            'teams_b': teams_b,
            'live_events_with_teams': live_events_with_teams,
        })

        return jinja2_engine.render('district_details.html', self.template_values)