def get(self, year): year = int(year) year_dcmps = DistrictChampsInYearQuery(year).fetch() districts_to_write = [] for dcmp in year_dcmps: district_abbrev = DistrictType.type_abbrevs[ dcmp.event_district_enum] district_key = District.renderKeyName(year, district_abbrev) logging.info("Creating {}".format(district_key)) district = District( id=district_key, year=year, abbreviation=district_abbrev, display_name=DistrictType.type_names[dcmp.event_district_enum], elasticsearch_name=next( (k for k, v in DistrictType.elasticsearch_names.iteritems() if v == dcmp.event_district_enum), None)) districts_to_write.append(district) logging.info("Writing {} new districts".format( len(districts_to_write))) DistrictManipulator.createOrUpdate(districts_to_write, run_post_update_hook=False) for dcmp in year_dcmps: district_abbrev = DistrictType.type_abbrevs[ dcmp.event_district_enum] district_key = District.renderKeyName(year, district_abbrev) district_events_future = DistrictEventsQuery( district_key).fetch_async() district_events = district_events_future.get_result() logging.info("Found {} events to update".format( len(district_events))) events_to_write = [] for event in district_events: event.district_key = ndb.Key(District, district_key) events_to_write.append(event) EventManipulator.createOrUpdate(events_to_write) for dcmp in year_dcmps: district_abbrev = DistrictType.type_abbrevs[ dcmp.event_district_enum] district_key = District.renderKeyName(year, district_abbrev) districtteams_future = DistrictTeam.query( DistrictTeam.year == year, DistrictTeam.district == DistrictType.abbrevs.get( district_abbrev, None)).fetch_async() districtteams = districtteams_future.get_result() logging.info("Found {} DistrictTeams to update".format( len(districtteams))) districtteams_to_write = [] for districtteam in districtteams: districtteam.district_key = ndb.Key(District, district_key) districtteams_to_write.append(districtteam) DistrictTeamManipulator.createOrUpdate(districtteams_to_write)
def setUp(self): app = webapp2.WSGIApplication([ webapp2.Route(r'/<team_key:>', ApiTeamHistoryDistrictsController, methods=['GET']) ], debug=True) self.testapp = webtest.TestApp(app) self.testbed = testbed.Testbed() self.testbed.activate() self.testbed.init_datastore_v3_stub() self.testbed.init_urlfetch_stub() self.testbed.init_memcache_stub() ndb.get_context().clear_cache( ) # Prevent data from leaking between tests self.testbed.init_taskqueue_stub(root_path=".") self.team = Team(id="frc1124", name="UberBots", team_number=1124, nickname="UberBots") self.district_team = DistrictTeam(id="2015ne_frc1124", team=self.team.key, year=2015, district_key=ndb.Key( District, '2015ne')) self.district = District(id='2015ne', year=2015) self.team.put() self.district_team.put() self.district.put()
def store_district(data): district = District(id=data['key']) district.year = data['year'] district.abbreviation = data['abbreviation'] district.display_name = data['display_name'] return DistrictManipulator.createOrUpdate(district)
def update_data(input_data: list[str]): try: for data in input_data: state, district, mandi, crop, crop_variety, date, price = data.split( ', ') # check for the instance of mandi in mandi_instances else create if (mandi, state, district) in mandi_instances: mandi_instance = mandi_instances[(mandi, state, district)] else: mandi_instance = Mandi(mandi, state, district) mandi_instances[(mandi, state, district)] = mandi_instance # add crop for the particular mandi mandi_instance.add_crop(crop) # check for the instance of crop in crop_instances else create if crop in crop_instances: crop_instance = crop_instances[crop] else: crop_instance = Crop(crop) crop_instances[crop] = crop_instance # add crop_variety for the crop crop_instance.add_crop_variety(crop_variety) # check for the instance of crop_variety in crop_variety_instances else create if crop_variety in crop_variety_instances: crop_variety_instance = crop_variety_instances[crop_variety] else: crop_variety_instance = CropVariety(crop_variety) crop_variety_instances[crop_variety] = crop_variety_instance # check for the instance of date, price in price_instance else create if (mandi, crop, crop_variety) in price_instances: price_instance = price_instances[(mandi, crop, crop_variety)] else: price_instance = Price(mandi, crop, crop_variety) price_instances[(mandi, crop, crop_variety)] = price_instance # add date and price for a paticular mandi, crop and crop_variety price_instance.add_date_price(date, price) # check for the instance of mandi in mandi_instance else create if (district, state) in district_instances: district_instance = district_instances[(district, state)] else: district_instance = District(district, state) district_instances[(district, state)] = district_instance # add mandi in district district_instance.add_mandi(mandi) except Exception as e: print(e) raise Exception(e) print("Data successfully updated") return 1
def setUp(self): app = webapp2.WSGIApplication([webapp2.Route(r'/<district_abbrev:>/<year:>', ApiDistrictEventsController, methods=['GET'])], debug=True) self.testapp = webtest.TestApp(app) self.testbed = testbed.Testbed() self.testbed.activate() self.testbed.init_datastore_v3_stub() self.testbed.init_urlfetch_stub() self.testbed.init_memcache_stub() ndb.get_context().clear_cache() # Prevent data from leaking between tests self.testbed.init_taskqueue_stub(root_path=".") self.district = District( id='2010ne', year=2010, abbreviation='ne', display_name='New England', ) self.district.put() self.event = Event( id="2010sc", name="Palmetto Regional", event_type_enum=EventType.DISTRICT_CMP, district_key=ndb.Key(District, '2010ne'), short_name="Palmetto", event_short="sc", year=2010, end_date=datetime(2010, 03, 27), official=True, city="Clemson", state_prov="SC", country="USA", venue="Long Beach Arena", venue_address="Long Beach Arena\r\n300 East Ocean Blvd\r\nLong Beach, CA 90802\r\nUSA", start_date=datetime(2010, 03, 24), webcast_json="[{\"type\": \"twitch\", \"channel\": \"frcgamesense\"}]", website="http://www.firstsv.org" ) self.event.put() self.event_details = EventDetails( id=self.event.key.id(), alliance_selections=[ {"declines": [], "picks": ["frc971", "frc254", "frc1662"]}, {"declines": [], "picks": ["frc1678", "frc368", "frc4171"]}, {"declines": [], "picks": ["frc2035", "frc192", "frc4990"]}, {"declines": [], "picks": ["frc1323", "frc846", "frc2135"]}, {"declines": [], "picks": ["frc2144", "frc1388", "frc668"]}, {"declines": [], "picks": ["frc1280", "frc604", "frc100"]}, {"declines": [], "picks": ["frc114", "frc852", "frc841"]}, {"declines": [], "picks": ["frc2473", "frc3256", "frc1868"]} ] ) self.event_details.put()
def get_all_districts_by_region(self, region_value): self._db_cur.execute( 'SELECT * FROM district_code d WHERE d.region_value = %s', (region_value, )) districts = [] row = self._db_cur.fetchone() while row: district = District(row[0], row[1], row[2]) districts.append(district) row = self._db_cur.fetchone() return districts
def post(self, district_key): self._require_admin() district = District(id=District.renderKeyName( self.request.get("year"), self.request.get("abbreviation")), year=int(self.request.get("year")), abbreviation=self.request.get("abbreviation"), display_name=self.request.get("display_name")) DistrictManipulator.createOrUpdate(district) self.redirect('/admin/districts/' + self.request.get("year"))
def setUp(self): self.testbed = testbed.Testbed() self.testbed.activate() self.testbed.init_datastore_v3_stub() self.testbed.init_memcache_stub() ndb.get_context().clear_cache( ) # Prevent data from leaking between tests self.ne_district = District(id='2015ne', abbreviation='ne', year=2015, elasticsearch_name='NE FIRST') self.ne_district.put()
def setUp(self): app = webapp2.WSGIApplication([ webapp2.Route(r'/<district_abbrev:>/<year:([0-9]*)>', ApiDistrictTeamsController, methods=['GET']) ], debug=True) self.testapp = webtest.TestApp(app) self.testbed = testbed.Testbed() self.testbed.activate() self.testbed.init_datastore_v3_stub() self.testbed.init_urlfetch_stub() self.testbed.init_memcache_stub() ndb.get_context().clear_cache( ) # Prevent data from leaking between tests self.testbed.init_taskqueue_stub(root_path=".") self.team = Team( id="frc281", name="Michelin / Caterpillar / Greenville Technical College /\ jcpenney / Baldor / ASME / Gastroenterology Associates /\ Laserflex South & Greenville County Schools & Greenville\ Technical Charter High School", team_number=281, nickname="EnTech GreenVillians", city="Greenville", state_prov="SC", country="USA", website="www.entech.org", motto="Infiltrating Young Minds One Robot at a Time", ) self.district = District( id='2015ne', year=2015, abbreviation='ne', ) self.district_team = DistrictTeam(id="2015ne_frc281", team=self.team.key, year=2015, district_key=ndb.Key( District, '2015ne')) self.team.put() self.district.put() self.district_team.put()
def parse(self, response): districts = [] for district in response['districts']: district_code = district['code'].lower() district_key = District.renderKeyName(self.season, district_code) districts.append( District( id=district_key, abbreviation=district_code, year=self.season, display_name=district['name'], )) return districts
def district_to_db(region_value): fields = {'method': 'getRegionsList', 'region': region_value} payload = utils.create_form_data(fields) res = requests.post('https://extra.egrp365.ru/api/extra/index.php', data=payload, headers=utils.HEADERS) try: json_data = json.loads(res.text) if json_data['success']: db = DB() for x in json_data['data']: district = District(value=x['value'], name=x['name'], region_value=region_value) db.insert(district, 'district_code') except Exception as e: logging.error('District loading error. Response text: ' + res.text) raise e
def setUp(self): self.testbed = testbed.Testbed() self.testbed.activate() self.testbed.init_datastore_v3_stub() self.testbed.init_memcache_stub() self.testbed.init_taskqueue_stub(root_path=".") ndb.get_context().clear_cache( ) # Prevent data from leaking between tests # Create districts districts = [] for code in [ 'mar', 'isr', 'nc', 'ne', 'pnw', 'pch', 'chs', 'in', 'ont', 'fim', 'tx' ]: year = 2017 districts.append( District( id=District.renderKeyName(year, code), year=year, abbreviation=code, )) DistrictManipulator.createOrUpdate(districts)
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, 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 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 setUp(self): self.testbed = testbed.Testbed() self.testbed.activate() self.testbed.init_datastore_v3_stub() self.testbed.init_memcache_stub() ndb.get_context().clear_cache( ) # Prevent data from leaking between tests app = webapp2.WSGIApplication([ RedirectRoute(r'/event/<event_key>', EventDetail, 'event-detail'), RedirectRoute(r'/event/<event_key>/insights', EventInsights, 'event-insights'), RedirectRoute(r'/events/<year:[0-9]+>', EventList, 'event-list-year'), RedirectRoute(r'/events', EventList, 'event-list'), ]) self.testapp = webtest.TestApp(app) self.district = District(id='2016ne', abbreviation='ne', year=2016, display_name='New England') self.district.put() self.event1 = Event( id="2016necmp", name="New England District Championship", event_type_enum=EventType.DISTRICT_CMP, district_key=ndb.Key(District, '2016ne'), short_name="New England", event_short="necmp", year=2016, end_date=datetime(2016, 03, 27), official=True, city='Hartford', state_prov='CT', country='USA', venue="Some Venue", venue_address="Some Venue, Hartford, CT, USA", timezone_id="America/New_York", start_date=datetime(2016, 03, 24), webcast_json= "[{\"type\": \"twitch\", \"channel\": \"frcgamesense\"}]", website="http://www.firstsv.org", ) self.event1.put() # To test that /events defaults to current year this_year = datetime.now().year self.event2 = Event( id="{}necmp".format(this_year), name="New England District Championship", event_type_enum=EventType.DISTRICT_CMP, district_key=ndb.Key(District, '2016ne'), short_name="New England", event_short="necmp", year=this_year, end_date=datetime(this_year, 03, 27), official=True, city='Hartford', state_prov='CT', country='USA', venue="Some Venue", venue_address="Some Venue, Hartford, CT, USA", timezone_id="America/New_York", start_date=datetime(this_year, 03, 24), webcast_json= "[{\"type\": \"twitch\", \"channel\": \"frcgamesense\"}]", website="http://www.firstsv.org", ) self.event2.put() self.event1_details = EventDetails(id=self.event1.key.id(), predictions={ "ranking_prediction_stats": { 'qual': None, 'playoff': None }, "match_predictions": { 'qual': None, 'playoff': None }, "ranking_predictions": None, "match_prediction_stats": { 'qual': None, 'playoff': None } }) self.event1_details.put() self.event2_details = EventDetails(id=self.event2.key.id(), predictions={ "ranking_prediction_stats": { 'qual': None, 'playoff': None }, "match_predictions": { 'qual': None, 'playoff': None }, "ranking_predictions": None, "match_prediction_stats": { 'qual': None, 'playoff': None } }) self.event2_details.put()
def setUp(self): district = District(id='2015fim', year=2015, abbreviation='fim', display_name='FIRST In Michigan') self.notification = DistrictPointsNotification(district)
def setUp(self): self.testbed = testbed.Testbed() self.testbed.activate() self.testbed.init_datastore_v3_stub() self.testbed.init_memcache_stub() ndb.get_context().clear_cache( ) # Prevent data from leaking between tests self.testbed.init_taskqueue_stub(root_path=".") self.eventteam_2015casj_frc254 = EventTeam( id='2015casj_frc254', event=ndb.Key(Event, '2015casj'), team=ndb.Key(Team, 'frc254'), year=2015, ) self.eventteam_2015cama_frc604 = EventTeam( id='2015cama_frc604', event=ndb.Key(Event, '2015cama'), team=ndb.Key(Team, 'frc604'), year=2015, ) self.eventteam_2010cama_frc604 = EventTeam( id='2010cama_frc604', event=ndb.Key(Event, '2010cama'), team=ndb.Key(Team, 'frc604'), year=2010, ) self.eventteam_2015casj_frc254.put() self.eventteam_2015cama_frc604.put() self.eventteam_2010cama_frc604.put() self.districtteam_2015fim_frc254 = DistrictTeam( id='2015fim_frc254', district=DistrictType.MICHIGAN, team=ndb.Key(Team, 'frc254'), year=2015, ) self.districtteam_2015mar_frc604 = DistrictTeam( id='2015mar_frc604', district=DistrictType.MID_ATLANTIC, team=ndb.Key(Team, 'frc604'), year=2015, ) self.districtteam_2015fim_frc254.put() self.districtteam_2015mar_frc604.put() self.district_2015ne = District( id='2015ne', year=2015, abbreviation='ne', ) self.district_2016chs = District( id='2016chs', year=2016, abbreviation='chs', ) self.district_2015ne.put() self.district_2016chs.put()
def setUp(self): self.testbed = testbed.Testbed() self.testbed.activate() self.testbed.init_datastore_v3_stub() self.testbed.init_memcache_stub() ndb.get_context().clear_cache( ) # Prevent data from leaking between tests self.testbed.init_taskqueue_stub(root_path=".") self.eventteam_2015casj_frc254 = EventTeam( id='2015casj_frc254', event=ndb.Key(Event, '2015casj'), team=ndb.Key(Team, 'frc254'), year=2015, ) self.eventteam_2015cama_frc604 = EventTeam( id='2015cama_frc604', event=ndb.Key(Event, '2015cama'), team=ndb.Key(Team, 'frc604'), year=2015, ) self.eventteam_2010cama_frc604 = EventTeam( id='2010cama_frc604', event=ndb.Key(Event, '2010cama'), team=ndb.Key(Team, 'frc604'), year=2010, ) self.eventteam_2016necmp_frc125 = EventTeam( id='2016necmp_frc125', event=ndb.Key(Event, '2016necmp'), team=ndb.Key(Team, 'frc125'), year=2016, ) self.eventteam_2015casj_frc254.put() self.eventteam_2015cama_frc604.put() self.eventteam_2010cama_frc604.put() self.eventteam_2016necmp_frc125.put() self.districtteam_2015fim_frc254 = DistrictTeam( id='2015fim_frc254', district_key=ndb.Key(District, '2015fim'), team=ndb.Key(Team, 'frc254'), year=2015, ) self.districtteam_2015mar_frc604 = DistrictTeam( id='2015mar_frc604', district_key=ndb.Key(District, '2015mar'), team=ndb.Key(Team, 'frc604'), year=2015, ) self.districtteam_2016ne_frc604 = DistrictTeam( id='2016ne_frc604', district_key=ndb.Key(District, '2016ne'), team=ndb.Key(Team, 'frc604'), year=2016, ) self.districtteam_2015fim_frc254.put() self.districtteam_2015mar_frc604.put() self.districtteam_2016ne_frc604.put() self.district_2015ne = District( id='2015ne', year=2015, abbreviation='ne', ) self.district_2016chs = District( id='2016chs', year=2016, abbreviation='chs', ) self.district_2015ne.put() self.district_2016chs.put() self.event_2016necmp = Event( id='2016necmp', year=2016, district_key=ndb.Key(District, '2016ne'), event_short='necmp', event_type_enum=EventType.DISTRICT_CMP, ) self.event_2016necmp.put()
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())