def test_is_maybe_match_wrong_start(self): event_one = Event(start_date=datetime.datetime(year=2020, month=7, day=14, hour=0, minute=0, second=0), end_date=datetime.datetime(year=2020, month=7, day=15, hour=23, minute=59, second=59), city="London", state_prov="OH") event_two = Event(start_date=datetime.datetime(year=2020, month=7, day=13, hour=0, minute=0, second=0), end_date=datetime.datetime(year=2020, month=7, day=15, hour=23, minute=59, second=59), city="London", state_prov="OH") self.assertFalse( OffseasonEventHelper.is_maybe_match(event_one, event_two)) event_two.start_date = event_one.start_date self.assertTrue( OffseasonEventHelper.is_maybe_match(event_one, event_two))
def test_is_direct_match_key_name(self): tba_event_one = Event(year=2020, first_code='zor', event_short='zorr') tba_event_two = Event(year=2020, first_code='iri', event_short='irii') first_event = Event(year=2020, event_short='zor') self.assertTrue( OffseasonEventHelper.is_direct_match(tba_event_one, first_event)) self.assertFalse( OffseasonEventHelper.is_direct_match(tba_event_two, first_event))
def test_is_direct_match_key_name(self): first_event_match = Event(year=2020, event_short='zor') second_event_match = Event(year=2020, event_short='zor') third_event_match = Event(year=2020, event_short='iri') self.assertTrue( OffseasonEventHelper.is_direct_match(first_event_match, second_event_match)) self.assertFalse( OffseasonEventHelper.is_direct_match(first_event_match, third_event_match))
def get(self, year): df = DatafeedFMSAPI('v2.0') fmsapi_events, event_list_districts = df.getEventList(year) # All regular-season events can be inserted without any work involved. # We need to de-duplicate offseason events from the FRC Events API with a different code than the TBA event code fmsapi_events_offseason = [e for e in fmsapi_events if e.is_offseason] event_keys_to_put = set([e.key_name for e in fmsapi_events]) - set( [e.key_name for e in fmsapi_events_offseason]) events_to_put = [ e for e in fmsapi_events if e.key_name in event_keys_to_put ] matched_offseason_events, new_offseason_events = \ OffseasonEventHelper.categorize_offseasons(int(year), fmsapi_events_offseason) # For all matched offseason events, make sure the FIRST code matches the TBA FIRST code for tba_event, first_event in matched_offseason_events: tba_event.first_code = first_event.event_short events_to_put.append( tba_event) # Update TBA events - discard the FIRST event # For all new offseason events we can't automatically match, create suggestions SuggestionCreator.createDummyOffseasonSuggestions(new_offseason_events) events = EventManipulator.createOrUpdate(events_to_put) or [] fmsapi_districts = df.getDistrictList(year) merged_districts = DistrictManipulator.mergeModels( fmsapi_districts, event_list_districts) if merged_districts: districts = DistrictManipulator.createOrUpdate(merged_districts) else: districts = [] # Fetch event details for each event for event in events: taskqueue.add(queue_name='datafeed', target='backend-tasks', url='/backend-tasks/get/event_details/' + event.key_name, method='GET') template_values = { "events": events, "districts": districts, } if 'X-Appengine-Taskname' not in self.request.headers: # Only write out if not in taskqueue path = os.path.join( os.path.dirname(__file__), '../templates/datafeeds/fms_event_list_get.html') self.response.out.write(template.render(path, template_values))
def test_categorize_offseasons_no_events(self): first_preseason = Event(year=2016, event_short="mierp") first_offseason = Event( year=2016, event_short="miffo", start_date=datetime.datetime(2016, 06, 24), end_date=datetime.datetime(2016, 06, 25), city='Anytown', state_prov='MI', ) first_new_event = Event(year=2016, event_short="minew") first_events = [first_preseason, first_offseason, first_new_event] existing, new = OffseasonEventHelper.categorize_offseasons( 2016, first_events) # Should have no existing events self.assertEqual(len(existing), 0) self.assertEqual(len(new), 3)
def get(self, year): df = DatafeedFMSAPI('v2.0') first_events, _ = df.getSyncEnabledOffseasonEvents(year) linked_events, maybed_linked_events, new_events = \ OffseasonEventHelper.categorize_offseasons(int(year), first_events) events_to_update = [] events_to_put = [] # for all events with a first_code linked, ensure official=True logging.info("Found {} already linked events".format( len(linked_events))) for tba, first in linked_events: if tba.first_code != first.event_short or not tba.official: tba.first_code = first.event_short tba.official = True events_to_put.append(tba) events_to_update.append(tba) # for all events that we can maybe link, also do that logging.info("Auto-linking {} probably events".format( len(maybed_linked_events))) for tba, first in maybed_linked_events: tba.first_code = first.event_short tba.official = True events_to_put.append(tba) events_to_update.append(tba) logging.info("Found {} events to put".format(len(events_to_put))) if events_to_put: EventManipulator.createOrUpdate(events_to_put) # Enqueue details updates for these events logging.info("Found {} events to update".format(len(events_to_update))) for event in events_to_update: taskqueue.add(queue_name='datafeed', target='backend-tasks', url='/backend-tasks/get/event_details/' + event.key_name, method='GET') # Event we don't have anything for... Create suggestions logging.info("Found {} new events to link".format(len(new_events))) SuggestionCreator.createDummyOffseasonSuggestions(new_events)
def get(self, year): df = DatafeedFMSAPI('v2.0') first_events, _ = df.getSyncEnabledOffseasonEvents(year) linked_events, maybed_linked_events, new_events = \ OffseasonEventHelper.categorize_offseasons(int(year), first_events) events_to_update = [] events_to_put = [] # for all events with a first_code linked, ensure official=True logging.info("Found {} already linked events".format(len(linked_events))) for tba, first in linked_events: if tba.first_code != first.event_short or not tba.official: tba.first_code = first.event_short tba.official = True events_to_put.append(tba) events_to_update.append(tba) # for all events that we can maybe link, also do that logging.info("Auto-linking {} probably events".format(len(maybed_linked_events))) for tba, first in maybed_linked_events: tba.first_code = first.event_short tba.official = True events_to_put.append(tba) events_to_update.append(tba) logging.info("Found {} events to put".format(len(events_to_put))) if events_to_put: EventManipulator.createOrUpdate(events_to_put) # Enqueue details updates for these events logging.info("Found {} events to update".format(len(events_to_update))) for event in events_to_update: taskqueue.add( queue_name='datafeed', target='backend-tasks', url='/backend-tasks/get/event_details/'+event.key_name, method='GET' ) # Event we don't have anything for... Create suggestions logging.info("Found {} new events to link".format(len(new_events))) SuggestionCreator.createDummyOffseasonSuggestions(new_events)
def test_categorize_offseasons(self): # Setup some existing TBA events in the database - these will be queried for our test preseason_event = Event(id="2016mipre", name="Michigan Preseason Event", event_type_enum=EventType.PRESEASON, event_district_enum=DistrictType.MICHIGAN, short_name="MI Preseason", event_short="mipre", first_code="mierp", year=2016, end_date=datetime.datetime(2016, 02, 25), official=False, city='Anytown', state_prov='MI', country='USA', venue="Some Venue", venue_address="Some Venue, Anytown, MI, USA", timezone_id="America/New_York", start_date=datetime.datetime(2016, 02, 24), webcast_json="", website=None) preseason_event.put() offseason_event = Event(id="2016mioff", name="Michigan Offseason Event", event_type_enum=EventType.OFFSEASON, event_district_enum=DistrictType.MICHIGAN, short_name="MI Offseason", event_short="mioff", year=2016, end_date=datetime.datetime(2016, 06, 25), official=False, city='Anytown', state_prov='MI', country='USA', venue="Some Venue", venue_address="Some Venue, Anytown, MI, USA", timezone_id="America/New_York", start_date=datetime.datetime(2016, 06, 24), webcast_json="", website=None) offseason_event.put() # Exact match first_preseason = Event(year=2016, event_short="mierp") # Indirect match first_offseason = Event( year=2016, event_short="miffo", start_date=datetime.datetime(2016, 06, 24), end_date=datetime.datetime(2016, 06, 25), city='Anytown', state_prov='MI', ) first_new_event = Event(year=2016, event_short="minew") first_events = [first_preseason, first_offseason, first_new_event] existing, new = OffseasonEventHelper.categorize_offseasons( 2016, first_events) # Should have two existing events self.assertEqual(len(existing), 2) self.assertTrue((preseason_event, first_preseason) in existing) self.assertTrue((offseason_event, first_offseason) in existing) # Should have one new event self.assertEqual(len(new), 1) self.assertEqual(new, [first_new_event])