def parse(self, html):
        """
        Parse an event's details page from USFIRST.
        """
        # page_titles look like this:
        # <YEAR> <EVENT_NAME> (<EVENT_TYPE>)
        event_type_re = r'\((.+)\)'

        # locality_regions look like this:
        # <locality>, <region> <random string can have spaces>
        event_locality_region_re = r'(.*?), ([^ ]*)'

        result = dict()
        soup = BeautifulSoup(html)

        page_title = soup.find('h1', {'id': 'thepagetitle'}).text
        result['name'] = unicode(
            re.sub(r'\([^)]*\)', '', page_title[4:]).strip())
        result['short_name'] = EventHelper.getShortName(result['name'])
        result['event_type_enum'] = EventHelper.parseEventType(
            unicode(re.search(event_type_re, page_title).group(1).strip()))

        try:
            event_dates = soup.find('div', {'class': 'event-dates'}).text
            result['start_date'], result['end_date'] = self._parseEventDates(
                event_dates)
            result['year'] = int(event_dates[-4:])
        except Exception, detail:
            logging.error('Date Parse Failed: ' + str(detail))
Exemplo n.º 2
0
    def parse(self, response):
        events = []
        for event in response['hits']['hits']:
            first_eid = event['_id']
            event = event['_source']

            event_type = EventHelper.parseEventType(event['event_subtype'])
            if event_type in self.TYPES_TO_SKIP:
                continue

            code = event['event_code'].lower()
            key = "{}{}".format(self.season, code)
            name = event['event_name']
            short_name = EventHelper.getShortName(name)
            if event_type in EventType.DISTRICT_EVENT_TYPES:
                district_enum = EventHelper.getDistrictFromEventName(name)
            else:
                district_enum = DistrictType.NO_DISTRICT
            city = event.get('event_city', None)
            state_prov = event.get('event_stateprov', None)
            country = event.get('event_country', None)
            postalcode = event.get('event_postalcode', None)
            start = datetime.datetime.strptime(event['date_start'],
                                               self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(
                event['date_end'], self.DATE_FORMAT_STR) + datetime.timedelta(
                    hours=23, minutes=59, seconds=59)
            venue_address = event['event_venue']
            if 'event_address1' in event and event['event_address1']:
                venue_address += '\n' + event['event_address1']
            if 'event_address2' in event and event['event_address2']:
                venue_address += '\n' + event['event_address2']
            venue_address += '\n{}, {} {}\n{}'.format(
                event['event_city'], event['event_stateprov'],
                event['event_postalcode'], event['event_country'])

            raw_website = event.get('event_web_url', None)
            website = urlparse.urlparse(
                raw_website, 'http').geturl() if raw_website else None

            events.append(
                Event(id=key,
                      name=name,
                      short_name=short_name,
                      event_short=code,
                      event_type_enum=event_type,
                      official=True,
                      start_date=start,
                      end_date=end,
                      venue=event['event_venue'],
                      city=city,
                      state_prov=state_prov,
                      country=country,
                      postalcode=postalcode,
                      venue_address=venue_address,
                      year=self.season,
                      event_district_enum=district_enum,
                      first_eid=first_eid,
                      website=website))
        return events
    def parse(self, html):
        """
        Parse an event's details page from USFIRST.
        """
        # page_titles look like this:
        # <YEAR> <EVENT_NAME> (<EVENT_TYPE>)
        event_type_re = r'\((.+)\)'

        # locality_regions look like this:
        # <locality>, <region> <random string can have spaces>
        event_locality_region_re = r'(.*?), ([^ ]*)'

        result = dict()
        soup = BeautifulSoup(html, convertEntities=BeautifulSoup.HTML_ENTITIES)

        page_title = soup.find('h1', {'id': 'thepagetitle'}).text
        result['name'] = unicode(re.sub(r'\([^)]*\)', '', page_title[4:]).strip())
        result['short_name'] = EventHelper.getShortName(result['name'])
        result['event_type_enum'] = EventHelper.parseEventType(unicode(re.search(event_type_re, page_title).group(1).strip()))

        try:
            event_dates = soup.find('div', {'class': 'event-dates'}).text
            result['start_date'], result['end_date'] = self._parseEventDates(event_dates)
            result['year'] = int(event_dates[-4:])
        except Exception, detail:
            logging.error('Date Parse Failed: ' + str(detail))
    def parse(self, response):
        events = []
        districts = {}
        for event in response['Events']:
            code = event['code'].lower()
            event_type = EventType.PRESEASON if code == 'week0' else self.EVENT_TYPES.get(event['type'].lower(), None)
            if event_type is None:
                logging.warn("Event type '{}' not recognized!".format(event['type']))
                continue
            name = event['name']
            short_name = EventHelper.getShortName(name)
            district_enum = EventHelper.parseDistrictName(event['districtCode'].lower()) if event['districtCode'] else DistrictType.NO_DISTRICT
            district_key = District.renderKeyName(self.season, event['districtCode'].lower()) if event['districtCode'] else None
            venue = event['venue']
            city = event['city']
            state_prov = event['stateprov']
            country = event['country']
            start = datetime.datetime.strptime(event['dateStart'], self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event['dateEnd'], self.DATE_FORMAT_STR)
            website = event.get('website')

            # TODO read timezone from API

            # Special cases for champs
            if code in self.EVENT_CODE_EXCEPTIONS:
                code, short_name = self.EVENT_CODE_EXCEPTIONS[code]
                if code in self.EINSTEIN_CODES:
                    name = '{} Field'.format(short_name)
                    start = end.replace(hour=0, minute=0, second=0, microsecond=0)  # Set to beginning of last day
                else:  # Divisions
                    name = '{} Division'.format(short_name)

            events.append(Event(
                id="{}{}".format(self.season, code),
                name=name,
                short_name=short_name,
                event_short=code,
                event_type_enum=event_type,
                official=True,
                start_date=start,
                end_date=end,
                venue=venue,
                city=city,
                state_prov=state_prov,
                country=country,
                venue_address=None,  # Even though FRC API provides address, ElasticSearch is more detailed
                year=self.season,
                event_district_enum=district_enum,
                district_key=ndb.Key(District, district_key) if district_key else None,
                website=website,
            ))

            # Build District Model
            if district_key and district_key not in districts:
                districts[district_key] = District(
                    id=district_key,
                    year=self.season,
                    abbreviation=event['districtCode'].lower(),
                )
        return events, list(districts.values())
    def parse(self, html):
        """
        Parse an event's details page from USFIRST.
        """
        # locality_regions look like this:
        # <locality>, <region> <random string can have spaces>
        event_locality_region_re = r'(.*?), ([^ ]*)'

        result = dict()
        soup = BeautifulSoup(html)

        for tr in soup.findAll('tr'):
            tds = tr.findAll('td')
            if len(tds) > 1:
                field = str(tds[0].string)
                if field == "Event":
                    result["name"] = unicode(''.join(
                        tds[1].findAll(text=True))).strip()
                    result['short_name'] = EventHelper.getShortName(
                        result['name'])
                if field == "Event Subtype":
                    result["event_type_enum"] = EventHelper.parseEventType(
                        unicode(tds[1].string))
                if field == "When":
                    try:
                        event_dates = str(tds[1].string).strip()
                        result["start_date"], result[
                            "end_date"] = self._parseEventDates(event_dates)
                        result["year"] = int(event_dates[-4:])
                    except Exception, detail:
                        logging.error('Date Parse Failed: ' + str(detail))
                if field == "Where":
                    address_lines_stripped = [
                        re.sub('\s+', ' ', line.replace(u'\xa0', ' ')).strip()
                        for line in tds[1].findAll(text=True)
                    ]
                    result["venue_address"] = unicode(
                        '\r\n'.join(address_lines_stripped)).encode(
                            'ascii', 'ignore')

                    match = re.match(event_locality_region_re,
                                     address_lines_stripped[-2])
                    locality, region = match.group(1), match.group(2)
                    country = address_lines_stripped[-1]
                    result['location'] = '%s, %s, %s' % (locality, region,
                                                         country)
                if field == "Event Info":
                    result["website"] = unicode(tds[1].a['href'])
                if field == "Match Results":
                    #http://www2.usfirst.org/2010comp/Events/SDC/matchresults.html
                    m = re.match(
                        r"http://www2\.usfirst\.org/%scomp/Events/([a-zA-Z0-9]*)/matchresults\.html"
                        % result["year"], tds[1].a["href"])
                    if m is None:
                        # Some 2013 events are beautiful-souping tds[1].a["href"] to "http://www2.usfirst.org/2013comp/Events/FLBR" inexplicbly
                        m = re.match(
                            r"http://www2\.usfirst\.org/%scomp/Events/([a-zA-Z0-9]*)"
                            % result["year"], tds[1].a["href"])
                    result["event_short"] = m.group(1).lower()
    def parse(self, response):
        events = []
        for event in response["hits"]["hits"]:
            first_eid = event["_id"]
            event = event["_source"]

            event_type = EventHelper.parseEventType(event["event_subtype"])
            if event_type in self.TYPES_TO_SKIP:
                continue

            code = event["event_code"].lower()
            key = "{}{}".format(self.season, code)
            name = event["event_name"]
            short_name = EventHelper.getShortName(name)
            if event_type in EventType.DISTRICT_EVENT_TYPES:
                district_enum = EventHelper.getDistrictFromEventName(name)
            else:
                district_enum = DistrictType.NO_DISTRICT
            city = event.get("event_city", None)
            state_prov = event.get("event_stateprov", None)
            country = event.get("event_country", None)
            start = datetime.datetime.strptime(event["date_start"], self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event["date_end"], self.DATE_FORMAT_STR) + datetime.timedelta(
                hours=23, minutes=59, seconds=59
            )
            venue_address = event["event_venue"]
            if "event_address1" in event and event["event_address1"]:
                venue_address += "\n" + event["event_address1"]
            if "event_address2" in event and event["event_address2"]:
                venue_address += "\n" + event["event_address2"]
            venue_address += "\n{}, {} {}\n{}".format(
                event["event_city"], event["event_stateprov"], event["event_postalcode"], event["event_country"]
            )

            raw_website = event.get("event_web_url", None)
            website = urlparse.urlparse(raw_website, "http").geturl() if raw_website else None

            events.append(
                Event(
                    id=key,
                    name=name,
                    short_name=short_name,
                    event_short=code,
                    event_type_enum=event_type,
                    official=True,
                    start_date=start,
                    end_date=end,
                    venue=event["event_venue"],
                    city=city,
                    state_prov=state_prov,
                    country=country,
                    venue_address=venue_address,
                    year=self.season,
                    event_district_enum=district_enum,
                    first_eid=first_eid,
                    website=website,
                )
            )
        return events
Exemplo n.º 7
0
    def get(self, event_key):
        event = Event.get_by_id(event_key)
        event.short_name = EventHelper.getShortName(event.name)
        EventManipulator.createOrUpdate(event)

        template_values = {'event': event}
        path = os.path.join(os.path.dirname(__file__), '../templates/math/event_short_name_calc_do.html')
        self.response.out.write(template.render(path, template_values))
Exemplo n.º 8
0
    def get(self, event_key):
        event = Event.get_by_id(event_key)
        event.short_name = EventHelper.getShortName(event.name)
        EventManipulator.createOrUpdate(event)

        template_values = {'event': event}
        path = os.path.join(os.path.dirname(__file__), '../templates/math/event_short_name_calc_do.html')
        self.response.out.write(template.render(path, template_values))
    def parse(self, response):
        events = []
        for event in response['hits']['hits']:
            first_eid = event['_id']
            event = event['_source']

            event_type = EventHelper.parseEventType(event['event_subtype'])
            if event_type in self.TYPES_TO_SKIP:
                continue

            code = event['event_code'].lower()
            key = "{}{}".format(self.season, code)
            name = event['event_name']
            short_name = EventHelper.getShortName(name)
            if event_type in EventType.DISTRICT_EVENT_TYPES:
                district_enum = EventHelper.getDistrictFromEventName(name)
            else:
                district_enum = DistrictType.NO_DISTRICT
            city = event.get('event_city', None)
            state_prov = event.get('event_stateprov', None)
            country = event.get('event_country', None)
            postalcode = event.get('event_postalcode', None)
            start = datetime.datetime.strptime(event['date_start'], self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event['date_end'], self.DATE_FORMAT_STR) + datetime.timedelta(hours=23, minutes=59, seconds=59)
            venue_address = event['event_venue']
            if 'event_address1' in event and event['event_address1']:
                venue_address += '\n' + event['event_address1']
            if 'event_address2' in event and event['event_address2']:
                venue_address += '\n' + event['event_address2']
            venue_address += '\n{}, {} {}\n{}'.format(event['event_city'], event['event_stateprov'], event['event_postalcode'], event['event_country'])

            raw_website = event.get('event_web_url', None)
            website = urlparse.urlparse(raw_website, 'http').geturl() if raw_website else None

            events.append(Event(
                id=key,
                name=name,
                short_name=short_name,
                event_short=code,
                event_type_enum=event_type,
                official=True,
                start_date=start,
                end_date=end,
                venue=event['event_venue'],
                city=city,
                state_prov=state_prov,
                country=country,
                postalcode=postalcode,
                venue_address=venue_address,
                year=self.season,
                event_district_enum=district_enum,
                first_eid=first_eid,
                website=website
            ))
        return events
    def parse(self, response):
        events = []
        for event in response["Events"]:
            code = event["code"].lower()
            event_type = self.EVENT_TYPES.get(event["type"].lower(), None)
            if event_type is None:
                logging.warn("Event type '{}' not recognized!".format(event["type"]))
                continue
            name = event["name"]
            short_name = EventHelper.getShortName(name)
            district_enum = (
                EventHelper.parseDistrictName(event["districtCode"].lower())
                if event["districtCode"]
                else DistrictType.NO_DISTRICT
            )
            venue = event["venue"]
            city = event["city"]
            state_prov = event["stateprov"]
            country = event["country"]
            start = datetime.datetime.strptime(event["dateStart"], self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event["dateEnd"], self.DATE_FORMAT_STR)

            # TODO read timezone from API

            # Special cases for champs
            if code in self.EVENT_CODE_EXCEPTIONS:
                code, short_name = self.EVENT_CODE_EXCEPTIONS[code]
                if code == "cmp":  # Einstein
                    name = "{} Field".format(short_name)
                    start = end.replace(hour=0, minute=0, second=0, microsecond=0)  # Set to beginning of last day
                else:  # Divisions
                    name = "{} Division".format(short_name)

            events.append(
                Event(
                    id="{}{}".format(self.season, code),
                    name=name,
                    short_name=short_name,
                    event_short=code,
                    event_type_enum=event_type,
                    official=True,
                    start_date=start,
                    end_date=end,
                    venue=venue,
                    city=city,
                    state_prov=state_prov,
                    country=country,
                    venue_address=None,  # FIRST API doesn't provide detailed venue address
                    year=self.season,
                    event_district_enum=district_enum,
                )
            )
        return events
    def parse(self, html):
        """
        Parse an event's details page from USFIRST.
        """
        # locality_regions look like this:
        # <locality>, <region> <random string can have spaces>
        event_locality_region_re = r"(.*?), ([^ ]*)"

        result = dict()
        soup = BeautifulSoup(html, convertEntities=BeautifulSoup.HTML_ENTITIES)

        for tr in soup.findAll("tr"):
            tds = tr.findAll("td")
            if len(tds) > 1:
                field = str(tds[0].string)
                if field == "Event":
                    result["name"] = unicode("".join(tds[1].findAll(text=True))).strip()
                    result["short_name"] = EventHelper.getShortName(result["name"])
                if field == "Event Subtype":
                    result["event_type_enum"] = EventHelper.parseEventType(unicode(tds[1].string))
                if field == "When":
                    try:
                        event_dates = str(tds[1].string).strip()
                        result["start_date"], result["end_date"] = self._parseEventDates(event_dates)
                        result["year"] = int(event_dates[-4:])
                    except Exception, detail:
                        logging.error("Date Parse Failed: " + str(detail))
                if field == "Where":
                    address_lines_stripped = [
                        re.sub("\s+", " ", line.replace(u"\xa0", " ")).strip() for line in tds[1].findAll(text=True)
                    ]
                    result["venue_address"] = unicode("\r\n".join(address_lines_stripped)).encode("ascii", "ignore")

                    match = re.match(event_locality_region_re, address_lines_stripped[-2])
                    locality, region = match.group(1), match.group(2)
                    country = address_lines_stripped[-1]
                    result["location"] = "%s, %s, %s" % (locality, region, country)
                if field == "Event Info":
                    result["website"] = unicode(tds[1].a["href"])
                if field == "Match Results":
                    # http://www2.usfirst.org/2010comp/Events/SDC/matchresults.html
                    m = re.match(
                        r"http://www2\.usfirst\.org/%scomp/Events/([a-zA-Z0-9]*)/matchresults\.html" % result["year"],
                        tds[1].a["href"],
                    )
                    if m is None:
                        # Some 2013 events are beautiful-souping tds[1].a["href"] to "http://www2.usfirst.org/2013comp/Events/FLBR" inexplicbly
                        m = re.match(
                            r"http://www2\.usfirst\.org/%scomp/Events/([a-zA-Z0-9]*)" % result["year"], tds[1].a["href"]
                        )
                    result["event_short"] = m.group(1).lower()
    def parse(self, response):
        events = []
        for event in response['Events']:
            code = event['code'].lower()
            event_type = self.EVENT_TYPES.get(event['type'].lower(), None)
            if event_type is None:
                logging.warn("Event type '{}' not recognized!".format(event['type']))
                continue
            name = event['name']
            short_name = EventHelper.getShortName(name)
            district_enum = EventHelper.parseDistrictName(event['districtCode'].lower()) if event['districtCode'] else DistrictType.NO_DISTRICT
            venue = event['venue']
            city = event['city']
            state_prov = event['stateprov']
            country = event['country']
            start = datetime.datetime.strptime(event['dateStart'], self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event['dateEnd'], self.DATE_FORMAT_STR)

            # TODO read timezone from API

            # Special cases for champs
            if code in self.EVENT_CODE_EXCEPTIONS:
                code, short_name = self.EVENT_CODE_EXCEPTIONS[code]
                if code in self.EINSTEIN_CODES:
                    name = '{} Field'.format(short_name)
                    start = end.replace(hour=0, minute=0, second=0, microsecond=0)  # Set to beginning of last day
                else:  # Divisions
                    name = '{} Division'.format(short_name)

            events.append(Event(
                id="{}{}".format(self.season, code),
                name=name,
                short_name=short_name,
                event_short=code,
                event_type_enum=event_type,
                official=True,
                start_date=start,
                end_date=end,
                venue=venue,
                city=city,
                state_prov=state_prov,
                country=country,
                venue_address=None,  # FIRST API doesn't provide detailed venue address
                year=self.season,
                event_district_enum=district_enum
            ))
        return events
    def parse(self, response):
        events = []
        for event in response['Events']:
            code = event['code'].lower()
            event_type = self.EVENT_TYPES.get(event['type'].lower(), None)
            if event_type is None:
                logging.warn("Event type '{}' not recognized!".format(event['type']))
                continue
            name = event['name']
            short_name = EventHelper.getShortName(name)
            district_enum = EventHelper.parseDistrictName(event['districtCode'].lower()) if event['districtCode'] else DistrictType.NO_DISTRICT
            venue = event['venue']
            location = "{}, {}, {}".format(event['city'], event['stateprov'], event['country'])
            start = datetime.datetime.strptime(event['dateStart'], self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event['dateEnd'], self.DATE_FORMAT_STR)

            # TODO read timezone from API

            # Special cases for champs
            if code in self.EVENT_CODE_EXCEPTIONS:
                code, short_name = self.EVENT_CODE_EXCEPTIONS[code]
                if code == 'cmp':  # Einstein
                    name = '{} Field'.format(short_name)
                    start = end.replace(hour=0, minute=0, second=0, microsecond=0)  # Set to beginning of last day
                else:  # Divisions
                    name = '{} Division'.format(short_name)

            events.append(Event(
                id="{}{}".format(self.season, code),
                name=name,
                short_name=short_name,
                event_short=code,
                event_type_enum=event_type,
                official=True,
                start_date=start,
                end_date=end,
                venue=venue,
                location=location,
                venue_address=None,  # FIRST API doesn't provide detailed venue address
                year=self.season,
                event_district_enum=district_enum
            ))
        return events
    def parse(self, response):
        events = []
        for event in response['Events']:
            code = event['code'].lower()
            key = "{}{}".format(self.season, code)
            name = event['name']
            short_name = EventHelper.getShortName(name)
            event_type = EventHelper.parseEventType(event['type'])
            district_enum = EventHelper.parseDistrictName(
                event['districtCode'].lower(
                )) if event['districtCode'] else DistrictType.NO_DISTRICT
            venue = event['venue']
            location = "{}, {}, {}".format(event['city'], event['stateprov'],
                                           event['country'])
            start = datetime.datetime.strptime(event['dateStart'],
                                               self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event['dateEnd'],
                                             self.DATE_FORMAT_STR)

            # TODO read timezone from API

            # Do not read in CMP divisions, we'll add those manually
            if event_type in EventType.CMP_EVENT_TYPES:
                continue

            events.append(
                Event(
                    id=key,
                    name=name,
                    short_name=short_name,
                    event_short=code,
                    event_type_enum=event_type,
                    official=True,
                    start_date=start,
                    end_date=end,
                    venue=venue,
                    location=location,
                    venue_address=
                    None,  # FIRST API doesn't provide detailed venue address
                    year=self.season,
                    event_district_enum=district_enum))
        return events
    def parse(self, response):
        events = []
        for event in response['Events']:
            code = event['code'].lower()
            key = "{}{}".format(self.season, code)
            name = event['name']
            short_name = EventHelper.getShortName(name)
            event_type = EventHelper.parseEventType(event['type'])
            district_enum = EventHelper.parseDistrictName(event['districtCode'].lower()) if event['districtCode'] else DistrictType.NO_DISTRICT
            venue = event['venue']
            location = "{}, {}, {}".format(event['city'], event['stateprov'], event['country'])
            start = datetime.datetime.strptime(event['dateStart'], self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event['dateEnd'], self.DATE_FORMAT_STR)

            # TODO read timezone from API

            # Do not read in CMP divisions, we'll add those manually
            if event_type in EventType.CMP_EVENT_TYPES:
                continue

            events.append(Event(
                id=key,
                name=name,
                short_name=short_name,
                event_short=code,
                event_type_enum=event_type,
                official=True,
                start_date=start,
                end_date=end,
                venue=venue,
                location=location,
                venue_address="{}, {}".format(venue, location),
                year=self.season,
                event_district_enum=district_enum
            ))
        return events
Exemplo n.º 16
0
    def parse(self, response):
        events = []
        districts = {}
        for event in response['Events']:
            code = event['code'].lower()
            event_type = EventType.PRESEASON if code == 'week0' else self.EVENT_TYPES.get(
                event['type'].lower(), None)
            if event_type is None:
                logging.warn("Event type '{}' not recognized!".format(
                    event['type']))
                continue
            name = event['name']
            short_name = EventHelper.getShortName(name)
            district_enum = EventHelper.parseDistrictName(
                event['districtCode'].lower(
                )) if event['districtCode'] else DistrictType.NO_DISTRICT
            district_key = District.renderKeyName(
                self.season, event['districtCode'].lower()
            ) if event['districtCode'] else None
            venue = event['venue']
            city = event['city']
            state_prov = event['stateprov']
            country = event['country']
            start = datetime.datetime.strptime(event['dateStart'],
                                               self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event['dateEnd'],
                                             self.DATE_FORMAT_STR)
            website = event.get('website')

            # TODO read timezone from API

            # Special cases for champs
            if code in self.EVENT_CODE_EXCEPTIONS:
                code, short_name = self.EVENT_CODE_EXCEPTIONS[code]
                if code in self.EINSTEIN_CODES:
                    name = '{} Field'.format(short_name)
                    start = end.replace(
                        hour=0, minute=0, second=0,
                        microsecond=0)  # Set to beginning of last day
                else:  # Divisions
                    name = '{} Division'.format(short_name)

            events.append(
                Event(
                    id="{}{}".format(self.season, code),
                    name=name,
                    short_name=short_name,
                    event_short=code,
                    event_type_enum=event_type,
                    official=True,
                    start_date=start,
                    end_date=end,
                    venue=venue,
                    city=city,
                    state_prov=state_prov,
                    country=country,
                    venue_address=
                    None,  # Even though FRC API provides address, ElasticSearch is more detailed
                    year=self.season,
                    event_district_enum=district_enum,
                    district_key=ndb.Key(District, district_key)
                    if district_key else None,
                    website=website,
                ))

            # Build District Model
            if district_key and district_key not in districts:
                districts[district_key] = District(
                    id=district_key,
                    year=self.season,
                    abbreviation=event['districtCode'].lower(),
                )
        return events, list(districts.values())
    def test_event_get_short_name(self):
        # Edge cases.
        self.assertEquals(
            EventHelper.getShortName("  { Random 2.718 stuff! }  "),
            "{ Random 2.718 stuff! }")
        self.assertEquals(
            EventHelper.getShortName("IN District -Bee's Knee's LX  "),
            "Bee's Knee's LX")
        self.assertEquals(
            EventHelper.getShortName(
                "MAR District - Brussels Int'l Event sponsored by Sprouts"),
            "Brussels Int'l")
        self.assertEquals(
            EventHelper.getShortName(
                "FIM District - Brussels Int'l Eventapalooza sponsored by TBA"
            ), "Brussels Int'l")
        self.assertEquals(
            EventHelper.getShortName(
                "NE District - ReallyBigEvent Scaling Up Every Year"),
            "ReallyBig")
        self.assertEquals(EventHelper.getShortName("PNW District -  Event!  "),
                          "Event!")

        self.assertEquals(
            EventHelper.getShortName(
                "FRC Detroit FIRST Robotics District Competition"), "Detroit")
        self.assertEquals(
            EventHelper.getShortName(
                "FIRST Robotics Detroit FRC State Championship"), "Detroit")
        self.assertEquals(
            EventHelper.getShortName("Maui FIRST Robotics Regional and Luau"),
            "Maui")
        self.assertEquals(
            EventHelper.getShortName(
                "California State Surf and Turf sponsored by TBA"),
            "California")
        self.assertEquals(EventHelper.getShortName("CarTalk Plaza Tournament"),
                          "CarTalk Plaza")
        self.assertEquals(
            EventHelper.getShortName("IRI FRC Be-all and End-all"), "IRI")
        self.assertEquals(EventHelper.getShortName("   Ada    Field  "), "Ada")
        self.assertEquals(
            EventHelper.getShortName(
                " FIRST Robotics Einstein Field Equations "), "Einstein")
        self.assertEquals(
            EventHelper.getShortName(
                "FRC Martin Luther King Jr. Region Championship"),
            "Martin Luther King Jr.")
        self.assertEquals(
            EventHelper.getShortName(
                "PNW   Ada Lovelace    Tournament of Software  "),
            "Ada Lovelace")
        self.assertEquals(
            EventHelper.getShortName(
                "\tPNW   Ada Lovelace    Tournament of Software  "),
            "Ada Lovelace")
        self.assertEquals(
            EventHelper.getShortName(
                " MAR FIRST Robotics   Rosa Parks    FRC Tournament of Roses  "
            ), "Rosa Parks")
        self.assertEquals(
            EventHelper.getShortName("Washington D.C. FIRST Robotics Region"),
            "Washington D.C.")
        self.assertEquals(
            EventHelper.getShortName("Washington D.C. FIRST Robotics Region."),
            "Washington D.C.")
        self.assertEquals(
            EventHelper.getShortName(
                "Washington D.C. FIRST Robotics Regiontonian"),
            "Washington D.C. FIRST Robotics Regiontonian"
        )  # Does not match "Region\b"

        # Tests from various years
        self.assertEqual(
            EventHelper.getShortName("FIRST Robotics Competition"),
            "FIRST Robotics Competition")
        self.assertEqual(EventHelper.getShortName("National Championship"),
                         "National Championship")
        self.assertEqual(EventHelper.getShortName("New England Tournament"),
                         "New England")
        self.assertEqual(
            EventHelper.getShortName("FIRST National Championship"),
            "FIRST National Championship")
        self.assertEqual(EventHelper.getShortName("Motorola Midwest Regional"),
                         "Motorola Midwest")
        self.assertEqual(EventHelper.getShortName("DEKA New England Regional"),
                         "DEKA New England")
        self.assertEqual(
            EventHelper.getShortName(
                "Johnson & Johnson Mid-Atlantic Regional"),
            "Johnson & Johnson Mid-Atlantic")
        self.assertEqual(EventHelper.getShortName("Great Lakes Regional"),
                         "Great Lakes")
        self.assertEqual(EventHelper.getShortName("New England Regional"),
                         "New England")
        self.assertEqual(EventHelper.getShortName("Southwest Regional"),
                         "Southwest")
        self.assertEqual(EventHelper.getShortName("NASA Ames Regional"),
                         "NASA Ames")
        self.assertEqual(
            EventHelper.getShortName("Kennedy Space Center Regional"),
            "Kennedy Space Center")
        self.assertEqual(EventHelper.getShortName("UTC New England Regional"),
                         "UTC New England")
        self.assertEqual(
            EventHelper.getShortName("Philadelphia Alliance Regional"),
            "Philadelphia Alliance")
        self.assertEqual(
            EventHelper.getShortName(
                "Kennedy Space Center Southeast Regional"),
            "Kennedy Space Center Southeast")
        self.assertEqual(EventHelper.getShortName("Long Island Regional"),
                         "Long Island")
        self.assertEqual(EventHelper.getShortName("Lone Star Regional"),
                         "Lone Star")
        self.assertEqual(EventHelper.getShortName("NASA Langley/VCU Regional"),
                         "NASA Langley/VCU")
        self.assertEqual(EventHelper.getShortName("Archimedes Field"),
                         "Archimedes")
        self.assertEqual(
            EventHelper.getShortName("Southern California Regional"),
            "Southern California")
        self.assertEqual(EventHelper.getShortName("Silicon Valley Regional"),
                         "Silicon Valley")
        self.assertEqual(EventHelper.getShortName("UTC/New England Regional"),
                         "UTC/New England")
        self.assertEqual(EventHelper.getShortName("Curie Field"), "Curie")
        self.assertEqual(
            EventHelper.getShortName("NASA KSC Southeast Regional"),
            "NASA KSC Southeast")
        self.assertEqual(EventHelper.getShortName("Galileo Field"), "Galileo")
        self.assertEqual(EventHelper.getShortName("West Michigan Regional"),
                         "West Michigan")
        self.assertEqual(EventHelper.getShortName("Newton Field"), "Newton")
        self.assertEqual(EventHelper.getShortName("J&J Mid-Atlantic Regional"),
                         "J&J Mid-Atlantic")
        self.assertEqual(EventHelper.getShortName("New York City Regional"),
                         "New York City")
        self.assertEqual(EventHelper.getShortName("NASA Langley Regional"),
                         "NASA Langley")
        self.assertEqual(
            EventHelper.getShortName("SBPLI Long Island Regional"),
            "SBPLI Long Island")
        self.assertEqual(EventHelper.getShortName("Western Michigan Regional"),
                         "Western Michigan")
        self.assertEqual(EventHelper.getShortName("St. Louis Regional"),
                         "St. Louis")
        self.assertEqual(EventHelper.getShortName("J&J Mid Atlantic Regional"),
                         "J&J Mid Atlantic")
        self.assertEqual(EventHelper.getShortName("Buckeye Regional"),
                         "Buckeye")
        self.assertEqual(EventHelper.getShortName("Canadian Regional"),
                         "Canadian")
        self.assertEqual(
            EventHelper.getShortName("NASA Langley / VCU Regional"),
            "NASA Langley / VCU")
        self.assertEqual(
            EventHelper.getShortName("Pacific Northwest Regional"),
            "Pacific Northwest")
        self.assertEqual(EventHelper.getShortName("Arizona Regional"),
                         "Arizona")
        self.assertEqual(EventHelper.getShortName("Einstein Field"),
                         "Einstein")
        self.assertEqual(EventHelper.getShortName("Central Florida Regional"),
                         "Central Florida")
        self.assertEqual(EventHelper.getShortName("Peachtree Regional"),
                         "Peachtree")
        self.assertEqual(EventHelper.getShortName("Midwest Regional"),
                         "Midwest")
        self.assertEqual(EventHelper.getShortName("Chesapeake Regional"),
                         "Chesapeake")
        self.assertEqual(
            EventHelper.getShortName("BAE SYSTEMS Granite State Regional"),
            "BAE SYSTEMS Granite State")
        self.assertEqual(EventHelper.getShortName("Philadelphia Regional"),
                         "Philadelphia")
        self.assertEqual(EventHelper.getShortName("Pittsburgh Regional"),
                         "Pittsburgh")
        self.assertEqual(EventHelper.getShortName("Sacramento Regional"),
                         "Sacramento")
        self.assertEqual(EventHelper.getShortName("NASA / VCU Regional"),
                         "NASA / VCU")
        self.assertEqual(EventHelper.getShortName("Colorado Regional"),
                         "Colorado")
        self.assertEqual(EventHelper.getShortName("Detroit Regional"),
                         "Detroit")
        self.assertEqual(EventHelper.getShortName("Florida Regional"),
                         "Florida")
        self.assertEqual(EventHelper.getShortName("New Jersey Regional"),
                         "New Jersey")
        self.assertEqual(EventHelper.getShortName("Greater Toronto Regional"),
                         "Greater Toronto")
        self.assertEqual(EventHelper.getShortName("Palmetto Regional"),
                         "Palmetto")
        self.assertEqual(EventHelper.getShortName("Boilermaker Regional"),
                         "Boilermaker")
        self.assertEqual(
            EventHelper.getShortName(
                "GM/Technion University Israel Pilot Regional"),
            "GM/Technion University Israel Pilot")
        self.assertEqual(EventHelper.getShortName("Las Vegas Regional"),
                         "Las Vegas")
        self.assertEqual(EventHelper.getShortName("Finger Lakes Regional"),
                         "Finger Lakes")
        self.assertEqual(EventHelper.getShortName("Waterloo Regional"),
                         "Waterloo")
        self.assertEqual(
            EventHelper.getShortName("GM/Technion Israel Regional"),
            "GM/Technion Israel")
        self.assertEqual(EventHelper.getShortName("Boston Regional"), "Boston")
        self.assertEqual(EventHelper.getShortName("Davis Sacramento Regional"),
                         "Davis Sacramento")
        self.assertEqual(EventHelper.getShortName("Wisconsin Regional"),
                         "Wisconsin")
        self.assertEqual(EventHelper.getShortName("Brazil Pilot"),
                         "Brazil Pilot")
        self.assertEqual(EventHelper.getShortName("Los Angeles Regional"),
                         "Los Angeles")
        self.assertEqual(EventHelper.getShortName("UTC Connecticut Regional"),
                         "UTC Connecticut")
        self.assertEqual(
            EventHelper.getShortName("Greater Kansas City Regional"),
            "Greater Kansas City")
        self.assertEqual(EventHelper.getShortName("Bayou Regional"), "Bayou")
        self.assertEqual(EventHelper.getShortName("San Diego Regional"),
                         "San Diego")
        self.assertEqual(EventHelper.getShortName("Brazil Regional"), "Brazil")
        self.assertEqual(EventHelper.getShortName("Connecticut Regional"),
                         "Connecticut")
        self.assertEqual(EventHelper.getShortName("Hawaii Regional"), "Hawaii")
        self.assertEqual(EventHelper.getShortName("Israel Regional"), "Israel")
        self.assertEqual(EventHelper.getShortName("Minnesota Regional"),
                         "Minnesota")
        self.assertEqual(
            EventHelper.getShortName("BAE Systems Granite State Regional"),
            "BAE Systems Granite State")
        self.assertEqual(EventHelper.getShortName("Oklahoma City Regional"),
                         "Oklahoma City")
        self.assertEqual(EventHelper.getShortName("Oregon Regional"), "Oregon")
        self.assertEqual(
            EventHelper.getShortName("UC Davis Sacramento Regional"),
            "UC Davis Sacramento")
        self.assertEqual(
            EventHelper.getShortName("Microsoft Seattle Regional"),
            "Microsoft Seattle")
        self.assertEqual(
            EventHelper.getShortName(
                "Dallas Regional, Sponsored by JCPenney and the JCPenney Afterschool Fund"
            ), "Dallas")
        self.assertEqual(EventHelper.getShortName("Washington DC  Regional"),
                         "Washington DC")
        self.assertEqual(
            EventHelper.getShortName(
                "Detroit FIRST Robotics District Competition"), "Detroit")
        self.assertEqual(
            EventHelper.getShortName(
                "Cass Tech FIRST Robotics District Competition"), "Cass Tech")
        self.assertEqual(
            EventHelper.getShortName(
                "Kettering University FIRST Robotics District Competition"),
            "Kettering University")
        self.assertEqual(
            EventHelper.getShortName(
                "Michigan FIRST Robotics Competition State Championship"),
            "Michigan")
        self.assertEqual(
            EventHelper.getShortName(
                "Lansing FIRST Robotics District Competition"), "Lansing")
        self.assertEqual(
            EventHelper.getShortName(
                "Traverse City FIRST Robotics District Competition"),
            "Traverse City")
        self.assertEqual(
            EventHelper.getShortName(
                "West Michigan FIRST Robotics District Competition"),
            "West Michigan")
        self.assertEqual(
            EventHelper.getShortName("Minnesota 10000 Lakes Regional"),
            "Minnesota 10000 Lakes")
        self.assertEqual(
            EventHelper.getShortName("Minnesota North Star Regional"),
            "Minnesota North Star")
        self.assertEqual(
            EventHelper.getShortName("BAE Granite State Regional"),
            "BAE Granite State")
        self.assertEqual(
            EventHelper.getShortName(
                "Troy FIRST Robotics District Competition"), "Troy")
        self.assertEqual(EventHelper.getShortName("NASA VCU Regional"),
                         "NASA VCU")
        self.assertEqual(
            EventHelper.getShortName(
                "Northeast Utilities FIRST Connecticut Regional"),
            "Northeast Utilities FIRST Connecticut")
        self.assertEqual(
            EventHelper.getShortName(
                "Dallas Regional sponsored by JCPenney and the JCPenney Afterschool Fund"
            ), "Dallas")
        self.assertEqual(
            EventHelper.getShortName(
                "Hawaii Regional sponsored by BAE Systems"), "Hawaii")
        self.assertEqual(EventHelper.getShortName("North Carolina Regional"),
                         "North Carolina")
        self.assertEqual(EventHelper.getShortName("Oklahoma Regional"),
                         "Oklahoma")
        self.assertEqual(EventHelper.getShortName("Autodesk Oregon Regional"),
                         "Autodesk Oregon")
        self.assertEqual(
            EventHelper.getShortName(
                "Silicon Valley Regional sponsored by Google and BAE Systems"),
            "Silicon Valley")
        self.assertEqual(
            EventHelper.getShortName(
                "Utah Regional sponsored by NASA & Platt"), "Utah")
        self.assertEqual(EventHelper.getShortName("Virginia Regional"),
                         "Virginia")
        self.assertEqual(
            EventHelper.getShortName(
                "Ann Arbor FIRST Robotics District Competition"), "Ann Arbor")
        self.assertEqual(EventHelper.getShortName("WPI Regional"), "WPI")
        self.assertEqual(
            EventHelper.getShortName("Dallas Regional sponsored by jcpenney"),
            "Dallas")
        self.assertEqual(EventHelper.getShortName("Lake Superior Regional"),
                         "Lake Superior")
        self.assertEqual(
            EventHelper.getShortName(
                "Michigan FIRST Robotics District Competition State Championship"
            ), "Michigan")
        self.assertEqual(
            EventHelper.getShortName("BAE Systems/Granite State Regional"),
            "BAE Systems/Granite State")
        self.assertEqual(
            EventHelper.getShortName(
                "Waterford FIRST Robotics District Competition"), "Waterford")
        self.assertEqual(
            EventHelper.getShortName("Greater Toronto East Regional"),
            "Greater Toronto East")
        self.assertEqual(
            EventHelper.getShortName("Greater Toronto West Regional"),
            "Greater Toronto West")
        self.assertEqual(EventHelper.getShortName("Alamo Regional"), "Alamo")
        self.assertEqual(
            EventHelper.getShortName(
                "Niles FIRST Robotics District Competition"), "Niles")
        self.assertEqual(EventHelper.getShortName("Smoky Mountain Regional"),
                         "Smoky Mountain")
        self.assertEqual(
            EventHelper.getShortName(
                "Utah Regional co-sponsored by NASA and Platt"), "Utah")
        self.assertEqual(EventHelper.getShortName("Seattle Olympic Regional"),
                         "Seattle Olympic")
        self.assertEqual(EventHelper.getShortName("Seattle Cascade Regional"),
                         "Seattle Cascade")
        self.assertEqual(
            EventHelper.getShortName(
                "Livonia FIRST Robotics District Competition"), "Livonia")
        self.assertEqual(EventHelper.getShortName("Central Valley Regional"),
                         "Central Valley")
        self.assertEqual(
            EventHelper.getShortName(
                "Dallas East Regional sponsored by jcpenney"), "Dallas East")
        self.assertEqual(
            EventHelper.getShortName(
                "Dallas West Regional sponsored by jcpenney"), "Dallas West")
        self.assertEqual(EventHelper.getShortName("Orlando Regional"),
                         "Orlando")
        self.assertEqual(
            EventHelper.getShortName("Michigan FRC State Championship"),
            "Michigan")
        self.assertEqual(
            EventHelper.getShortName(
                "Gull Lake FIRST Robotics District Competition"), "Gull Lake")
        self.assertEqual(
            EventHelper.getShortName(
                "Rutgers University FIRST Robotics District Competition"),
            "Rutgers University")
        self.assertEqual(
            EventHelper.getShortName(
                "Mount Olive FIRST Robotics District Competition"),
            "Mount Olive")
        self.assertEqual(
            EventHelper.getShortName(
                "Lenape FIRST Robotics District Competition"), "Lenape")
        self.assertEqual(EventHelper.getShortName("Queen City Regional"),
                         "Queen City")
        self.assertEqual(
            EventHelper.getShortName(
                "Mid-Atlantic Robotics FRC Region Championship"),
            "Mid-Atlantic Robotics")
        self.assertEqual(
            EventHelper.getShortName(
                "Hatboro-Horsham FIRST Robotics District Competition"),
            "Hatboro-Horsham")
        self.assertEqual(
            EventHelper.getShortName(
                "Chestnut Hill FIRST Robotics District Competition"),
            "Chestnut Hill")
        self.assertEqual(
            EventHelper.getShortName(
                "Festival de Robotique FRC a Montreal Regional"),
            "Festival de Robotique")
        self.assertEqual(EventHelper.getShortName("South Florida Regional"),
                         "South Florida")
        self.assertEqual(EventHelper.getShortName("Smoky Mountains Regional"),
                         "Smoky Mountains")
        self.assertEqual(EventHelper.getShortName("Spokane Regional"),
                         "Spokane")
        self.assertEqual(
            EventHelper.getShortName(
                "Northville FIRST Robotics District Competition"),
            "Northville")
        self.assertEqual(
            EventHelper.getShortName("Western Canadian FRC Regional"),
            "Western Canadian")
        self.assertEqual(EventHelper.getShortName("Razorback Regional"),
                         "Razorback")
        self.assertEqual(EventHelper.getShortName("Phoenix Regional"),
                         "Phoenix")
        self.assertEqual(
            EventHelper.getShortName(
                "Los Angeles Regional sponsored by The Roddenberry Foundation"
            ), "Los Angeles")
        self.assertEqual(EventHelper.getShortName("Inland Empire Regional"),
                         "Inland Empire")
        self.assertEqual(
            EventHelper.getShortName("Connecticut Regional sponsored by UTC"),
            "Connecticut")
        self.assertEqual(EventHelper.getShortName("Crossroads Regional"),
                         "Crossroads")
        self.assertEqual(EventHelper.getShortName("Pine Tree Regional"),
                         "Pine Tree")
        self.assertEqual(
            EventHelper.getShortName(
                "Bedford FIRST Robotics District Competition"), "Bedford")
        self.assertEqual(
            EventHelper.getShortName(
                "Grand Blanc FIRST Robotics District Competition"),
            "Grand Blanc")
        self.assertEqual(
            EventHelper.getShortName(
                "St Joseph FIRST Robotics District Competition"), "St Joseph")
        self.assertEqual(EventHelper.getShortName("Northern Lights Regional"),
                         "Northern Lights")
        self.assertEqual(
            EventHelper.getShortName(
                "Bridgewater-Raritan FIRST Robotics District Competition"),
            "Bridgewater-Raritan")
        self.assertEqual(
            EventHelper.getShortName(
                "TCNJ FIRST Robotics District Competition"), "TCNJ")
        self.assertEqual(
            EventHelper.getShortName(
                "Lenape Seneca FIRST Robotics District Competition"),
            "Lenape Seneca")
        self.assertEqual(
            EventHelper.getShortName(
                "Springside - Chestnut Hill FIRST Robotics District Competition"
            ), "Springside - Chestnut Hill")
        self.assertEqual(
            EventHelper.getShortName(
                "Festival de Robotique FRC de Montreal Regional"),
            "Festival de Robotique")
        self.assertEqual(EventHelper.getShortName("Dallas Regional"), "Dallas")
        self.assertEqual(EventHelper.getShortName("Hub City Regional"),
                         "Hub City")
        self.assertEqual(
            EventHelper.getShortName(
                "Alamo Regional sponsored by Rackspace Hosting"), "Alamo")
        self.assertEqual(
            EventHelper.getShortName(
                "Utah Regional co-sponsored by the Larry H. Miller Group & Platt"
            ), "Utah")
        self.assertEqual(EventHelper.getShortName("Seattle Regional"),
                         "Seattle")
        self.assertEqual(
            EventHelper.getShortName("Central Washington Regional"),
            "Central Washington")
        self.assertEqual(EventHelper.getShortName("Western Canada Regional"),
                         "Western Canada")
        self.assertEqual(EventHelper.getShortName("Arkansas Regional"),
                         "Arkansas")
        self.assertEqual(EventHelper.getShortName("Groton District Event"),
                         "Groton")
        self.assertEqual(EventHelper.getShortName("Hartford District Event"),
                         "Hartford")
        self.assertEqual(
            EventHelper.getShortName("Southington District Event"),
            "Southington")
        self.assertEqual(EventHelper.getShortName("Greater DC Regional"),
                         "Greater DC")
        self.assertEqual(EventHelper.getShortName("Central Illinois Regional"),
                         "Central Illinois")
        self.assertEqual(
            EventHelper.getShortName("Northeastern University District Event"),
            "Northeastern University")
        self.assertEqual(EventHelper.getShortName("WPI District Event"), "WPI")
        self.assertEqual(EventHelper.getShortName("Pine Tree District Event"),
                         "Pine Tree")
        self.assertEqual(
            EventHelper.getShortName(
                "Center Line FIRST Robotics District Competition"),
            "Center Line")
        self.assertEqual(
            EventHelper.getShortName(
                "Escanaba FIRST Robotics District Competition"), "Escanaba")
        self.assertEqual(
            EventHelper.getShortName(
                "Howell FIRST Robotics District Competition"), "Howell")
        self.assertEqual(
            EventHelper.getShortName(
                "St. Joseph FIRST Robotics District Competition"),
            "St. Joseph")
        self.assertEqual(
            EventHelper.getShortName(
                "Southfield FIRST Robotics District Competition"),
            "Southfield")
        self.assertEqual(EventHelper.getShortName("Mexico City Regional"),
                         "Mexico City")
        self.assertEqual(
            EventHelper.getShortName("New England FRC Region Championship"),
            "New England")
        self.assertEqual(EventHelper.getShortName("UNH District Event"), "UNH")
        self.assertEqual(
            EventHelper.getShortName("Granite State District Event"),
            "Granite State")
        self.assertEqual(
            EventHelper.getShortName(
                "MAR FIRST Robotics Bridgewater-Raritan District Competition"),
            "Bridgewater-Raritan")
        self.assertEqual(
            EventHelper.getShortName(
                "MAR FIRST Robotics Clifton District Competition"), "Clifton")
        self.assertEqual(
            EventHelper.getShortName(
                "MAR FIRST Robotics Mt. Olive District Competition"),
            "Mt. Olive")
        self.assertEqual(
            EventHelper.getShortName(
                "MAR FIRST Robotics Lenape-Seneca District Competition"),
            "Lenape-Seneca")
        self.assertEqual(
            EventHelper.getShortName("New York Tech Valley Regional"),
            "New York Tech Valley")
        self.assertEqual(EventHelper.getShortName("North Bay Regional"),
                         "North Bay")
        self.assertEqual(
            EventHelper.getShortName("Windsor Essex Great Lakes Regional"),
            "Windsor Essex Great Lakes")
        self.assertEqual(
            EventHelper.getShortName(
                "PNW FIRST Robotics Oregon City District Event"),
            "Oregon City")
        self.assertEqual(
            EventHelper.getShortName(
                "PNW FIRST Robotics Oregon State University District Event"),
            "Oregon State University")
        self.assertEqual(
            EventHelper.getShortName(
                "PNW FIRST Robotics Wilsonville District Event"),
            "Wilsonville")
        self.assertEqual(
            EventHelper.getShortName(
                "MAR FIRST Robotics Hatboro-Horsham District Competition"),
            "Hatboro-Horsham")
        self.assertEqual(
            EventHelper.getShortName(
                "MAR FIRST Robotics Springside Chestnut Hill District Competition"
            ), "Springside Chestnut Hill")
        self.assertEqual(
            EventHelper.getShortName("Greater Pittsburgh Regional"),
            "Greater Pittsburgh")
        self.assertEqual(
            EventHelper.getShortName("Autodesk PNW FRC Championship"),
            "Autodesk PNW")
        self.assertEqual(
            EventHelper.getShortName("Rhode Island District Event"),
            "Rhode Island")
        self.assertEqual(EventHelper.getShortName("Utah Regional"), "Utah")
        self.assertEqual(
            EventHelper.getShortName(
                "PNW FIRST Robotics Auburn District Event"), "Auburn")
        self.assertEqual(
            EventHelper.getShortName(
                "PNW FIRST Robotics Auburn Mountainview District Event"),
            "Auburn Mountainview")
        self.assertEqual(
            EventHelper.getShortName(
                "PNW FIRST Robotics Eastern Washington University District Event"
            ), "Eastern Washington University")
        self.assertEqual(
            EventHelper.getShortName(
                "PNW FIRST Robotics Central Washington University District Event"
            ), "Central Washington University")
        self.assertEqual(
            EventHelper.getShortName(
                "PNW FIRST Robotics Mt. Vernon District Event"), "Mt. Vernon")
        self.assertEqual(
            EventHelper.getShortName(
                "PNW FIRST Robotics Shorewood District Event"), "Shorewood")
        self.assertEqual(
            EventHelper.getShortName(
                "PNW FIRST Robotics Glacier Peak District Event"),
            "Glacier Peak")
        # 2015 edge cases
        self.assertEqual(
            EventHelper.getShortName("FIM District - Howell Event"), "Howell")
        self.assertEqual(
            EventHelper.getShortName("NE District - Granite State Event"),
            "Granite State")
        self.assertEqual(
            EventHelper.getShortName("PNW District - Oregon City Event"),
            "Oregon City")
        self.assertEqual(EventHelper.getShortName("IN District -Indianapolis"),
                         "Indianapolis")
        self.assertEqual(
            EventHelper.getShortName("MAR District - Mt. Olive Event"),
            "Mt. Olive")
        self.assertEqual(
            EventHelper.getShortName(
                "Israel Regional - see Site Info for additional information"),
            "Israel")
        self.assertEqual(
            EventHelper.getShortName(
                "IN District - Kokomo City of Firsts Event sponsored by AndyMark"
            ), "Kokomo City of Firsts")
        # 2017 edge cases
        self.assertEqual(
            EventHelper.getShortName(
                "ONT District - McMaster University Event"),
            "McMaster University")
        self.assertEqual(
            EventHelper.getShortName("FIRST Ontario Provincial Championship"),
            "Ontario")
        self.assertEqual(
            EventHelper.getShortName(
                "FIM District - Kettering University Event #1"),
            "Kettering University #1")
        self.assertEqual(EventHelper.getShortName("ISR District Event #1"),
                         "ISR #1")
        # 2018 edge cases
        self.assertEqual(
            EventHelper.getShortName("PNW District Clackamas Academy Event"),
            "Clackamas Academy")
        # 2019 edge cases
        self.assertEqual(
            EventHelper.getShortName("FMA District Hatboro-Horsham Event"),
            "Hatboro-Horsham")
        self.assertEqual(EventHelper.getShortName("FIT District Austin Event"),
                         "Austin")
Exemplo n.º 18
0
    def parse(self, response):
        events = []
        districts = {}

        cmp_hack_sitevar = Sitevar.get_or_insert('cmp_registration_hacks')
        divisions_to_skip = cmp_hack_sitevar.contents.get('divisions_to_skip', []) \
            if cmp_hack_sitevar else []
        event_name_override = cmp_hack_sitevar.contents.get('event_name_override', []) \
            if cmp_hack_sitevar else []
        events_to_change_dates = cmp_hack_sitevar.contents.get('set_start_to_last_day', []) \
            if cmp_hack_sitevar else []

        for event in response['Events']:
            code = event['code'].lower()

            api_event_type = event['type'].lower()
            event_type = EventType.PRESEASON if code == 'week0' else self.EVENT_TYPES.get(api_event_type, None)
            if event_type is None and not self.event_short:
                logging.warn("Event type '{}' not recognized!".format(api_event_type))
                continue

            # Some event types should be marked as unofficial, so sync is disabled
            official = True
            if api_event_type in self.NON_OFFICIAL_EVENT_TYPES:
                official = False

            name = event['name']
            short_name = EventHelper.getShortName(name, district_code=event['districtCode'])
            district_enum = EventHelper.parseDistrictName(event['districtCode'].lower()) if event['districtCode'] else DistrictType.NO_DISTRICT
            district_key = District.renderKeyName(self.season, event['districtCode'].lower()) if event['districtCode'] else None
            address = event.get('address')
            venue = event['venue']
            city = event['city']
            state_prov = event['stateprov']
            country = event['country']
            start = datetime.datetime.strptime(event['dateStart'], self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event['dateEnd'], self.DATE_FORMAT_STR)
            website = event.get('website')
            webcasts = [WebcastParser.webcast_dict_from_url(url) for url in event.get('webcasts', [])]

            # TODO read timezone from API

            # Special cases for district championship divisions
            if event_type == EventType.DISTRICT_CMP_DIVISION:
                split_name = name.split('-')
                short_name = '{} - {}'.format(
                    ''.join(item[0].upper() for item in split_name[0].split()),
                    split_name[-1].replace('Division', '').strip())

            # Special cases for champs
            if code in self.EVENT_CODE_EXCEPTIONS:
                code, short_name = self.EVENT_CODE_EXCEPTIONS[code]

                # FIRST indicates CMP registration before divisions are assigned by adding all teams
                # to Einstein. We will hack around that by not storing divisions and renaming
                # Einstein to simply "Championship" when certain sitevar flags are set

                if code in self.EINSTEIN_CODES:
                    override = [item for item in event_name_override if item['event'] == "{}{}".format(self.season, code)]
                    if override:
                        name = short_name.format(override[0]['name'])
                        short_name = short_name.format(override[0]['short_name'])
                else:  # Divisions
                    name = '{} Division'.format(short_name)
            elif self.event_short:
                code = self.event_short

            event_key = "{}{}".format(self.season, code)
            if event_key in divisions_to_skip:
                continue

            # Allow an overriding the start date to be the beginning of the last day
            if event_key in events_to_change_dates:
                start = end.replace(hour=0, minute=0, second=0, microsecond=0)

            events.append(Event(
                id=event_key,
                name=name,
                short_name=short_name,
                event_short=code,
                event_type_enum=event_type,
                official=official,
                start_date=start,
                end_date=end,
                venue=venue,
                city=city,
                state_prov=state_prov,
                country=country,
                venue_address=address,
                year=self.season,
                event_district_enum=district_enum,
                district_key=ndb.Key(District, district_key) if district_key else None,
                website=website,
                webcast_json=json.dumps(webcasts) if webcasts else None,
            ))

            # Build District Model
            if district_key and district_key not in districts:
                districts[district_key] = District(
                    id=district_key,
                    year=self.season,
                    abbreviation=event['districtCode'].lower(),
                )

        # Prep for division <-> parent associations
        district_champs_by_district = {}
        champ_events = []
        for event in events:
            if event.event_type_enum == EventType.DISTRICT_CMP:
                district_champs_by_district[event.district_key] = event
            elif event.event_type_enum == EventType.CMP_FINALS:
                champ_events.append(event)

        # Build district cmp division <-> parent associations based on district
        # Build cmp division <-> parent associations based on date
        for event in events:
            parent_event = None
            if event.event_type_enum == EventType.DISTRICT_CMP_DIVISION:
                parent_event = district_champs_by_district.get(event.district_key)
            elif event.event_type_enum == EventType.CMP_DIVISION:
                for parent_event in champ_events:
                    if abs(parent_event.end_date - event.end_date) < datetime.timedelta(days=1):
                        break
                else:
                    parent_event = None
            else:
                continue

            if parent_event is None:
                continue

            parent_event.divisions = sorted(parent_event.divisions + [event.key])
            event.parent_event = parent_event.key

        return events, list(districts.values())
 def test_event_get_short_name(self):
     """
     A bunch of tests from various years
     """
     self.assertEqual(EventHelper.getShortName("FIRST Robotics Competition"), "FIRST Robotics Competition")
     self.assertEqual(EventHelper.getShortName("National Championship"), "National Championship")
     self.assertEqual(EventHelper.getShortName("New England Tournament"), "New England")
     self.assertEqual(EventHelper.getShortName("FIRST National Championship"), "FIRST National Championship")
     self.assertEqual(EventHelper.getShortName("Motorola Midwest Regional"), "Motorola Midwest")
     self.assertEqual(EventHelper.getShortName("DEKA New England Regional"), "DEKA New England")
     self.assertEqual(EventHelper.getShortName("Johnson & Johnson Mid-Atlantic Regional"), "Johnson & Johnson Mid-Atlantic")
     self.assertEqual(EventHelper.getShortName("Great Lakes Regional"), "Great Lakes")
     self.assertEqual(EventHelper.getShortName("New England Regional"), "New England")
     self.assertEqual(EventHelper.getShortName("Southwest Regional"), "Southwest")
     self.assertEqual(EventHelper.getShortName("NASA Ames Regional"), "NASA Ames")
     self.assertEqual(EventHelper.getShortName("Kennedy Space Center Regional"), "Kennedy Space Center")
     self.assertEqual(EventHelper.getShortName("UTC New England Regional"), "UTC New England")
     self.assertEqual(EventHelper.getShortName("Philadelphia Alliance Regional"), "Philadelphia Alliance")
     self.assertEqual(EventHelper.getShortName("Kennedy Space Center Southeast Regional"), "Kennedy Space Center Southeast")
     self.assertEqual(EventHelper.getShortName("Long Island Regional"), "Long Island")
     self.assertEqual(EventHelper.getShortName("Lone Star Regional"), "Lone Star")
     self.assertEqual(EventHelper.getShortName("NASA Langley/VCU Regional"), "NASA Langley/VCU")
     self.assertEqual(EventHelper.getShortName("Archimedes Field"), "Archimedes")
     self.assertEqual(EventHelper.getShortName("Southern California Regional"), "Southern California")
     self.assertEqual(EventHelper.getShortName("Silicon Valley Regional"), "Silicon Valley")
     self.assertEqual(EventHelper.getShortName("UTC/New England Regional"), "UTC/New England")
     self.assertEqual(EventHelper.getShortName("Curie Field"), "Curie")
     self.assertEqual(EventHelper.getShortName("NASA KSC Southeast Regional"), "NASA KSC Southeast")
     self.assertEqual(EventHelper.getShortName("Galileo Field"), "Galileo")
     self.assertEqual(EventHelper.getShortName("West Michigan Regional"), "West Michigan")
     self.assertEqual(EventHelper.getShortName("Newton Field"), "Newton")
     self.assertEqual(EventHelper.getShortName("J&J Mid-Atlantic Regional"), "J&J Mid-Atlantic")
     self.assertEqual(EventHelper.getShortName("New York City Regional"), "New York City")
     self.assertEqual(EventHelper.getShortName("NASA Langley Regional"), "NASA Langley")
     self.assertEqual(EventHelper.getShortName("SBPLI Long Island Regional"), "SBPLI Long Island")
     self.assertEqual(EventHelper.getShortName("Western Michigan Regional"), "Western Michigan")
     self.assertEqual(EventHelper.getShortName("St. Louis Regional"), "St. Louis")
     self.assertEqual(EventHelper.getShortName("J&J Mid Atlantic Regional"), "J&J Mid Atlantic")
     self.assertEqual(EventHelper.getShortName("Buckeye Regional"), "Buckeye")
     self.assertEqual(EventHelper.getShortName("Canadian Regional"), "Canadian")
     self.assertEqual(EventHelper.getShortName("NASA Langley / VCU Regional"), "NASA Langley / VCU")
     self.assertEqual(EventHelper.getShortName("Pacific Northwest Regional"), "Pacific Northwest")
     self.assertEqual(EventHelper.getShortName("Arizona Regional"), "Arizona")
     self.assertEqual(EventHelper.getShortName("Einstein Field"), "Einstein")
     self.assertEqual(EventHelper.getShortName("Central Florida Regional"), "Central Florida")
     self.assertEqual(EventHelper.getShortName("Peachtree Regional"), "Peachtree")
     self.assertEqual(EventHelper.getShortName("Midwest Regional"), "Midwest")
     self.assertEqual(EventHelper.getShortName("Chesapeake Regional"), "Chesapeake")
     self.assertEqual(EventHelper.getShortName("BAE SYSTEMS Granite State Regional"), "BAE SYSTEMS Granite State")
     self.assertEqual(EventHelper.getShortName("Philadelphia Regional"), "Philadelphia")
     self.assertEqual(EventHelper.getShortName("Pittsburgh Regional"), "Pittsburgh")
     self.assertEqual(EventHelper.getShortName("Sacramento Regional"), "Sacramento")
     self.assertEqual(EventHelper.getShortName("NASA / VCU Regional"), "NASA / VCU")
     self.assertEqual(EventHelper.getShortName("Colorado Regional"), "Colorado")
     self.assertEqual(EventHelper.getShortName("Detroit Regional"), "Detroit")
     self.assertEqual(EventHelper.getShortName("Florida Regional"), "Florida")
     self.assertEqual(EventHelper.getShortName("New Jersey Regional"), "New Jersey")
     self.assertEqual(EventHelper.getShortName("Greater Toronto Regional"), "Greater Toronto")
     self.assertEqual(EventHelper.getShortName("Palmetto Regional"), "Palmetto")
     self.assertEqual(EventHelper.getShortName("Boilermaker Regional"), "Boilermaker")
     self.assertEqual(EventHelper.getShortName("GM/Technion University Israel Pilot Regional"), "GM/Technion University Israel Pilot")
     self.assertEqual(EventHelper.getShortName("Las Vegas Regional"), "Las Vegas")
     self.assertEqual(EventHelper.getShortName("Finger Lakes Regional"), "Finger Lakes")
     self.assertEqual(EventHelper.getShortName("Waterloo Regional"), "Waterloo")
     self.assertEqual(EventHelper.getShortName("GM/Technion Israel Regional"), "GM/Technion Israel")
     self.assertEqual(EventHelper.getShortName("Boston Regional"), "Boston")
     self.assertEqual(EventHelper.getShortName("Davis Sacramento Regional"), "Davis Sacramento")
     self.assertEqual(EventHelper.getShortName("Wisconsin Regional"), "Wisconsin")
     self.assertEqual(EventHelper.getShortName("Brazil Pilot"), "Brazil Pilot")
     self.assertEqual(EventHelper.getShortName("Los Angeles Regional"), "Los Angeles")
     self.assertEqual(EventHelper.getShortName("UTC Connecticut Regional"), "UTC Connecticut")
     self.assertEqual(EventHelper.getShortName("Greater Kansas City Regional"), "Greater Kansas City")
     self.assertEqual(EventHelper.getShortName("Bayou Regional"), "Bayou")
     self.assertEqual(EventHelper.getShortName("San Diego Regional"), "San Diego")
     self.assertEqual(EventHelper.getShortName("Brazil Regional"), "Brazil")
     self.assertEqual(EventHelper.getShortName("Connecticut Regional"), "Connecticut")
     self.assertEqual(EventHelper.getShortName("Hawaii Regional"), "Hawaii")
     self.assertEqual(EventHelper.getShortName("Israel Regional"), "Israel")
     self.assertEqual(EventHelper.getShortName("Minnesota Regional"), "Minnesota")
     self.assertEqual(EventHelper.getShortName("BAE Systems Granite State Regional"), "BAE Systems Granite State")
     self.assertEqual(EventHelper.getShortName("Oklahoma City Regional"), "Oklahoma City")
     self.assertEqual(EventHelper.getShortName("Oregon Regional"), "Oregon")
     self.assertEqual(EventHelper.getShortName("UC Davis Sacramento Regional"), "UC Davis Sacramento")
     self.assertEqual(EventHelper.getShortName("Microsoft Seattle Regional"), "Microsoft Seattle")
     self.assertEqual(EventHelper.getShortName("Dallas Regional, Sponsored by JCPenney and the JCPenney Afterschool Fund"), "Dallas")
     self.assertEqual(EventHelper.getShortName("Washington DC  Regional"), "Washington DC")
     self.assertEqual(EventHelper.getShortName("Detroit FIRST Robotics District Competition"), "Detroit")
     self.assertEqual(EventHelper.getShortName("Cass Tech FIRST Robotics District Competition"), "Cass Tech")
     self.assertEqual(EventHelper.getShortName("Kettering University FIRST Robotics District Competition"), "Kettering University")
     self.assertEqual(EventHelper.getShortName("Michigan FIRST Robotics Competition State Championship"), "Michigan")
     self.assertEqual(EventHelper.getShortName("Lansing FIRST Robotics District Competition"), "Lansing")
     self.assertEqual(EventHelper.getShortName("Traverse City FIRST Robotics District Competition"), "Traverse City")
     self.assertEqual(EventHelper.getShortName("West Michigan FIRST Robotics District Competition"), "West Michigan")
     self.assertEqual(EventHelper.getShortName("Minnesota 10000 Lakes Regional"), "Minnesota 10000 Lakes")
     self.assertEqual(EventHelper.getShortName("Minnesota North Star Regional"), "Minnesota North Star")
     self.assertEqual(EventHelper.getShortName("BAE Granite State Regional"), "BAE Granite State")
     self.assertEqual(EventHelper.getShortName("Troy FIRST Robotics District Competition"), "Troy")
     self.assertEqual(EventHelper.getShortName("NASA VCU Regional"), "NASA VCU")
     self.assertEqual(EventHelper.getShortName("Northeast Utilities FIRST Connecticut Regional"), "Northeast Utilities FIRST Connecticut")
     self.assertEqual(EventHelper.getShortName("Dallas Regional sponsored by JCPenney and the JCPenney Afterschool Fund"), "Dallas")
     self.assertEqual(EventHelper.getShortName("Hawaii Regional sponsored by BAE Systems"), "Hawaii")
     self.assertEqual(EventHelper.getShortName("North Carolina Regional"), "North Carolina")
     self.assertEqual(EventHelper.getShortName("Oklahoma Regional"), "Oklahoma")
     self.assertEqual(EventHelper.getShortName("Autodesk Oregon Regional"), "Autodesk Oregon")
     self.assertEqual(EventHelper.getShortName("Silicon Valley Regional sponsored by Google and BAE Systems"), "Silicon Valley")
     self.assertEqual(EventHelper.getShortName("Utah Regional sponsored by NASA & Platt"), "Utah")
     self.assertEqual(EventHelper.getShortName("Virginia Regional"), "Virginia")
     self.assertEqual(EventHelper.getShortName("Ann Arbor FIRST Robotics District Competition"), "Ann Arbor")
     self.assertEqual(EventHelper.getShortName("WPI Regional"), "WPI")
     self.assertEqual(EventHelper.getShortName("Dallas Regional sponsored by jcpenney"), "Dallas")
     self.assertEqual(EventHelper.getShortName("Lake Superior Regional"), "Lake Superior")
     self.assertEqual(EventHelper.getShortName("Michigan FIRST Robotics District Competition State Championship"), "Michigan")
     self.assertEqual(EventHelper.getShortName("BAE Systems/Granite State Regional"), "BAE Systems/Granite State")
     self.assertEqual(EventHelper.getShortName("Waterford FIRST Robotics District Competition"), "Waterford")
     self.assertEqual(EventHelper.getShortName("Greater Toronto East Regional"), "Greater Toronto East")
     self.assertEqual(EventHelper.getShortName("Greater Toronto West Regional"), "Greater Toronto West")
     self.assertEqual(EventHelper.getShortName("Alamo Regional"), "Alamo")
     self.assertEqual(EventHelper.getShortName("Niles FIRST Robotics District Competition"), "Niles")
     self.assertEqual(EventHelper.getShortName("Smoky Mountain Regional"), "Smoky Mountain")
     self.assertEqual(EventHelper.getShortName("Utah Regional co-sponsored by NASA and Platt"), "Utah")
     self.assertEqual(EventHelper.getShortName("Seattle Olympic Regional"), "Seattle Olympic")
     self.assertEqual(EventHelper.getShortName("Seattle Cascade Regional"), "Seattle Cascade")
     self.assertEqual(EventHelper.getShortName("Livonia FIRST Robotics District Competition"), "Livonia")
     self.assertEqual(EventHelper.getShortName("Central Valley Regional"), "Central Valley")
     self.assertEqual(EventHelper.getShortName("Dallas East Regional sponsored by jcpenney"), "Dallas East")
     self.assertEqual(EventHelper.getShortName("Dallas West Regional sponsored by jcpenney"), "Dallas West")
     self.assertEqual(EventHelper.getShortName("Orlando Regional"), "Orlando")
     self.assertEqual(EventHelper.getShortName("Michigan FRC State Championship"), "Michigan")
     self.assertEqual(EventHelper.getShortName("Gull Lake FIRST Robotics District Competition"), "Gull Lake")
     self.assertEqual(EventHelper.getShortName("Rutgers University FIRST Robotics District Competition"), "Rutgers University")
     self.assertEqual(EventHelper.getShortName("Mount Olive FIRST Robotics District Competition"), "Mount Olive")
     self.assertEqual(EventHelper.getShortName("Lenape FIRST Robotics District Competition"), "Lenape")
     self.assertEqual(EventHelper.getShortName("Queen City Regional"), "Queen City")
     self.assertEqual(EventHelper.getShortName("Mid-Atlantic Robotics FRC Region Championship"), "Mid-Atlantic Robotics")
     self.assertEqual(EventHelper.getShortName("Hatboro-Horsham FIRST Robotics District Competition"), "Hatboro-Horsham")
     self.assertEqual(EventHelper.getShortName("Chestnut Hill FIRST Robotics District Competition"), "Chestnut Hill")
     self.assertEqual(EventHelper.getShortName("Festival de Robotique FRC a Montreal Regional"), "Festival de Robotique")
     self.assertEqual(EventHelper.getShortName("South Florida Regional"), "South Florida")
     self.assertEqual(EventHelper.getShortName("Smoky Mountains Regional"), "Smoky Mountains")
     self.assertEqual(EventHelper.getShortName("Spokane Regional"), "Spokane")
     self.assertEqual(EventHelper.getShortName("Northville FIRST Robotics District Competition"), "Northville")
     self.assertEqual(EventHelper.getShortName("Western Canadian FRC Regional"), "Western Canadian")
     self.assertEqual(EventHelper.getShortName("Razorback Regional"), "Razorback")
     self.assertEqual(EventHelper.getShortName("Phoenix Regional"), "Phoenix")
     self.assertEqual(EventHelper.getShortName("Los Angeles Regional sponsored by The Roddenberry Foundation"), "Los Angeles")
     self.assertEqual(EventHelper.getShortName("Inland Empire Regional"), "Inland Empire")
     self.assertEqual(EventHelper.getShortName("Connecticut Regional sponsored by UTC"), "Connecticut")
     self.assertEqual(EventHelper.getShortName("Crossroads Regional"), "Crossroads")
     self.assertEqual(EventHelper.getShortName("Pine Tree Regional"), "Pine Tree")
     self.assertEqual(EventHelper.getShortName("Bedford FIRST Robotics District Competition"), "Bedford")
     self.assertEqual(EventHelper.getShortName("Grand Blanc FIRST Robotics District Competition"), "Grand Blanc")
     self.assertEqual(EventHelper.getShortName("St Joseph FIRST Robotics District Competition"), "St Joseph")
     self.assertEqual(EventHelper.getShortName("Northern Lights Regional"), "Northern Lights")
     self.assertEqual(EventHelper.getShortName("Bridgewater-Raritan FIRST Robotics District Competition"), "Bridgewater-Raritan")
     self.assertEqual(EventHelper.getShortName("TCNJ FIRST Robotics District Competition"), "TCNJ")
     self.assertEqual(EventHelper.getShortName("Lenape Seneca FIRST Robotics District Competition"), "Lenape Seneca")
     self.assertEqual(EventHelper.getShortName("Springside - Chestnut Hill FIRST Robotics District Competition"), "Springside - Chestnut Hill")
     self.assertEqual(EventHelper.getShortName("Festival de Robotique FRC de Montreal Regional"), "Festival de Robotique")
     self.assertEqual(EventHelper.getShortName("Dallas Regional"), "Dallas")
     self.assertEqual(EventHelper.getShortName("Hub City Regional"), "Hub City")
     self.assertEqual(EventHelper.getShortName("Alamo Regional sponsored by Rackspace Hosting"), "Alamo")
     self.assertEqual(EventHelper.getShortName("Utah Regional co-sponsored by the Larry H. Miller Group & Platt"), "Utah")
     self.assertEqual(EventHelper.getShortName("Seattle Regional"), "Seattle")
     self.assertEqual(EventHelper.getShortName("Central Washington Regional"), "Central Washington")
     self.assertEqual(EventHelper.getShortName("Western Canada Regional"), "Western Canada")
     self.assertEqual(EventHelper.getShortName("Arkansas Regional"), "Arkansas")
     self.assertEqual(EventHelper.getShortName("Groton District Event"), "Groton")
     self.assertEqual(EventHelper.getShortName("Hartford District Event"), "Hartford")
     self.assertEqual(EventHelper.getShortName("Southington District Event"), "Southington")
     self.assertEqual(EventHelper.getShortName("Greater DC Regional"), "Greater DC")
     self.assertEqual(EventHelper.getShortName("Central Illinois Regional"), "Central Illinois")
     self.assertEqual(EventHelper.getShortName("Northeastern University District Event"), "Northeastern University")
     self.assertEqual(EventHelper.getShortName("WPI District Event"), "WPI")
     self.assertEqual(EventHelper.getShortName("Pine Tree District Event"), "Pine Tree")
     self.assertEqual(EventHelper.getShortName("Center Line FIRST Robotics District Competition"), "Center Line")
     self.assertEqual(EventHelper.getShortName("Escanaba FIRST Robotics District Competition"), "Escanaba")
     self.assertEqual(EventHelper.getShortName("Howell FIRST Robotics District Competition"), "Howell")
     self.assertEqual(EventHelper.getShortName("St. Joseph FIRST Robotics District Competition"), "St. Joseph")
     self.assertEqual(EventHelper.getShortName("Southfield FIRST Robotics District Competition"), "Southfield")
     self.assertEqual(EventHelper.getShortName("Mexico City Regional"), "Mexico City")
     self.assertEqual(EventHelper.getShortName("New England FRC Region Championship"), "New England")
     self.assertEqual(EventHelper.getShortName("UNH District Event"), "UNH")
     self.assertEqual(EventHelper.getShortName("Granite State District Event"), "Granite State")
     self.assertEqual(EventHelper.getShortName("MAR FIRST Robotics Bridgewater-Raritan District Competition"), "Bridgewater-Raritan")
     self.assertEqual(EventHelper.getShortName("MAR FIRST Robotics Clifton District Competition"), "Clifton")
     self.assertEqual(EventHelper.getShortName("MAR FIRST Robotics Mt. Olive District Competition"), "Mt. Olive")
     self.assertEqual(EventHelper.getShortName("MAR FIRST Robotics Lenape-Seneca District Competition"), "Lenape-Seneca")
     self.assertEqual(EventHelper.getShortName("New York Tech Valley Regional"), "New York Tech Valley")
     self.assertEqual(EventHelper.getShortName("North Bay Regional"), "North Bay")
     self.assertEqual(EventHelper.getShortName("Windsor Essex Great Lakes Regional"), "Windsor Essex Great Lakes")
     self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Oregon City District Event"), "Oregon City")
     self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Oregon State University District Event"), "Oregon State University")
     self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Wilsonville District Event"), "Wilsonville")
     self.assertEqual(EventHelper.getShortName("MAR FIRST Robotics Hatboro-Horsham District Competition"), "Hatboro-Horsham")
     self.assertEqual(EventHelper.getShortName("MAR FIRST Robotics Springside Chestnut Hill District Competition"), "Springside Chestnut Hill")
     self.assertEqual(EventHelper.getShortName("Greater Pittsburgh Regional"), "Greater Pittsburgh")
     self.assertEqual(EventHelper.getShortName("Autodesk PNW FRC Championship"), "Autodesk PNW")
     self.assertEqual(EventHelper.getShortName("Rhode Island District Event"), "Rhode Island")
     self.assertEqual(EventHelper.getShortName("Utah Regional"), "Utah")
     self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Auburn District Event"), "Auburn")
     self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Auburn Mountainview District Event"), "Auburn Mountainview")
     self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Eastern Washington University District Event"), "Eastern Washington University")
     self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Central Washington University District Event"), "Central Washington University")
     self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Mt. Vernon District Event"), "Mt. Vernon")
     self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Shorewood District Event"), "Shorewood")
     self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Glacier Peak District Event"), "Glacier Peak")
Exemplo n.º 20
0
    def parse(self, response):
        events = []
        districts = {}

        cmp_hack_sitevar = Sitevar.get_or_insert('cmp_registration_hacks')
        store_cmp_division = cmp_hack_sitevar.contents.get('should_store_divisions', True) \
            if cmp_hack_sitevar else True
        einstein_name = cmp_hack_sitevar.contents.get('einstein_name', self.EINSTEIN_NAME_DEFAULT) \
            if cmp_hack_sitevar else self.EINSTEIN_NAME_DEFAULT
        einstein_short_name = cmp_hack_sitevar.contents.get('einstein_short_name', self.EINSTEIN_SHORT_NAME_DEFAULT) \
            if cmp_hack_sitevar else self.EINSTEIN_SHORT_NAME_DEFAULT
        change_einstein_dates = cmp_hack_sitevar.contents.get('should_change_einstein_dates', False) \
            if cmp_hack_sitevar else False

        for event in response['Events']:
            code = event['code'].lower()
            event_type = EventType.PRESEASON if code == 'week0' else self.EVENT_TYPES.get(event['type'].lower(), None)
            if event_type is None:
                logging.warn("Event type '{}' not recognized!".format(event['type']))
                continue
            name = event['name']
            short_name = EventHelper.getShortName(name)
            district_enum = EventHelper.parseDistrictName(event['districtCode'].lower()) if event['districtCode'] else DistrictType.NO_DISTRICT
            district_key = District.renderKeyName(self.season, event['districtCode'].lower()) if event['districtCode'] else None
            venue = event['venue']
            city = event['city']
            state_prov = event['stateprov']
            country = event['country']
            start = datetime.datetime.strptime(event['dateStart'], self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event['dateEnd'], self.DATE_FORMAT_STR)
            website = event.get('website')

            # TODO read timezone from API

            # Special cases for champs
            if code in self.EVENT_CODE_EXCEPTIONS:
                code, short_name = self.EVENT_CODE_EXCEPTIONS[code]

                # FIRST indicates CMP registration before divisions are assigned by adding all teams
                # to Einstein. We will hack around that by not storing divisions and renaming
                # Einstein to simply "Championship" when certain sitevar flags are set

                if code in self.EINSTEIN_CODES:
                    name = short_name.format(einstein_name)
                    short_name = short_name.format(einstein_short_name)
                    if change_einstein_dates:
                        # Set to beginning of last day
                        start = end.replace(hour=0, minute=0, second=0, microsecond=0)
                else:  # Divisions
                    name = '{} Division'.format(short_name)

                    # Allow skipping storing CMP divisions before they're announced
                    if not store_cmp_division:
                        continue

            events.append(Event(
                id="{}{}".format(self.season, code),
                name=name,
                short_name=short_name,
                event_short=code,
                event_type_enum=event_type,
                official=True,
                start_date=start,
                end_date=end,
                venue=venue,
                city=city,
                state_prov=state_prov,
                country=country,
                venue_address=None,  # Even though FRC API provides address, ElasticSearch is more detailed
                year=self.season,
                event_district_enum=district_enum,
                district_key=ndb.Key(District, district_key) if district_key else None,
                website=website,
            ))

            # Build District Model
            if district_key and district_key not in districts:
                districts[district_key] = District(
                    id=district_key,
                    year=self.season,
                    abbreviation=event['districtCode'].lower(),
                )
        return events, list(districts.values())
    def test_event_get_short_name(self):
        # Edge cases.
        self.assertEquals(EventHelper.getShortName("  { Random 2.718 stuff! }  "), "{ Random 2.718 stuff! }")
        self.assertEquals(EventHelper.getShortName("IN District -Bee's Knee's LX  "), "Bee's Knee's LX")
        self.assertEquals(EventHelper.getShortName("MAR District - Brussels Int'l Event sponsored by Sprouts"), "Brussels Int'l")
        self.assertEquals(EventHelper.getShortName("FIM District - Brussels Int'l Eventapalooza sponsored by TBA"), "Brussels Int'l")
        self.assertEquals(EventHelper.getShortName("NE District - ReallyBigEvent Scaling Up Every Year"), "ReallyBig")
        self.assertEquals(EventHelper.getShortName("PNW District -  Event!  "), "Event!")

        self.assertEquals(EventHelper.getShortName("FRC Detroit FIRST Robotics District Competition"), "Detroit")
        self.assertEquals(EventHelper.getShortName("FIRST Robotics Detroit FRC State Championship"), "Detroit")
        self.assertEquals(EventHelper.getShortName("Maui FIRST Robotics Regional and Luau"), "Maui")
        self.assertEquals(EventHelper.getShortName("California State Surf and Turf sponsored by TBA"), "California")
        self.assertEquals(EventHelper.getShortName("CarTalk Plaza Tournament"), "CarTalk Plaza")
        self.assertEquals(EventHelper.getShortName("IRI FRC Be-all and End-all"), "IRI")
        self.assertEquals(EventHelper.getShortName("   Ada    Field  "), "Ada")
        self.assertEquals(EventHelper.getShortName(" FIRST Robotics Einstein Field Equations "), "Einstein")
        self.assertEquals(EventHelper.getShortName("FRC Martin Luther King Jr. Region Championship"), "Martin Luther King Jr.")
        self.assertEquals(EventHelper.getShortName("PNW   Ada Lovelace    Tournament of Software  "), "Ada Lovelace")
        self.assertEquals(EventHelper.getShortName("\tPNW   Ada Lovelace    Tournament of Software  "), "Ada Lovelace")
        self.assertEquals(EventHelper.getShortName(" MAR FIRST Robotics   Rosa Parks    FRC Tournament of Roses  "), "Rosa Parks")
        self.assertEquals(EventHelper.getShortName("Washington D.C. FIRST Robotics Region"), "Washington D.C.")
        self.assertEquals(EventHelper.getShortName("Washington D.C. FIRST Robotics Region."), "Washington D.C.")
        self.assertEquals(EventHelper.getShortName("Washington D.C. FIRST Robotics Regiontonian"), "Washington D.C. FIRST Robotics Regiontonian")  # Does not match "Region\b"

        # Tests from various years
        self.assertEqual(EventHelper.getShortName("FIRST Robotics Competition"), "FIRST Robotics Competition")
        self.assertEqual(EventHelper.getShortName("National Championship"), "National Championship")
        self.assertEqual(EventHelper.getShortName("New England Tournament"), "New England")
        self.assertEqual(EventHelper.getShortName("FIRST National Championship"), "FIRST National Championship")
        self.assertEqual(EventHelper.getShortName("Motorola Midwest Regional"), "Motorola Midwest")
        self.assertEqual(EventHelper.getShortName("DEKA New England Regional"), "DEKA New England")
        self.assertEqual(EventHelper.getShortName("Johnson & Johnson Mid-Atlantic Regional"), "Johnson & Johnson Mid-Atlantic")
        self.assertEqual(EventHelper.getShortName("Great Lakes Regional"), "Great Lakes")
        self.assertEqual(EventHelper.getShortName("New England Regional"), "New England")
        self.assertEqual(EventHelper.getShortName("Southwest Regional"), "Southwest")
        self.assertEqual(EventHelper.getShortName("NASA Ames Regional"), "NASA Ames")
        self.assertEqual(EventHelper.getShortName("Kennedy Space Center Regional"), "Kennedy Space Center")
        self.assertEqual(EventHelper.getShortName("UTC New England Regional"), "UTC New England")
        self.assertEqual(EventHelper.getShortName("Philadelphia Alliance Regional"), "Philadelphia Alliance")
        self.assertEqual(EventHelper.getShortName("Kennedy Space Center Southeast Regional"), "Kennedy Space Center Southeast")
        self.assertEqual(EventHelper.getShortName("Long Island Regional"), "Long Island")
        self.assertEqual(EventHelper.getShortName("Lone Star Regional"), "Lone Star")
        self.assertEqual(EventHelper.getShortName("NASA Langley/VCU Regional"), "NASA Langley/VCU")
        self.assertEqual(EventHelper.getShortName("Archimedes Field"), "Archimedes")
        self.assertEqual(EventHelper.getShortName("Southern California Regional"), "Southern California")
        self.assertEqual(EventHelper.getShortName("Silicon Valley Regional"), "Silicon Valley")
        self.assertEqual(EventHelper.getShortName("UTC/New England Regional"), "UTC/New England")
        self.assertEqual(EventHelper.getShortName("Curie Field"), "Curie")
        self.assertEqual(EventHelper.getShortName("NASA KSC Southeast Regional"), "NASA KSC Southeast")
        self.assertEqual(EventHelper.getShortName("Galileo Field"), "Galileo")
        self.assertEqual(EventHelper.getShortName("West Michigan Regional"), "West Michigan")
        self.assertEqual(EventHelper.getShortName("Newton Field"), "Newton")
        self.assertEqual(EventHelper.getShortName("J&J Mid-Atlantic Regional"), "J&J Mid-Atlantic")
        self.assertEqual(EventHelper.getShortName("New York City Regional"), "New York City")
        self.assertEqual(EventHelper.getShortName("NASA Langley Regional"), "NASA Langley")
        self.assertEqual(EventHelper.getShortName("SBPLI Long Island Regional"), "SBPLI Long Island")
        self.assertEqual(EventHelper.getShortName("Western Michigan Regional"), "Western Michigan")
        self.assertEqual(EventHelper.getShortName("St. Louis Regional"), "St. Louis")
        self.assertEqual(EventHelper.getShortName("J&J Mid Atlantic Regional"), "J&J Mid Atlantic")
        self.assertEqual(EventHelper.getShortName("Buckeye Regional"), "Buckeye")
        self.assertEqual(EventHelper.getShortName("Canadian Regional"), "Canadian")
        self.assertEqual(EventHelper.getShortName("NASA Langley / VCU Regional"), "NASA Langley / VCU")
        self.assertEqual(EventHelper.getShortName("Pacific Northwest Regional"), "Pacific Northwest")
        self.assertEqual(EventHelper.getShortName("Arizona Regional"), "Arizona")
        self.assertEqual(EventHelper.getShortName("Einstein Field"), "Einstein")
        self.assertEqual(EventHelper.getShortName("Central Florida Regional"), "Central Florida")
        self.assertEqual(EventHelper.getShortName("Peachtree Regional"), "Peachtree")
        self.assertEqual(EventHelper.getShortName("Midwest Regional"), "Midwest")
        self.assertEqual(EventHelper.getShortName("Chesapeake Regional"), "Chesapeake")
        self.assertEqual(EventHelper.getShortName("BAE SYSTEMS Granite State Regional"), "BAE SYSTEMS Granite State")
        self.assertEqual(EventHelper.getShortName("Philadelphia Regional"), "Philadelphia")
        self.assertEqual(EventHelper.getShortName("Pittsburgh Regional"), "Pittsburgh")
        self.assertEqual(EventHelper.getShortName("Sacramento Regional"), "Sacramento")
        self.assertEqual(EventHelper.getShortName("NASA / VCU Regional"), "NASA / VCU")
        self.assertEqual(EventHelper.getShortName("Colorado Regional"), "Colorado")
        self.assertEqual(EventHelper.getShortName("Detroit Regional"), "Detroit")
        self.assertEqual(EventHelper.getShortName("Florida Regional"), "Florida")
        self.assertEqual(EventHelper.getShortName("New Jersey Regional"), "New Jersey")
        self.assertEqual(EventHelper.getShortName("Greater Toronto Regional"), "Greater Toronto")
        self.assertEqual(EventHelper.getShortName("Palmetto Regional"), "Palmetto")
        self.assertEqual(EventHelper.getShortName("Boilermaker Regional"), "Boilermaker")
        self.assertEqual(EventHelper.getShortName("GM/Technion University Israel Pilot Regional"), "GM/Technion University Israel Pilot")
        self.assertEqual(EventHelper.getShortName("Las Vegas Regional"), "Las Vegas")
        self.assertEqual(EventHelper.getShortName("Finger Lakes Regional"), "Finger Lakes")
        self.assertEqual(EventHelper.getShortName("Waterloo Regional"), "Waterloo")
        self.assertEqual(EventHelper.getShortName("GM/Technion Israel Regional"), "GM/Technion Israel")
        self.assertEqual(EventHelper.getShortName("Boston Regional"), "Boston")
        self.assertEqual(EventHelper.getShortName("Davis Sacramento Regional"), "Davis Sacramento")
        self.assertEqual(EventHelper.getShortName("Wisconsin Regional"), "Wisconsin")
        self.assertEqual(EventHelper.getShortName("Brazil Pilot"), "Brazil Pilot")
        self.assertEqual(EventHelper.getShortName("Los Angeles Regional"), "Los Angeles")
        self.assertEqual(EventHelper.getShortName("UTC Connecticut Regional"), "UTC Connecticut")
        self.assertEqual(EventHelper.getShortName("Greater Kansas City Regional"), "Greater Kansas City")
        self.assertEqual(EventHelper.getShortName("Bayou Regional"), "Bayou")
        self.assertEqual(EventHelper.getShortName("San Diego Regional"), "San Diego")
        self.assertEqual(EventHelper.getShortName("Brazil Regional"), "Brazil")
        self.assertEqual(EventHelper.getShortName("Connecticut Regional"), "Connecticut")
        self.assertEqual(EventHelper.getShortName("Hawaii Regional"), "Hawaii")
        self.assertEqual(EventHelper.getShortName("Israel Regional"), "Israel")
        self.assertEqual(EventHelper.getShortName("Minnesota Regional"), "Minnesota")
        self.assertEqual(EventHelper.getShortName("BAE Systems Granite State Regional"), "BAE Systems Granite State")
        self.assertEqual(EventHelper.getShortName("Oklahoma City Regional"), "Oklahoma City")
        self.assertEqual(EventHelper.getShortName("Oregon Regional"), "Oregon")
        self.assertEqual(EventHelper.getShortName("UC Davis Sacramento Regional"), "UC Davis Sacramento")
        self.assertEqual(EventHelper.getShortName("Microsoft Seattle Regional"), "Microsoft Seattle")
        self.assertEqual(EventHelper.getShortName("Dallas Regional, Sponsored by JCPenney and the JCPenney Afterschool Fund"), "Dallas")
        self.assertEqual(EventHelper.getShortName("Washington DC  Regional"), "Washington DC")
        self.assertEqual(EventHelper.getShortName("Detroit FIRST Robotics District Competition"), "Detroit")
        self.assertEqual(EventHelper.getShortName("Cass Tech FIRST Robotics District Competition"), "Cass Tech")
        self.assertEqual(EventHelper.getShortName("Kettering University FIRST Robotics District Competition"), "Kettering University")
        self.assertEqual(EventHelper.getShortName("Michigan FIRST Robotics Competition State Championship"), "Michigan")
        self.assertEqual(EventHelper.getShortName("Lansing FIRST Robotics District Competition"), "Lansing")
        self.assertEqual(EventHelper.getShortName("Traverse City FIRST Robotics District Competition"), "Traverse City")
        self.assertEqual(EventHelper.getShortName("West Michigan FIRST Robotics District Competition"), "West Michigan")
        self.assertEqual(EventHelper.getShortName("Minnesota 10000 Lakes Regional"), "Minnesota 10000 Lakes")
        self.assertEqual(EventHelper.getShortName("Minnesota North Star Regional"), "Minnesota North Star")
        self.assertEqual(EventHelper.getShortName("BAE Granite State Regional"), "BAE Granite State")
        self.assertEqual(EventHelper.getShortName("Troy FIRST Robotics District Competition"), "Troy")
        self.assertEqual(EventHelper.getShortName("NASA VCU Regional"), "NASA VCU")
        self.assertEqual(EventHelper.getShortName("Northeast Utilities FIRST Connecticut Regional"), "Northeast Utilities FIRST Connecticut")
        self.assertEqual(EventHelper.getShortName("Dallas Regional sponsored by JCPenney and the JCPenney Afterschool Fund"), "Dallas")
        self.assertEqual(EventHelper.getShortName("Hawaii Regional sponsored by BAE Systems"), "Hawaii")
        self.assertEqual(EventHelper.getShortName("North Carolina Regional"), "North Carolina")
        self.assertEqual(EventHelper.getShortName("Oklahoma Regional"), "Oklahoma")
        self.assertEqual(EventHelper.getShortName("Autodesk Oregon Regional"), "Autodesk Oregon")
        self.assertEqual(EventHelper.getShortName("Silicon Valley Regional sponsored by Google and BAE Systems"), "Silicon Valley")
        self.assertEqual(EventHelper.getShortName("Utah Regional sponsored by NASA & Platt"), "Utah")
        self.assertEqual(EventHelper.getShortName("Virginia Regional"), "Virginia")
        self.assertEqual(EventHelper.getShortName("Ann Arbor FIRST Robotics District Competition"), "Ann Arbor")
        self.assertEqual(EventHelper.getShortName("WPI Regional"), "WPI")
        self.assertEqual(EventHelper.getShortName("Dallas Regional sponsored by jcpenney"), "Dallas")
        self.assertEqual(EventHelper.getShortName("Lake Superior Regional"), "Lake Superior")
        self.assertEqual(EventHelper.getShortName("Michigan FIRST Robotics District Competition State Championship"), "Michigan")
        self.assertEqual(EventHelper.getShortName("BAE Systems/Granite State Regional"), "BAE Systems/Granite State")
        self.assertEqual(EventHelper.getShortName("Waterford FIRST Robotics District Competition"), "Waterford")
        self.assertEqual(EventHelper.getShortName("Greater Toronto East Regional"), "Greater Toronto East")
        self.assertEqual(EventHelper.getShortName("Greater Toronto West Regional"), "Greater Toronto West")
        self.assertEqual(EventHelper.getShortName("Alamo Regional"), "Alamo")
        self.assertEqual(EventHelper.getShortName("Niles FIRST Robotics District Competition"), "Niles")
        self.assertEqual(EventHelper.getShortName("Smoky Mountain Regional"), "Smoky Mountain")
        self.assertEqual(EventHelper.getShortName("Utah Regional co-sponsored by NASA and Platt"), "Utah")
        self.assertEqual(EventHelper.getShortName("Seattle Olympic Regional"), "Seattle Olympic")
        self.assertEqual(EventHelper.getShortName("Seattle Cascade Regional"), "Seattle Cascade")
        self.assertEqual(EventHelper.getShortName("Livonia FIRST Robotics District Competition"), "Livonia")
        self.assertEqual(EventHelper.getShortName("Central Valley Regional"), "Central Valley")
        self.assertEqual(EventHelper.getShortName("Dallas East Regional sponsored by jcpenney"), "Dallas East")
        self.assertEqual(EventHelper.getShortName("Dallas West Regional sponsored by jcpenney"), "Dallas West")
        self.assertEqual(EventHelper.getShortName("Orlando Regional"), "Orlando")
        self.assertEqual(EventHelper.getShortName("Michigan FRC State Championship"), "Michigan")
        self.assertEqual(EventHelper.getShortName("Gull Lake FIRST Robotics District Competition"), "Gull Lake")
        self.assertEqual(EventHelper.getShortName("Rutgers University FIRST Robotics District Competition"), "Rutgers University")
        self.assertEqual(EventHelper.getShortName("Mount Olive FIRST Robotics District Competition"), "Mount Olive")
        self.assertEqual(EventHelper.getShortName("Lenape FIRST Robotics District Competition"), "Lenape")
        self.assertEqual(EventHelper.getShortName("Queen City Regional"), "Queen City")
        self.assertEqual(EventHelper.getShortName("Mid-Atlantic Robotics FRC Region Championship"), "Mid-Atlantic Robotics")
        self.assertEqual(EventHelper.getShortName("Hatboro-Horsham FIRST Robotics District Competition"), "Hatboro-Horsham")
        self.assertEqual(EventHelper.getShortName("Chestnut Hill FIRST Robotics District Competition"), "Chestnut Hill")
        self.assertEqual(EventHelper.getShortName("Festival de Robotique FRC a Montreal Regional"), "Festival de Robotique")
        self.assertEqual(EventHelper.getShortName("South Florida Regional"), "South Florida")
        self.assertEqual(EventHelper.getShortName("Smoky Mountains Regional"), "Smoky Mountains")
        self.assertEqual(EventHelper.getShortName("Spokane Regional"), "Spokane")
        self.assertEqual(EventHelper.getShortName("Northville FIRST Robotics District Competition"), "Northville")
        self.assertEqual(EventHelper.getShortName("Western Canadian FRC Regional"), "Western Canadian")
        self.assertEqual(EventHelper.getShortName("Razorback Regional"), "Razorback")
        self.assertEqual(EventHelper.getShortName("Phoenix Regional"), "Phoenix")
        self.assertEqual(EventHelper.getShortName("Los Angeles Regional sponsored by The Roddenberry Foundation"), "Los Angeles")
        self.assertEqual(EventHelper.getShortName("Inland Empire Regional"), "Inland Empire")
        self.assertEqual(EventHelper.getShortName("Connecticut Regional sponsored by UTC"), "Connecticut")
        self.assertEqual(EventHelper.getShortName("Crossroads Regional"), "Crossroads")
        self.assertEqual(EventHelper.getShortName("Pine Tree Regional"), "Pine Tree")
        self.assertEqual(EventHelper.getShortName("Bedford FIRST Robotics District Competition"), "Bedford")
        self.assertEqual(EventHelper.getShortName("Grand Blanc FIRST Robotics District Competition"), "Grand Blanc")
        self.assertEqual(EventHelper.getShortName("St Joseph FIRST Robotics District Competition"), "St Joseph")
        self.assertEqual(EventHelper.getShortName("Northern Lights Regional"), "Northern Lights")
        self.assertEqual(EventHelper.getShortName("Bridgewater-Raritan FIRST Robotics District Competition"), "Bridgewater-Raritan")
        self.assertEqual(EventHelper.getShortName("TCNJ FIRST Robotics District Competition"), "TCNJ")
        self.assertEqual(EventHelper.getShortName("Lenape Seneca FIRST Robotics District Competition"), "Lenape Seneca")
        self.assertEqual(EventHelper.getShortName("Springside - Chestnut Hill FIRST Robotics District Competition"), "Springside - Chestnut Hill")
        self.assertEqual(EventHelper.getShortName("Festival de Robotique FRC de Montreal Regional"), "Festival de Robotique")
        self.assertEqual(EventHelper.getShortName("Dallas Regional"), "Dallas")
        self.assertEqual(EventHelper.getShortName("Hub City Regional"), "Hub City")
        self.assertEqual(EventHelper.getShortName("Alamo Regional sponsored by Rackspace Hosting"), "Alamo")
        self.assertEqual(EventHelper.getShortName("Utah Regional co-sponsored by the Larry H. Miller Group & Platt"), "Utah")
        self.assertEqual(EventHelper.getShortName("Seattle Regional"), "Seattle")
        self.assertEqual(EventHelper.getShortName("Central Washington Regional"), "Central Washington")
        self.assertEqual(EventHelper.getShortName("Western Canada Regional"), "Western Canada")
        self.assertEqual(EventHelper.getShortName("Arkansas Regional"), "Arkansas")
        self.assertEqual(EventHelper.getShortName("Groton District Event"), "Groton")
        self.assertEqual(EventHelper.getShortName("Hartford District Event"), "Hartford")
        self.assertEqual(EventHelper.getShortName("Southington District Event"), "Southington")
        self.assertEqual(EventHelper.getShortName("Greater DC Regional"), "Greater DC")
        self.assertEqual(EventHelper.getShortName("Central Illinois Regional"), "Central Illinois")
        self.assertEqual(EventHelper.getShortName("Northeastern University District Event"), "Northeastern University")
        self.assertEqual(EventHelper.getShortName("WPI District Event"), "WPI")
        self.assertEqual(EventHelper.getShortName("Pine Tree District Event"), "Pine Tree")
        self.assertEqual(EventHelper.getShortName("Center Line FIRST Robotics District Competition"), "Center Line")
        self.assertEqual(EventHelper.getShortName("Escanaba FIRST Robotics District Competition"), "Escanaba")
        self.assertEqual(EventHelper.getShortName("Howell FIRST Robotics District Competition"), "Howell")
        self.assertEqual(EventHelper.getShortName("St. Joseph FIRST Robotics District Competition"), "St. Joseph")
        self.assertEqual(EventHelper.getShortName("Southfield FIRST Robotics District Competition"), "Southfield")
        self.assertEqual(EventHelper.getShortName("Mexico City Regional"), "Mexico City")
        self.assertEqual(EventHelper.getShortName("New England FRC Region Championship"), "New England")
        self.assertEqual(EventHelper.getShortName("UNH District Event"), "UNH")
        self.assertEqual(EventHelper.getShortName("Granite State District Event"), "Granite State")
        self.assertEqual(EventHelper.getShortName("MAR FIRST Robotics Bridgewater-Raritan District Competition"), "Bridgewater-Raritan")
        self.assertEqual(EventHelper.getShortName("MAR FIRST Robotics Clifton District Competition"), "Clifton")
        self.assertEqual(EventHelper.getShortName("MAR FIRST Robotics Mt. Olive District Competition"), "Mt. Olive")
        self.assertEqual(EventHelper.getShortName("MAR FIRST Robotics Lenape-Seneca District Competition"), "Lenape-Seneca")
        self.assertEqual(EventHelper.getShortName("New York Tech Valley Regional"), "New York Tech Valley")
        self.assertEqual(EventHelper.getShortName("North Bay Regional"), "North Bay")
        self.assertEqual(EventHelper.getShortName("Windsor Essex Great Lakes Regional"), "Windsor Essex Great Lakes")
        self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Oregon City District Event"), "Oregon City")
        self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Oregon State University District Event"), "Oregon State University")
        self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Wilsonville District Event"), "Wilsonville")
        self.assertEqual(EventHelper.getShortName("MAR FIRST Robotics Hatboro-Horsham District Competition"), "Hatboro-Horsham")
        self.assertEqual(EventHelper.getShortName("MAR FIRST Robotics Springside Chestnut Hill District Competition"), "Springside Chestnut Hill")
        self.assertEqual(EventHelper.getShortName("Greater Pittsburgh Regional"), "Greater Pittsburgh")
        self.assertEqual(EventHelper.getShortName("Autodesk PNW FRC Championship"), "Autodesk PNW")
        self.assertEqual(EventHelper.getShortName("Rhode Island District Event"), "Rhode Island")
        self.assertEqual(EventHelper.getShortName("Utah Regional"), "Utah")
        self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Auburn District Event"), "Auburn")
        self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Auburn Mountainview District Event"), "Auburn Mountainview")
        self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Eastern Washington University District Event"), "Eastern Washington University")
        self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Central Washington University District Event"), "Central Washington University")
        self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Mt. Vernon District Event"), "Mt. Vernon")
        self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Shorewood District Event"), "Shorewood")
        self.assertEqual(EventHelper.getShortName("PNW FIRST Robotics Glacier Peak District Event"), "Glacier Peak")
        # 2015 edge cases
        self.assertEqual(EventHelper.getShortName("FIM District - Howell Event"), "Howell")
        self.assertEqual(EventHelper.getShortName("NE District - Granite State Event"), "Granite State")
        self.assertEqual(EventHelper.getShortName("PNW District - Oregon City Event"), "Oregon City")
        self.assertEqual(EventHelper.getShortName("IN District -Indianapolis"), "Indianapolis")
        self.assertEqual(EventHelper.getShortName("MAR District - Mt. Olive Event"), "Mt. Olive")
        self.assertEqual(EventHelper.getShortName("Israel Regional - see Site Info for additional information"), "Israel")
        self.assertEqual(EventHelper.getShortName("IN District - Kokomo City of Firsts Event sponsored by AndyMark"), "Kokomo City of Firsts")
        # 2017 edge cases
        self.assertEqual(EventHelper.getShortName("ONT District - McMaster University Event"), "McMaster University")
        self.assertEqual(EventHelper.getShortName("FIRST Ontario Provincial Championship"), "Ontario")
        self.assertEqual(EventHelper.getShortName("FIM District - Kettering University Event #1"), "Kettering University #1")
        self.assertEqual(EventHelper.getShortName("ISR District Event #1"), "ISR #1")
        # 2018 edge cases
        self.assertEqual(EventHelper.getShortName("PNW District Clackamas Academy Event"), "Clackamas Academy")
        # 2019 edge cases
        self.assertEqual(EventHelper.getShortName("FMA District Hatboro-Horsham Event"), "Hatboro-Horsham")
        self.assertEqual(EventHelper.getShortName("FIT District Austin Event"), "Austin")
    def parse(self, response):
        events = []
        districts = {}

        cmp_hack_sitevar = Sitevar.get_or_insert('cmp_registration_hacks')
        divisions_to_skip = cmp_hack_sitevar.contents.get('divisions_to_skip', []) \
            if cmp_hack_sitevar else []
        event_name_override = cmp_hack_sitevar.contents.get('event_name_override', []) \
            if cmp_hack_sitevar else []
        events_to_change_dates = cmp_hack_sitevar.contents.get('set_start_to_last_day', []) \
            if cmp_hack_sitevar else []

        for event in response['Events']:
            code = event['code'].lower()
            event_type = EventType.PRESEASON if code == 'week0' else self.EVENT_TYPES.get(event['type'].lower(), None)
            if event_type is None:
                logging.warn("Event type '{}' not recognized!".format(event['type']))
                continue
            name = event['name']
            short_name = EventHelper.getShortName(name)
            district_enum = EventHelper.parseDistrictName(event['districtCode'].lower()) if event['districtCode'] else DistrictType.NO_DISTRICT
            district_key = District.renderKeyName(self.season, event['districtCode'].lower()) if event['districtCode'] else None
            venue = event['venue']
            city = event['city']
            state_prov = event['stateprov']
            country = event['country']
            start = datetime.datetime.strptime(event['dateStart'], self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event['dateEnd'], self.DATE_FORMAT_STR)
            website = event.get('website')

            # TODO read timezone from API

            # Special cases for district championship divisions
            if event_type == EventType.DISTRICT_CMP_DIVISION:
                split_name = name.split('-')
                short_name = '{} - {}'.format(
                    ''.join(item[0].upper() for item in split_name[0].split()),
                    split_name[-1].replace('Division', '').strip())

            # Special cases for champs
            if code in self.EVENT_CODE_EXCEPTIONS:
                code, short_name = self.EVENT_CODE_EXCEPTIONS[code]

                # FIRST indicates CMP registration before divisions are assigned by adding all teams
                # to Einstein. We will hack around that by not storing divisions and renaming
                # Einstein to simply "Championship" when certain sitevar flags are set

                if code in self.EINSTEIN_CODES:
                    override = [item for item in event_name_override if item['event'] == "{}{}".format(self.season, code)]
                    if override:
                        name = short_name.format(override[0]['name'])
                        short_name = short_name.format(override[0]['short_name'])
                else:  # Divisions
                    name = '{} Division'.format(short_name)

            event_key = "{}{}".format(self.season, code)
            if event_key in divisions_to_skip:
                continue

            # Allow an overriding the start date to be the beginning of the last day
            if event_key in events_to_change_dates:
                start = end.replace(hour=0, minute=0, second=0, microsecond=0)

            events.append(Event(
                id=event_key,
                name=name,
                short_name=short_name,
                event_short=code,
                event_type_enum=event_type,
                official=True,
                start_date=start,
                end_date=end,
                venue=venue,
                city=city,
                state_prov=state_prov,
                country=country,
                venue_address=None,  # Even though FRC API provides address, ElasticSearch is more detailed
                year=self.season,
                event_district_enum=district_enum,
                district_key=ndb.Key(District, district_key) if district_key else None,
                website=website,
            ))

            # Build District Model
            if district_key and district_key not in districts:
                districts[district_key] = District(
                    id=district_key,
                    year=self.season,
                    abbreviation=event['districtCode'].lower(),
                )
        return events, list(districts.values())
 def test_event_get_short_name(self):
     """
     A bunch of tests from various years
     """
     self.assertEqual(
         EventHelper.getShortName("FIRST Robotics Competition"),
         "FIRST Robotics Competition")
     self.assertEqual(EventHelper.getShortName("National Championship"),
                      "National Championship")
     self.assertEqual(EventHelper.getShortName("New England Tournament"),
                      "New England")
     self.assertEqual(
         EventHelper.getShortName("FIRST National Championship"),
         "FIRST National Championship")
     self.assertEqual(EventHelper.getShortName("Motorola Midwest Regional"),
                      "Motorola Midwest")
     self.assertEqual(EventHelper.getShortName("DEKA New England Regional"),
                      "DEKA New England")
     self.assertEqual(
         EventHelper.getShortName(
             "Johnson & Johnson Mid-Atlantic Regional"),
         "Johnson & Johnson Mid-Atlantic")
     self.assertEqual(EventHelper.getShortName("Great Lakes Regional"),
                      "Great Lakes")
     self.assertEqual(EventHelper.getShortName("New England Regional"),
                      "New England")
     self.assertEqual(EventHelper.getShortName("Southwest Regional"),
                      "Southwest")
     self.assertEqual(EventHelper.getShortName("NASA Ames Regional"),
                      "NASA Ames")
     self.assertEqual(
         EventHelper.getShortName("Kennedy Space Center Regional"),
         "Kennedy Space Center")
     self.assertEqual(EventHelper.getShortName("UTC New England Regional"),
                      "UTC New England")
     self.assertEqual(
         EventHelper.getShortName("Philadelphia Alliance Regional"),
         "Philadelphia Alliance")
     self.assertEqual(
         EventHelper.getShortName(
             "Kennedy Space Center Southeast Regional"),
         "Kennedy Space Center Southeast")
     self.assertEqual(EventHelper.getShortName("Long Island Regional"),
                      "Long Island")
     self.assertEqual(EventHelper.getShortName("Lone Star Regional"),
                      "Lone Star")
     self.assertEqual(EventHelper.getShortName("NASA Langley/VCU Regional"),
                      "NASA Langley/VCU")
     self.assertEqual(EventHelper.getShortName("Archimedes Field"),
                      "Archimedes")
     self.assertEqual(
         EventHelper.getShortName("Southern California Regional"),
         "Southern California")
     self.assertEqual(EventHelper.getShortName("Silicon Valley Regional"),
                      "Silicon Valley")
     self.assertEqual(EventHelper.getShortName("UTC/New England Regional"),
                      "UTC/New England")
     self.assertEqual(EventHelper.getShortName("Curie Field"), "Curie")
     self.assertEqual(
         EventHelper.getShortName("NASA KSC Southeast Regional"),
         "NASA KSC Southeast")
     self.assertEqual(EventHelper.getShortName("Galileo Field"), "Galileo")
     self.assertEqual(EventHelper.getShortName("West Michigan Regional"),
                      "West Michigan")
     self.assertEqual(EventHelper.getShortName("Newton Field"), "Newton")
     self.assertEqual(EventHelper.getShortName("J&J Mid-Atlantic Regional"),
                      "J&J Mid-Atlantic")
     self.assertEqual(EventHelper.getShortName("New York City Regional"),
                      "New York City")
     self.assertEqual(EventHelper.getShortName("NASA Langley Regional"),
                      "NASA Langley")
     self.assertEqual(
         EventHelper.getShortName("SBPLI Long Island Regional"),
         "SBPLI Long Island")
     self.assertEqual(EventHelper.getShortName("Western Michigan Regional"),
                      "Western Michigan")
     self.assertEqual(EventHelper.getShortName("St. Louis Regional"),
                      "St. Louis")
     self.assertEqual(EventHelper.getShortName("J&J Mid Atlantic Regional"),
                      "J&J Mid Atlantic")
     self.assertEqual(EventHelper.getShortName("Buckeye Regional"),
                      "Buckeye")
     self.assertEqual(EventHelper.getShortName("Canadian Regional"),
                      "Canadian")
     self.assertEqual(
         EventHelper.getShortName("NASA Langley / VCU Regional"),
         "NASA Langley / VCU")
     self.assertEqual(
         EventHelper.getShortName("Pacific Northwest Regional"),
         "Pacific Northwest")
     self.assertEqual(EventHelper.getShortName("Arizona Regional"),
                      "Arizona")
     self.assertEqual(EventHelper.getShortName("Einstein Field"),
                      "Einstein")
     self.assertEqual(EventHelper.getShortName("Central Florida Regional"),
                      "Central Florida")
     self.assertEqual(EventHelper.getShortName("Peachtree Regional"),
                      "Peachtree")
     self.assertEqual(EventHelper.getShortName("Midwest Regional"),
                      "Midwest")
     self.assertEqual(EventHelper.getShortName("Chesapeake Regional"),
                      "Chesapeake")
     self.assertEqual(
         EventHelper.getShortName("BAE SYSTEMS Granite State Regional"),
         "BAE SYSTEMS Granite State")
     self.assertEqual(EventHelper.getShortName("Philadelphia Regional"),
                      "Philadelphia")
     self.assertEqual(EventHelper.getShortName("Pittsburgh Regional"),
                      "Pittsburgh")
     self.assertEqual(EventHelper.getShortName("Sacramento Regional"),
                      "Sacramento")
     self.assertEqual(EventHelper.getShortName("NASA / VCU Regional"),
                      "NASA / VCU")
     self.assertEqual(EventHelper.getShortName("Colorado Regional"),
                      "Colorado")
     self.assertEqual(EventHelper.getShortName("Detroit Regional"),
                      "Detroit")
     self.assertEqual(EventHelper.getShortName("Florida Regional"),
                      "Florida")
     self.assertEqual(EventHelper.getShortName("New Jersey Regional"),
                      "New Jersey")
     self.assertEqual(EventHelper.getShortName("Greater Toronto Regional"),
                      "Greater Toronto")
     self.assertEqual(EventHelper.getShortName("Palmetto Regional"),
                      "Palmetto")
     self.assertEqual(EventHelper.getShortName("Boilermaker Regional"),
                      "Boilermaker")
     self.assertEqual(
         EventHelper.getShortName(
             "GM/Technion University Israel Pilot Regional"),
         "GM/Technion University Israel Pilot")
     self.assertEqual(EventHelper.getShortName("Las Vegas Regional"),
                      "Las Vegas")
     self.assertEqual(EventHelper.getShortName("Finger Lakes Regional"),
                      "Finger Lakes")
     self.assertEqual(EventHelper.getShortName("Waterloo Regional"),
                      "Waterloo")
     self.assertEqual(
         EventHelper.getShortName("GM/Technion Israel Regional"),
         "GM/Technion Israel")
     self.assertEqual(EventHelper.getShortName("Boston Regional"), "Boston")
     self.assertEqual(EventHelper.getShortName("Davis Sacramento Regional"),
                      "Davis Sacramento")
     self.assertEqual(EventHelper.getShortName("Wisconsin Regional"),
                      "Wisconsin")
     self.assertEqual(EventHelper.getShortName("Brazil Pilot"),
                      "Brazil Pilot")
     self.assertEqual(EventHelper.getShortName("Los Angeles Regional"),
                      "Los Angeles")
     self.assertEqual(EventHelper.getShortName("UTC Connecticut Regional"),
                      "UTC Connecticut")
     self.assertEqual(
         EventHelper.getShortName("Greater Kansas City Regional"),
         "Greater Kansas City")
     self.assertEqual(EventHelper.getShortName("Bayou Regional"), "Bayou")
     self.assertEqual(EventHelper.getShortName("San Diego Regional"),
                      "San Diego")
     self.assertEqual(EventHelper.getShortName("Brazil Regional"), "Brazil")
     self.assertEqual(EventHelper.getShortName("Connecticut Regional"),
                      "Connecticut")
     self.assertEqual(EventHelper.getShortName("Hawaii Regional"), "Hawaii")
     self.assertEqual(EventHelper.getShortName("Israel Regional"), "Israel")
     self.assertEqual(EventHelper.getShortName("Minnesota Regional"),
                      "Minnesota")
     self.assertEqual(
         EventHelper.getShortName("BAE Systems Granite State Regional"),
         "BAE Systems Granite State")
     self.assertEqual(EventHelper.getShortName("Oklahoma City Regional"),
                      "Oklahoma City")
     self.assertEqual(EventHelper.getShortName("Oregon Regional"), "Oregon")
     self.assertEqual(
         EventHelper.getShortName("UC Davis Sacramento Regional"),
         "UC Davis Sacramento")
     self.assertEqual(
         EventHelper.getShortName("Microsoft Seattle Regional"),
         "Microsoft Seattle")
     self.assertEqual(
         EventHelper.getShortName(
             "Dallas Regional, Sponsored by JCPenney and the JCPenney Afterschool Fund"
         ), "Dallas")
     self.assertEqual(EventHelper.getShortName("Washington DC  Regional"),
                      "Washington DC")
     self.assertEqual(
         EventHelper.getShortName(
             "Detroit FIRST Robotics District Competition"), "Detroit")
     self.assertEqual(
         EventHelper.getShortName(
             "Cass Tech FIRST Robotics District Competition"), "Cass Tech")
     self.assertEqual(
         EventHelper.getShortName(
             "Kettering University FIRST Robotics District Competition"),
         "Kettering University")
     self.assertEqual(
         EventHelper.getShortName(
             "Michigan FIRST Robotics Competition State Championship"),
         "Michigan")
     self.assertEqual(
         EventHelper.getShortName(
             "Lansing FIRST Robotics District Competition"), "Lansing")
     self.assertEqual(
         EventHelper.getShortName(
             "Traverse City FIRST Robotics District Competition"),
         "Traverse City")
     self.assertEqual(
         EventHelper.getShortName(
             "West Michigan FIRST Robotics District Competition"),
         "West Michigan")
     self.assertEqual(
         EventHelper.getShortName("Minnesota 10000 Lakes Regional"),
         "Minnesota 10000 Lakes")
     self.assertEqual(
         EventHelper.getShortName("Minnesota North Star Regional"),
         "Minnesota North Star")
     self.assertEqual(
         EventHelper.getShortName("BAE Granite State Regional"),
         "BAE Granite State")
     self.assertEqual(
         EventHelper.getShortName(
             "Troy FIRST Robotics District Competition"), "Troy")
     self.assertEqual(EventHelper.getShortName("NASA VCU Regional"),
                      "NASA VCU")
     self.assertEqual(
         EventHelper.getShortName(
             "Northeast Utilities FIRST Connecticut Regional"),
         "Northeast Utilities FIRST Connecticut")
     self.assertEqual(
         EventHelper.getShortName(
             "Dallas Regional sponsored by JCPenney and the JCPenney Afterschool Fund"
         ), "Dallas")
     self.assertEqual(
         EventHelper.getShortName(
             "Hawaii Regional sponsored by BAE Systems"), "Hawaii")
     self.assertEqual(EventHelper.getShortName("North Carolina Regional"),
                      "North Carolina")
     self.assertEqual(EventHelper.getShortName("Oklahoma Regional"),
                      "Oklahoma")
     self.assertEqual(EventHelper.getShortName("Autodesk Oregon Regional"),
                      "Autodesk Oregon")
     self.assertEqual(
         EventHelper.getShortName(
             "Silicon Valley Regional sponsored by Google and BAE Systems"),
         "Silicon Valley")
     self.assertEqual(
         EventHelper.getShortName(
             "Utah Regional sponsored by NASA & Platt"), "Utah")
     self.assertEqual(EventHelper.getShortName("Virginia Regional"),
                      "Virginia")
     self.assertEqual(
         EventHelper.getShortName(
             "Ann Arbor FIRST Robotics District Competition"), "Ann Arbor")
     self.assertEqual(EventHelper.getShortName("WPI Regional"), "WPI")
     self.assertEqual(
         EventHelper.getShortName("Dallas Regional sponsored by jcpenney"),
         "Dallas")
     self.assertEqual(EventHelper.getShortName("Lake Superior Regional"),
                      "Lake Superior")
     self.assertEqual(
         EventHelper.getShortName(
             "Michigan FIRST Robotics District Competition State Championship"
         ), "Michigan")
     self.assertEqual(
         EventHelper.getShortName("BAE Systems/Granite State Regional"),
         "BAE Systems/Granite State")
     self.assertEqual(
         EventHelper.getShortName(
             "Waterford FIRST Robotics District Competition"), "Waterford")
     self.assertEqual(
         EventHelper.getShortName("Greater Toronto East Regional"),
         "Greater Toronto East")
     self.assertEqual(
         EventHelper.getShortName("Greater Toronto West Regional"),
         "Greater Toronto West")
     self.assertEqual(EventHelper.getShortName("Alamo Regional"), "Alamo")
     self.assertEqual(
         EventHelper.getShortName(
             "Niles FIRST Robotics District Competition"), "Niles")
     self.assertEqual(EventHelper.getShortName("Smoky Mountain Regional"),
                      "Smoky Mountain")
     self.assertEqual(
         EventHelper.getShortName(
             "Utah Regional co-sponsored by NASA and Platt"), "Utah")
     self.assertEqual(EventHelper.getShortName("Seattle Olympic Regional"),
                      "Seattle Olympic")
     self.assertEqual(EventHelper.getShortName("Seattle Cascade Regional"),
                      "Seattle Cascade")
     self.assertEqual(
         EventHelper.getShortName(
             "Livonia FIRST Robotics District Competition"), "Livonia")
     self.assertEqual(EventHelper.getShortName("Central Valley Regional"),
                      "Central Valley")
     self.assertEqual(
         EventHelper.getShortName(
             "Dallas East Regional sponsored by jcpenney"), "Dallas East")
     self.assertEqual(
         EventHelper.getShortName(
             "Dallas West Regional sponsored by jcpenney"), "Dallas West")
     self.assertEqual(EventHelper.getShortName("Orlando Regional"),
                      "Orlando")
     self.assertEqual(
         EventHelper.getShortName("Michigan FRC State Championship"),
         "Michigan")
     self.assertEqual(
         EventHelper.getShortName(
             "Gull Lake FIRST Robotics District Competition"), "Gull Lake")
     self.assertEqual(
         EventHelper.getShortName(
             "Rutgers University FIRST Robotics District Competition"),
         "Rutgers University")
     self.assertEqual(
         EventHelper.getShortName(
             "Mount Olive FIRST Robotics District Competition"),
         "Mount Olive")
     self.assertEqual(
         EventHelper.getShortName(
             "Lenape FIRST Robotics District Competition"), "Lenape")
     self.assertEqual(EventHelper.getShortName("Queen City Regional"),
                      "Queen City")
     self.assertEqual(
         EventHelper.getShortName(
             "Mid-Atlantic Robotics FRC Region Championship"),
         "Mid-Atlantic Robotics")
     self.assertEqual(
         EventHelper.getShortName(
             "Hatboro-Horsham FIRST Robotics District Competition"),
         "Hatboro-Horsham")
     self.assertEqual(
         EventHelper.getShortName(
             "Chestnut Hill FIRST Robotics District Competition"),
         "Chestnut Hill")
     self.assertEqual(
         EventHelper.getShortName(
             "Festival de Robotique FRC a Montreal Regional"),
         "Festival de Robotique")
     self.assertEqual(EventHelper.getShortName("South Florida Regional"),
                      "South Florida")
     self.assertEqual(EventHelper.getShortName("Smoky Mountains Regional"),
                      "Smoky Mountains")
     self.assertEqual(EventHelper.getShortName("Spokane Regional"),
                      "Spokane")
     self.assertEqual(
         EventHelper.getShortName(
             "Northville FIRST Robotics District Competition"),
         "Northville")
     self.assertEqual(
         EventHelper.getShortName("Western Canadian FRC Regional"),
         "Western Canadian")
     self.assertEqual(EventHelper.getShortName("Razorback Regional"),
                      "Razorback")
     self.assertEqual(EventHelper.getShortName("Phoenix Regional"),
                      "Phoenix")
     self.assertEqual(
         EventHelper.getShortName(
             "Los Angeles Regional sponsored by The Roddenberry Foundation"
         ), "Los Angeles")
     self.assertEqual(EventHelper.getShortName("Inland Empire Regional"),
                      "Inland Empire")
     self.assertEqual(
         EventHelper.getShortName("Connecticut Regional sponsored by UTC"),
         "Connecticut")
     self.assertEqual(EventHelper.getShortName("Crossroads Regional"),
                      "Crossroads")
     self.assertEqual(EventHelper.getShortName("Pine Tree Regional"),
                      "Pine Tree")
     self.assertEqual(
         EventHelper.getShortName(
             "Bedford FIRST Robotics District Competition"), "Bedford")
     self.assertEqual(
         EventHelper.getShortName(
             "Grand Blanc FIRST Robotics District Competition"),
         "Grand Blanc")
     self.assertEqual(
         EventHelper.getShortName(
             "St Joseph FIRST Robotics District Competition"), "St Joseph")
     self.assertEqual(EventHelper.getShortName("Northern Lights Regional"),
                      "Northern Lights")
     self.assertEqual(
         EventHelper.getShortName(
             "Bridgewater-Raritan FIRST Robotics District Competition"),
         "Bridgewater-Raritan")
     self.assertEqual(
         EventHelper.getShortName(
             "TCNJ FIRST Robotics District Competition"), "TCNJ")
     self.assertEqual(
         EventHelper.getShortName(
             "Lenape Seneca FIRST Robotics District Competition"),
         "Lenape Seneca")
     self.assertEqual(
         EventHelper.getShortName(
             "Springside - Chestnut Hill FIRST Robotics District Competition"
         ), "Springside - Chestnut Hill")
     self.assertEqual(
         EventHelper.getShortName(
             "Festival de Robotique FRC de Montreal Regional"),
         "Festival de Robotique")
     self.assertEqual(EventHelper.getShortName("Dallas Regional"), "Dallas")
     self.assertEqual(EventHelper.getShortName("Hub City Regional"),
                      "Hub City")
     self.assertEqual(
         EventHelper.getShortName(
             "Alamo Regional sponsored by Rackspace Hosting"), "Alamo")
     self.assertEqual(
         EventHelper.getShortName(
             "Utah Regional co-sponsored by the Larry H. Miller Group & Platt"
         ), "Utah")
     self.assertEqual(EventHelper.getShortName("Seattle Regional"),
                      "Seattle")
     self.assertEqual(
         EventHelper.getShortName("Central Washington Regional"),
         "Central Washington")
     self.assertEqual(EventHelper.getShortName("Western Canada Regional"),
                      "Western Canada")
     self.assertEqual(EventHelper.getShortName("Arkansas Regional"),
                      "Arkansas")
     self.assertEqual(EventHelper.getShortName("Groton District Event"),
                      "Groton")
     self.assertEqual(EventHelper.getShortName("Hartford District Event"),
                      "Hartford")
     self.assertEqual(
         EventHelper.getShortName("Southington District Event"),
         "Southington")
     self.assertEqual(EventHelper.getShortName("Greater DC Regional"),
                      "Greater DC")
     self.assertEqual(EventHelper.getShortName("Central Illinois Regional"),
                      "Central Illinois")
     self.assertEqual(
         EventHelper.getShortName("Northeastern University District Event"),
         "Northeastern University")
     self.assertEqual(EventHelper.getShortName("WPI District Event"), "WPI")
     self.assertEqual(EventHelper.getShortName("Pine Tree District Event"),
                      "Pine Tree")
     self.assertEqual(
         EventHelper.getShortName(
             "Center Line FIRST Robotics District Competition"),
         "Center Line")
     self.assertEqual(
         EventHelper.getShortName(
             "Escanaba FIRST Robotics District Competition"), "Escanaba")
     self.assertEqual(
         EventHelper.getShortName(
             "Howell FIRST Robotics District Competition"), "Howell")
     self.assertEqual(
         EventHelper.getShortName(
             "St. Joseph FIRST Robotics District Competition"),
         "St. Joseph")
     self.assertEqual(
         EventHelper.getShortName(
             "Southfield FIRST Robotics District Competition"),
         "Southfield")
     self.assertEqual(EventHelper.getShortName("Mexico City Regional"),
                      "Mexico City")
     self.assertEqual(
         EventHelper.getShortName("New England FRC Region Championship"),
         "New England")
     self.assertEqual(EventHelper.getShortName("UNH District Event"), "UNH")
     self.assertEqual(
         EventHelper.getShortName("Granite State District Event"),
         "Granite State")
     self.assertEqual(
         EventHelper.getShortName(
             "MAR FIRST Robotics Bridgewater-Raritan District Competition"),
         "Bridgewater-Raritan")
     self.assertEqual(
         EventHelper.getShortName(
             "MAR FIRST Robotics Clifton District Competition"), "Clifton")
     self.assertEqual(
         EventHelper.getShortName(
             "MAR FIRST Robotics Mt. Olive District Competition"),
         "Mt. Olive")
     self.assertEqual(
         EventHelper.getShortName(
             "MAR FIRST Robotics Lenape-Seneca District Competition"),
         "Lenape-Seneca")
     self.assertEqual(
         EventHelper.getShortName("New York Tech Valley Regional"),
         "New York Tech Valley")
     self.assertEqual(EventHelper.getShortName("North Bay Regional"),
                      "North Bay")
     self.assertEqual(
         EventHelper.getShortName("Windsor Essex Great Lakes Regional"),
         "Windsor Essex Great Lakes")
     self.assertEqual(
         EventHelper.getShortName(
             "PNW FIRST Robotics Oregon City District Event"),
         "Oregon City")
     self.assertEqual(
         EventHelper.getShortName(
             "PNW FIRST Robotics Oregon State University District Event"),
         "Oregon State University")
     self.assertEqual(
         EventHelper.getShortName(
             "PNW FIRST Robotics Wilsonville District Event"),
         "Wilsonville")
     self.assertEqual(
         EventHelper.getShortName(
             "MAR FIRST Robotics Hatboro-Horsham District Competition"),
         "Hatboro-Horsham")
     self.assertEqual(
         EventHelper.getShortName(
             "MAR FIRST Robotics Springside Chestnut Hill District Competition"
         ), "Springside Chestnut Hill")
     self.assertEqual(
         EventHelper.getShortName("Greater Pittsburgh Regional"),
         "Greater Pittsburgh")
     self.assertEqual(
         EventHelper.getShortName("Autodesk PNW FRC Championship"),
         "Autodesk PNW")
     self.assertEqual(
         EventHelper.getShortName("Rhode Island District Event"),
         "Rhode Island")
     self.assertEqual(EventHelper.getShortName("Utah Regional"), "Utah")
     self.assertEqual(
         EventHelper.getShortName(
             "PNW FIRST Robotics Auburn District Event"), "Auburn")
     self.assertEqual(
         EventHelper.getShortName(
             "PNW FIRST Robotics Auburn Mountainview District Event"),
         "Auburn Mountainview")
     self.assertEqual(
         EventHelper.getShortName(
             "PNW FIRST Robotics Eastern Washington University District Event"
         ), "Eastern Washington University")
     self.assertEqual(
         EventHelper.getShortName(
             "PNW FIRST Robotics Central Washington University District Event"
         ), "Central Washington University")
     self.assertEqual(
         EventHelper.getShortName(
             "PNW FIRST Robotics Mt. Vernon District Event"), "Mt. Vernon")
     self.assertEqual(
         EventHelper.getShortName(
             "PNW FIRST Robotics Shorewood District Event"), "Shorewood")
     self.assertEqual(
         EventHelper.getShortName(
             "PNW FIRST Robotics Glacier Peak District Event"),
         "Glacier Peak")
    def parse(self, response):
        events = []
        districts = {}

        cmp_hack_sitevar = Sitevar.get_or_insert('cmp_registration_hacks')
        divisions_to_skip = cmp_hack_sitevar.contents.get('divisions_to_skip', []) \
            if cmp_hack_sitevar else []
        event_name_override = cmp_hack_sitevar.contents.get('event_name_override', []) \
            if cmp_hack_sitevar else []
        events_to_change_dates = cmp_hack_sitevar.contents.get('set_start_to_last_day', []) \
            if cmp_hack_sitevar else []

        for event in response['Events']:
            code = event['code'].lower()
            event_type = EventType.PRESEASON if code == 'week0' else self.EVENT_TYPES.get(event['type'].lower(), None)
            if event_type is None and not self.event_short:
                logging.warn("Event type '{}' not recognized!".format(event['type']))
                continue
            name = event['name']
            short_name = EventHelper.getShortName(name, district_code=event['districtCode'])
            district_enum = EventHelper.parseDistrictName(event['districtCode'].lower()) if event['districtCode'] else DistrictType.NO_DISTRICT
            district_key = District.renderKeyName(self.season, event['districtCode'].lower()) if event['districtCode'] else None
            venue = event['venue']
            city = event['city']
            state_prov = event['stateprov']
            country = event['country']
            start = datetime.datetime.strptime(event['dateStart'], self.DATE_FORMAT_STR)
            end = datetime.datetime.strptime(event['dateEnd'], self.DATE_FORMAT_STR)
            website = event.get('website')

            # TODO read timezone from API

            # Special cases for district championship divisions
            if event_type == EventType.DISTRICT_CMP_DIVISION:
                split_name = name.split('-')
                short_name = '{} - {}'.format(
                    ''.join(item[0].upper() for item in split_name[0].split()),
                    split_name[-1].replace('Division', '').strip())

            # Special cases for champs
            if code in self.EVENT_CODE_EXCEPTIONS:
                code, short_name = self.EVENT_CODE_EXCEPTIONS[code]

                # FIRST indicates CMP registration before divisions are assigned by adding all teams
                # to Einstein. We will hack around that by not storing divisions and renaming
                # Einstein to simply "Championship" when certain sitevar flags are set

                if code in self.EINSTEIN_CODES:
                    override = [item for item in event_name_override if item['event'] == "{}{}".format(self.season, code)]
                    if override:
                        name = short_name.format(override[0]['name'])
                        short_name = short_name.format(override[0]['short_name'])
                else:  # Divisions
                    name = '{} Division'.format(short_name)
            elif self.event_short:
                code = self.event_short

            event_key = "{}{}".format(self.season, code)
            if event_key in divisions_to_skip:
                continue

            # Allow an overriding the start date to be the beginning of the last day
            if event_key in events_to_change_dates:
                start = end.replace(hour=0, minute=0, second=0, microsecond=0)

            events.append(Event(
                id=event_key,
                name=name,
                short_name=short_name,
                event_short=code,
                event_type_enum=event_type,
                official=True,
                start_date=start,
                end_date=end,
                venue=venue,
                city=city,
                state_prov=state_prov,
                country=country,
                venue_address=None,  # Even though FRC API provides address, ElasticSearch is more detailed
                year=self.season,
                event_district_enum=district_enum,
                district_key=ndb.Key(District, district_key) if district_key else None,
                website=website,
            ))

            # Build District Model
            if district_key and district_key not in districts:
                districts[district_key] = District(
                    id=district_key,
                    year=self.season,
                    abbreviation=event['districtCode'].lower(),
                )
        return events, list(districts.values())