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)
예제 #7
0
    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])