def get(self, year): year = int(year) team_districts = defaultdict(list) logging.info("Fetching events in {}".format(year)) year_events = Event.query( year == Event.year, Event.event_district_enum != DistrictType.NO_DISTRICT, Event.event_district_enum != None).fetch() for event in year_events: logging.info("Fetching EventTeams for {}".format(event.key_name)) event_teams = EventTeam.query(EventTeam.event == event.key).fetch() for event_team in event_teams: team_districts[event_team.team.id()].append( event.event_district_enum) new_district_teams = [] for team_key, districts in team_districts.iteritems(): most_frequent_district = max(set(districts), key=districts.count) logging.info("Assuming team {} belongs to {}".format( team_key, DistrictType.type_names[most_frequent_district])) dt_key = DistrictTeam.renderKeyName(year, most_frequent_district, team_key) new_district_teams.append( DistrictTeam(id=dt_key, year=year, team=ndb.Key(Team, team_key), district=most_frequent_district)) logging.info("Finishing updating old district teams from event teams") DistrictTeamManipulator.createOrUpdate(new_district_teams) self.response.out.write( "Finished creating district teams for {}".format(year))
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() 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", address="Greenville, SC, USA", website="www.entech.org", motto = "Infiltrating Young Minds One Robot at a Time", ) self.district_team = DistrictTeam( id="2015ne_frc281", team=self.team.key, year=2015, district=3 ) self.team.put() self.district_team.put()
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() 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=3 ) self.team.put() self.district_team.put()
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()
class TestDistrictTeamsApiController(unittest2.TestCase): 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_team = DistrictTeam( id="2015ne_frc281", team=self.team.key, year=2015, district=3 ) self.team.put() self.district_team.put() def tearDown(self): self.testbed.deactivate() def assertTeamJson(self, team): team = team[0] self.assertEqual(team["key"], self.team.key_name) self.assertEqual(team["team_number"], self.team.team_number) self.assertEqual(team["nickname"], self.team.nickname) self.assertEqual(team["location"], self.team.location) self.assertEqual(team["locality"], "Greenville") self.assertEqual(team["country_name"], "USA") self.assertEqual(team["region"], "SC") self.assertEqual(team["website"], self.team.website) self.assertEqual(team["motto"], self.team.motto) def testDistrictsApi(self): response = self.testapp.get('/ne/2015', headers={"X-TBA-App-Id": "tba-tests:team-districts-controller-test:v01"}) teams = json.loads(response.body) self.assertTeamJson(teams)
class TestTeamHistoryDistrictsApiController(unittest2.TestCase): 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 tearDown(self): self.testbed.deactivate() def testDistrictsApi(self): response = self.testapp.get( '/frc1124', headers={ "X-TBA-App-Id": "tba-tests:team-history-districts-controller-test:v01" }) district_dict = json.loads(response.body) self.assertTrue("2015" in district_dict) district_key = district_dict["2015"] self.assertEqual(district_key, "2015ne")
class TestDistrictTeamsApiController(unittest2.TestCase): 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_team = DistrictTeam(id="2015ne_frc281", team=self.team.key, year=2015, district=3) self.team.put() self.district_team.put() def tearDown(self): self.testbed.deactivate() def assertTeamJson(self, team): team = team[0] self.assertEqual(team["key"], self.team.key_name) self.assertEqual(team["team_number"], self.team.team_number) self.assertEqual(team["nickname"], self.team.nickname) self.assertEqual(team["location"], self.team.location) self.assertEqual(team["locality"], "Greenville") self.assertEqual(team["country_name"], "USA") self.assertEqual(team["region"], "SC") self.assertEqual(team["website"], self.team.website) self.assertEqual(team["motto"], self.team.motto) def testDistrictsApi(self): response = self.testapp.get( "/ne/2015", headers={"X-TBA-App-Id": "tba-tests:team-districts-controller-test:v01"} ) teams = json.loads(response.body) self.assertTeamJson(teams)
def parse(self, response): """ Parse team info from FMSAPI Returns a tuple of: list of models (Team, DistrictTeam, Robot), and a Boolean indicating if there are more pages to be fetched """ # Get team json # don't need to null check, if error, HTTP code != 200, so we wont' get here current_page = response['pageCurrent'] total_pages = response['pageTotal'] teams = response['teams'] ret_models = [] for teamData in teams: # Fix issue where FIRST's API returns dummy website for all teams if teamData[ 'website'] is not None and 'www.firstinspires.org' in teamData[ 'website']: website = None else: raw_website = teamData.get('website', None) website = urlparse.urlparse( raw_website, 'http').geturl() if raw_website else None # Fix oddity with urlparse having three slashes after the scheme (#1635) website = website.replace('///', '//') if website else None team = Team(id="frc{}".format(teamData['teamNumber']), team_number=teamData['teamNumber'], name=teamData['nameFull'], nickname=teamData['nameShort'], city=teamData['city'], state_prov=teamData['stateProv'], country=teamData['country'], website=website, rookie_year=teamData['rookieYear']) districtTeam = None if teamData['districtCode']: districtAbbrev = DistrictType.abbrevs[ teamData['districtCode'].lower()] districtTeam = DistrictTeam(id=DistrictTeam.renderKeyName( self.year, districtAbbrev, team.key_name), team=ndb.Key(Team, team.key_name), year=self.year, district=districtAbbrev) robot = None if teamData['robotName']: robot = Robot(id=Robot.renderKeyName(team.key_name, self.year), team=ndb.Key(Team, team.key_name), year=self.year, robot_name=teamData['robotName'].strip()) ret_models.append((team, districtTeam, robot)) return (ret_models, (current_page < total_pages))
def parse(self, response): """ Parse team info from FMSAPI Returns a tuple of: list of models (Team, DistrictTeam, Robot), and a Boolean indicating if there are more pages to be fetched """ # Get team json # don't need to null check, if error, HTTP code != 200, so we wont' get here current_page = response['pageCurrent'] total_pages = response['pageTotal'] teams = response['teams'] ret_models = [] for teamData in teams: # Fix issue where FIRST's API returns dummy website for all teams if teamData[ 'website'] is not None and 'www.firstinspires.org' in teamData[ 'website']: website = None else: website = WebsiteHelper.format_url( teamData.get('website', None)) team = Team(id="frc{}".format(teamData['teamNumber']), team_number=teamData['teamNumber'], name=teamData['nameFull'], nickname=teamData['nameShort'], school_name=teamData.get('schoolName'), home_cmp=teamData.get('homeCMP').lower() if teamData.get('homeCMP') else None, city=teamData['city'], state_prov=teamData['stateProv'], country=teamData['country'], website=website, rookie_year=teamData['rookieYear']) districtTeam = None if teamData['districtCode']: districtKey = District.renderKeyName( self.year, teamData['districtCode'].lower()) districtTeam = DistrictTeam( id=DistrictTeam.renderKeyName(districtKey, team.key_name), team=ndb.Key(Team, team.key_name), year=self.year, district_key=ndb.Key(District, districtKey), ) robot = None if teamData['robotName']: robot = Robot(id=Robot.renderKeyName(team.key_name, self.year), team=ndb.Key(Team, team.key_name), year=self.year, robot_name=teamData['robotName'].strip()) ret_models.append((team, districtTeam, robot)) return (ret_models, (current_page < total_pages))
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()
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()
def parse(self, response): """ Parse team info from FMSAPI Returns a tuple of: list of models (Team, DistrictTeam, Robot), and a Boolean indicating if there are more pages to be fetched """ # Get team json # don't need to null check, if error, HTTP code != 200, so we wont' get here current_page = response['pageCurrent'] total_pages = response['pageTotal'] teams = response['teams'] ret_models = [] for teamData in teams: # concat city/state/country to get address address = u"{}, {}, {}".format(teamData['city'], teamData['stateProv'], teamData['country']) team = Team(id="frc{}".format(teamData['teamNumber']), team_number=teamData['teamNumber'], name=teamData['nameFull'], nickname=teamData['nameShort'], address=address, website=teamData['website'], rookie_year=teamData['rookieYear']) districtTeam = None if teamData['districtCode']: districtAbbrev = DistrictType.abbrevs[ teamData['districtCode'].lower()] districtTeam = DistrictTeam(id=DistrictTeam.renderKeyName( self.year, districtAbbrev, team.key_name), team=ndb.Key(Team, team.key_name), year=self.year, district=districtAbbrev) robot = None if teamData['robotName']: robot = Robot(id=Robot.renderKeyName(team.key_name, self.year), team=ndb.Key(Team, team.key_name), year=self.year, robot_name=teamData['robotName'].strip()) ret_models.append((team, districtTeam, robot)) return (ret_models, (current_page < total_pages))
class TestTeamHistoryDistrictsApiController(unittest2.TestCase): 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 tearDown(self): self.testbed.deactivate() def testDistrictsApi(self): response = self.testapp.get('/frc1124', headers={"X-TBA-App-Id": "tba-tests:team-history-districts-controller-test:v01"}) district_dict = json.loads(response.body) self.assertTrue("2015" in district_dict) district_key = district_dict["2015"] self.assertEqual(district_key, "2015ne")
def get(self, team_number): self._require_admin() team = Team.get_by_id("frc" + team_number) if not team: self.abort(404) event_teams = EventTeam.query(EventTeam.team == team.key).fetch(500) team_medias = Media.query(Media.references == team.key).fetch(500) robots = Robot.query(Robot.team == team.key).fetch() district_teams = DistrictTeam.query(DistrictTeam.team == team.key).fetch() years_participated = sorted(TeamParticipationQuery(team.key_name).fetch()) team_medias_by_year = {} for media in team_medias: if media.year in team_medias_by_year: team_medias_by_year[media.year].append(media) else: team_medias_by_year[media.year] = [media] media_years = sorted(team_medias_by_year.keys(), reverse=True) self.template_values.update({ 'event_teams': event_teams, 'team': team, 'team_media_years': media_years, 'team_medias_by_year': team_medias_by_year, 'robots': robots, 'district_teams': district_teams, 'years_participated': years_participated, }) path = os.path.join(os.path.dirname(__file__), '../../templates/admin/team_details.html') self.response.out.write(template.render(path, self.template_values))
def get(self, team_number): self._require_admin() team = Team.get_by_id("frc" + team_number) event_teams = EventTeam.query(EventTeam.team == team.key).fetch(500) team_medias = Media.query(Media.references == team.key).fetch(500) robots = Robot.query(Robot.team == team.key).fetch() district_teams = DistrictTeam.query(DistrictTeam.team == team.key).fetch() team_medias_by_year = {} for media in team_medias: if media.year in team_medias_by_year: team_medias_by_year[media.year].append(media) else: team_medias_by_year[media.year] = [media] self.template_values.update({ 'event_teams': event_teams, 'team': team, 'team_medias_by_year': team_medias_by_year, 'robots': robots, 'district_teams': district_teams, }) path = os.path.join(os.path.dirname(__file__), '../../templates/admin/team_details.html') self.response.out.write(template.render(path, self.template_values))
def team_updated(affected_refs): team_keys = filter(None, affected_refs['key']) event_team_keys_future = EventTeam.query( EventTeam.team.IN([team_key for team_key in team_keys ])).fetch_async(None, keys_only=True) district_team_keys_future = DistrictTeam.query( DistrictTeam.team.IN([team_key for team_key in team_keys ])).fetch_async(None, keys_only=True) queries_and_keys = [] for team_key in team_keys: queries_and_keys.append((TeamQuery(team_key.id()))) page_num = _get_team_page_num(team_key.id()) queries_and_keys.append((TeamListQuery(page_num))) for et_key in event_team_keys_future.get_result(): year = int(et_key.id()[:4]) event_key = et_key.id().split('_')[0] page_num = _get_team_page_num(et_key.id().split('_')[1]) queries_and_keys.append((TeamListYearQuery(year, page_num))) queries_and_keys.append((EventTeamsQuery(event_key))) for dt_key in district_team_keys_future.get_result(): district_key = dt_key.id().split('_')[0] queries_and_keys.append((DistrictTeamsQuery(district_key))) return queries_and_keys
def get(self, team_number): self._require_admin() team = Team.get_by_id("frc" + team_number) if not team: self.abort(404) event_teams = EventTeam.query(EventTeam.team == team.key).fetch(500) team_medias = Media.query(Media.references == team.key).fetch(500) robots = Robot.query(Robot.team == team.key).fetch() district_teams = DistrictTeam.query( DistrictTeam.team == team.key).fetch() years_participated = sorted( TeamParticipationQuery(team.key_name).fetch()) team_medias_by_year = {} for media in team_medias: if media.year in team_medias_by_year: team_medias_by_year[media.year].append(media) else: team_medias_by_year[media.year] = [media] media_years = sorted(team_medias_by_year.keys(), reverse=True) self.template_values.update({ 'event_teams': event_teams, 'team': team, 'team_media_years': media_years, 'team_medias_by_year': team_medias_by_year, 'robots': robots, 'district_teams': district_teams, 'years_participated': years_participated, }) path = os.path.join(os.path.dirname(__file__), '../../templates/admin/team_details.html') self.response.out.write(template.render(path, self.template_values))
def _query_async(self): district_key = self._query_args[0] district_teams = yield DistrictTeam.query( DistrictTeam.district_key == ndb.Key(District, district_key)).fetch_async() team_keys = map(lambda district_team: district_team.team, district_teams) teams = yield ndb.get_multi_async(team_keys) raise ndb.Return(teams)
def district_updated(affected_refs): years = _filter(affected_refs['year']) district_abbrevs = _filter(affected_refs['abbreviation']) district_keys = _filter(affected_refs['key']) district_team_keys_future = DistrictTeam.query(DistrictTeam.district_key.IN(list(district_keys))).fetch_async(None, keys_only=True) district_event_keys_future = Event.query(Event.district_key.IN(list(district_keys))).fetch_async(keys_only=True) queries_and_keys = [] for year in years: queries_and_keys.append(DistrictsInYearQuery(year)) for abbrev in district_abbrevs: queries_and_keys.append(DistrictHistoryQuery(abbrev)) for key in district_keys: queries_and_keys.append(DistrictQuery(key.id())) for dt_key in district_team_keys_future.get_result(): team_key = dt_key.id().split('_')[1] queries_and_keys.append(TeamDistrictsQuery(team_key)) # Necessary because APIv3 Event models include the District model affected_event_refs = { 'key': set(), 'year': set(), 'district_key': district_keys, } for event_key in district_event_keys_future.get_result(): affected_event_refs['key'].add(event_key) affected_event_refs['year'].add(int(event_key.id()[:4])) queries_and_keys += event_updated(affected_event_refs) return queries_and_keys
def team_updated(affected_refs): team_keys = _filter(affected_refs['key']) event_team_keys_future = EventTeam.query(EventTeam.team.IN([team_key for team_key in team_keys])).fetch_async(None, keys_only=True) district_team_keys_future = DistrictTeam.query(DistrictTeam.team.IN([team_key for team_key in team_keys])).fetch_async(None, keys_only=True) queries_and_keys = [] for team_key in team_keys: queries_and_keys.append((TeamQuery(team_key.id()))) page_num = _get_team_page_num(team_key.id()) queries_and_keys.append((TeamListQuery(page_num))) for et_key in event_team_keys_future.get_result(): year = int(et_key.id()[:4]) event_key = et_key.id().split('_')[0] page_num = _get_team_page_num(et_key.id().split('_')[1]) queries_and_keys.append((TeamListYearQuery(year, page_num))) queries_and_keys.append((EventTeamsQuery(event_key))) queries_and_keys.append((EventEventTeamsQuery(event_key))) for dt_key in district_team_keys_future.get_result(): district_key = dt_key.id().split('_')[0] queries_and_keys.append((DistrictTeamsQuery(district_key))) return queries_and_keys
def get_team_cache_keys_and_controllers(cls, affected_refs): """ Gets cache keys and controllers that references this team """ team_keys = affected_refs['key'] event_team_keys_future = EventTeam.query( EventTeam.team.IN([team_key for team_key in team_keys ])).fetch_async(None, keys_only=True) district_team_keys_future = DistrictTeam.query( DistrictTeam.team.IN([team_key for team_key in team_keys ])).fetch_async(None, keys_only=True) event_keys = set() for et_key in event_team_keys_future.get_result(): event_key_name = et_key.id().split('_')[0] event_keys.add(ndb.Key(Event, event_key_name)) district_keys = set() for dt_key in district_team_keys_future.get_result(): district_key_name = dt_key.id().split('_')[0] district_keys.add(district_key_name) return cls._get_teams_cache_keys_and_controllers(team_keys) + \ cls._get_eventteams_cache_keys_and_controllers(event_keys) + \ cls._get_teamlist_cache_keys_and_controllers(team_keys) + \ cls._get_districtteams_cache_keys_and_controllers(district_keys, team_keys) + \ cls._queries_to_cache_keys_and_controllers(get_affected_queries.team_updated(affected_refs))
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 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 parse(self, response): """ Parse team info from FMSAPI Returns a tuple of: list of models (Team, DistrictTeam, Robot), and a Boolean indicating if there are more pages to be fetched """ # Get team json # don't need to null check, if error, HTTP code != 200, so we wont' get here current_page = response['pageCurrent'] total_pages = response['pageTotal'] teams = response['teams'] ret_models = [] for teamData in teams: # Fix issue where FIRST's API returns dummy website for all teams if teamData['website'] is not None and 'www.firstinspires.org' in teamData['website']: website = None else: website = WebsiteHelper.format_url(teamData.get('website', None)) team = Team( id="frc{}".format(teamData['teamNumber']), team_number=teamData['teamNumber'], name=teamData['nameFull'], nickname=teamData['nameShort'], school_name=teamData.get('schoolName'), home_cmp=teamData.get('homeCMP').lower() if teamData.get('homeCMP') else None, city=teamData['city'], state_prov=teamData['stateProv'], country=teamData['country'], website=website, rookie_year=teamData['rookieYear'] ) districtTeam = None if teamData['districtCode']: districtAbbrev = DistrictType.abbrevs[teamData['districtCode'].lower()] districtTeam = DistrictTeam( id=DistrictTeam.renderKeyName(self.year, districtAbbrev, team.key_name), team=ndb.Key(Team, team.key_name), year=self.year, district=districtAbbrev, district_key=ndb.Key(District, District.renderKeyName(self.year, teamData['districtCode'].lower())), ) robot = None if teamData['robotName']: robot = Robot( id=Robot.renderKeyName(team.key_name, self.year), team=ndb.Key(Team, team.key_name), year=self.year, robot_name=teamData['robotName'].strip() ) ret_models.append((team, districtTeam, robot)) return (ret_models, (current_page < total_pages))
def _query_async(self): team_key = self._query_args[0] district_team_keys = yield DistrictTeam.query(DistrictTeam.team == ndb.Key(Team, team_key)).fetch_async(keys_only=True) ret = {} for district_team_key in district_team_keys: district_key = district_team_key.id().split('_')[0] year = int(district_key[:4]) ret[year] = district_key raise ndb.Return(ret)
def _query_async(self): team_key = self._query_args[0] district_team_keys = yield DistrictTeam.query( DistrictTeam.team == ndb.Key(Team, team_key)).fetch_async( keys_only=True) districts = yield ndb.get_multi_async([ ndb.Key(District, dtk.id().split('_')[0]) for dtk in district_team_keys ]) raise ndb.Return(filter(lambda x: x is not None, districts))
def get(self, key_name): existing_team = Team.get_by_id(key_name) fms_df = DatafeedFMSAPI('v2.0') df2 = DatafeedFIRSTElasticSearch() year = datetime.date.today().year fms_details = fms_df.getTeamDetails(year, key_name) if fms_details: team, district_team, robot = fms_details[0] else: team = None district_team = None robot = None if team: team = TeamManipulator.mergeModels( team, df2.getTeamDetails(existing_team)) else: team = df2.getTeamDetails(existing_team) if team: team = TeamManipulator.createOrUpdate(team) # Clean up junk district teams # https://www.facebook.com/groups/moardata/permalink/1310068625680096/ dt_keys = DistrictTeam.query( DistrictTeam.team == existing_team.key, DistrictTeam.year == year).fetch(keys_only=True) keys_to_delete = set() for dt_key in dt_keys: if not district_team or dt_key.id() != district_team.key.id(): keys_to_delete.add(dt_key) DistrictTeamManipulator.delete_keys(keys_to_delete) if district_team: district_team = DistrictTeamManipulator.createOrUpdate( district_team) if robot: robot = RobotManipulator.createOrUpdate(robot) template_values = { 'key_name': key_name, 'team': team, 'success': team is not None, 'district': district_team, 'robot': robot, } 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/usfirst_team_details_get.html') self.response.out.write(template.render(path, template_values))
def _query_async(self): district_key = self._query_args[0] year = int(district_key[:4]) district_abbrev = district_key[4:] district_type = DistrictType.abbrevs.get(district_abbrev, None) district_teams = yield DistrictTeam.query( DistrictTeam.year == year, DistrictTeam.district == district_type).fetch_async() team_keys = map(lambda district_team: district_team.team, district_teams) teams = yield ndb.get_multi_async(team_keys) raise ndb.Return(teams)
def _query_async(self): team_key = self._query_args[0] district_team_keys = yield DistrictTeam.query( DistrictTeam.team == ndb.Key(Team, team_key)).fetch_async( keys_only=True) ret = {} for district_team_key in district_team_keys: district_key = district_team_key.id().split('_')[0] year = int(district_key[:4]) ret[year] = district_key raise ndb.Return(ret)
def get(self, key_name): existing_team = Team.get_by_id(key_name) fms_df = DatafeedFMSAPI('v2.0') df2 = DatafeedFIRSTElasticSearch() year = datetime.date.today().year fms_details = fms_df.getTeamDetails(year, key_name) if fms_details: team, district_team, robot = fms_details[0] else: team = None district_team = None robot = None if team: team = TeamManipulator.mergeModels(team, df2.getTeamDetails(existing_team)) else: team = df2.getTeamDetails(existing_team) if team: team = TeamManipulator.createOrUpdate(team) # Clean up junk district teams # https://www.facebook.com/groups/moardata/permalink/1310068625680096/ dt_keys = DistrictTeam.query( DistrictTeam.team == existing_team.key, DistrictTeam.year == year).fetch(keys_only=True) keys_to_delete = set() for dt_key in dt_keys: if not district_team or dt_key.id() != district_team.key.id(): keys_to_delete.add(dt_key) DistrictTeamManipulator.delete_keys(keys_to_delete) if district_team: district_team = DistrictTeamManipulator.createOrUpdate(district_team) if robot: robot = RobotManipulator.createOrUpdate(robot) template_values = { 'key_name': key_name, 'team': team, 'success': team is not None, 'district': district_team, 'robot': robot, } 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/usfirst_team_details_get.html') self.response.out.write(template.render(path, template_values))
def parse(self, response): """ Parse team info from FMSAPI Returns a tuple of: list of models (Team, DistrictTeam, Robot), and a Boolean indicating if there are more pages to be fetched """ # Get team json # don't need to null check, if error, HTTP code != 200, so we wont' get here current_page = response['pageCurrent'] total_pages = response['pageTotal'] teams = response['teams'] ret_models = [] for teamData in teams: # concat city/state/country to get address address = u"{}, {}, {}".format(teamData['city'], teamData['stateProv'], teamData['country']) team = Team( id="frc{}".format(teamData['teamNumber']), team_number=teamData['teamNumber'], name=teamData['nameFull'], nickname=teamData['nameShort'], address=address, website=teamData['website'], rookie_year=teamData['rookieYear'] ) districtTeam = None if teamData['districtCode']: districtAbbrev = DistrictType.abbrevs[teamData['districtCode'].lower()] districtTeam = DistrictTeam( id=DistrictTeam.renderKeyName(self.year, districtAbbrev, team.key_name), team=ndb.Key(Team, team.key_name), year=self.year, district=districtAbbrev ) robot = None if teamData['robotName']: robot = Robot( id=Robot.renderKeyName(team.key_name, self.year), team=ndb.Key(Team, team.key_name), year=self.year, robot_name=teamData['robotName'].strip() ) ret_models.append((team, districtTeam, robot)) return (ret_models, (current_page < total_pages))
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 parse(self, response): """ Parse team info from FMSAPI Returns a tuple of models (Team, DistrictTeam, Robot) """ # Get team json # don't need to null check, if error, HTTP code != 200, so we wont' get here teams = response["teams"] teamData = teams[0] # concat city/state/country to get address address = u"{}, {}, {}".format(teamData["city"], teamData["stateProv"], teamData["country"]) team = Team( team_number=teamData["teamNumber"], name=teamData["nameFull"], nickname=teamData["nameShort"], address=address, rookie_year=teamData["rookieYear"], ) districtTeam = None if teamData["districtCode"]: districtAbbrev = DistrictType.abbrevs[teamData["districtCode"].lower()] districtTeam = DistrictTeam( id=DistrictTeam.renderKeyName(self.year, districtAbbrev, team.key_name), team=ndb.Key(Team, team.key_name), year=self.year, district=districtAbbrev, ) robot = None if teamData["robotName"]: robot = Robot( id=Robot.renderKeyName(team.key_name, self.year), team=ndb.Key(Team, team.key_name), year=self.year, robot_name=teamData["robotName"].strip(), ) return (team, districtTeam, robot)
def get(self, year): year = int(year) team_districts = defaultdict(list) logging.info("Fetching events in {}".format(year)) year_events = Event.query(year == Event.year, Event.district_key == None, Event.event_district_enum != None).fetch() for event in year_events: logging.info("Fetching EventTeams for {}".format(event.key_name)) event_teams = EventTeam.query(EventTeam.event == event.key).fetch() for event_team in event_teams: team_districts[event_team.team.id()].append(event.district_key.id()) new_district_teams = [] for team_key, districts in team_districts.iteritems(): most_frequent_district_key = max(set(districts), key=districts.count) logging.info("Assuming team {} belongs to {}".format(team_key, most_frequent_district_key)) dt_key = DistrictTeam.renderKeyName(most_frequent_district_key, team_key) new_district_teams.append(DistrictTeam(id=dt_key, year=year, team=ndb.Key(Team, team_key), district_key=ndb.Key(District, most_frequent_district_key))) logging.info("Finishing updating old district teams from event teams") DistrictTeamManipulator.createOrUpdate(new_district_teams) self.response.out.write("Finished creating district teams for {}".format(year))
def get_team_cache_keys_and_controllers(cls, affected_refs): """ Gets cache keys and controllers that references this team """ team_keys = affected_refs['key'] event_team_keys_future = EventTeam.query(EventTeam.team.IN([team_key for team_key in team_keys])).fetch_async(None, keys_only=True) district_team_keys_future = DistrictTeam.query(DistrictTeam.team.IN([team_key for team_key in team_keys])).fetch_async(None, keys_only=True) event_keys = set() for et_key in event_team_keys_future.get_result(): event_key_name = et_key.id().split('_')[0] event_keys.add(ndb.Key(Event, event_key_name)) district_keys = set() for dt_key in district_team_keys_future.get_result(): district_key_name = dt_key.id().split('_')[0] district_keys.add(district_key_name) return cls._get_teams_cache_keys_and_controllers(team_keys) + \ cls._get_eventteams_cache_keys_and_controllers(event_keys) + \ cls._get_teamlist_cache_keys_and_controllers(team_keys) + \ cls._get_districtteams_cache_keys_and_controllers(district_keys, team_keys) + \ cls._queries_to_cache_keys_and_controllers(get_affected_queries.team_updated(affected_refs))
class TestDatabaseCacheClearer(unittest2.TestCase): 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 tearDown(self): self.testbed.deactivate() def test_award_updated(self): affected_refs = { 'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'team_list': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015} } cache_keys = [q.cache_key for q in get_affected_queries.award_updated(affected_refs)] self.assertEqual(len(cache_keys), 12) self.assertTrue(EventAwardsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventAwardsQuery('2015cama').cache_key in cache_keys) self.assertTrue(TeamAwardsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamAwardsQuery('frc604').cache_key in cache_keys) self.assertTrue(TeamYearAwardsQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue(TeamYearAwardsQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue(TeamYearAwardsQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue(TeamYearAwardsQuery('frc604', 2015).cache_key in cache_keys) self.assertTrue(TeamEventAwardsQuery('frc254', '2015casj').cache_key in cache_keys) self.assertTrue(TeamEventAwardsQuery('frc254', '2015cama').cache_key in cache_keys) self.assertTrue(TeamEventAwardsQuery('frc604', '2015casj').cache_key in cache_keys) self.assertTrue(TeamEventAwardsQuery('frc604', '2015cama').cache_key in cache_keys) def test_event_updated(self): affected_refs = { 'key': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'year': {2014, 2015}, 'district_key': {ndb.Key(District, '2015fim'), ndb.Key(District, '2014mar')} } cache_keys = [q.cache_key for q in get_affected_queries.event_updated(affected_refs)] self.assertEqual(len(cache_keys), 10) self.assertTrue(EventQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventListQuery(2014).cache_key in cache_keys) self.assertTrue(EventListQuery(2015).cache_key in cache_keys) self.assertTrue(DistrictEventsQuery('2015fim').cache_key in cache_keys) self.assertTrue(DistrictEventsQuery('2014mar').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys) def test_event_details_updated(self): affected_refs = { 'key': {ndb.Key(EventDetails, '2015casj'), ndb.Key(EventDetails, '2015cama')}, } cache_keys = [q.cache_key for q in get_affected_queries.event_details_updated(affected_refs)] self.assertEqual(len(cache_keys), 2) self.assertTrue(EventDetailsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventDetailsQuery('2015cama').cache_key in cache_keys) def test_match_updated(self): affected_refs = { 'key': {ndb.Key(Match, '2015casj_qm1'), ndb.Key(Match, '2015casj_qm2')}, 'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'team_keys': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015}, } cache_keys = [q.cache_key for q in get_affected_queries.match_updated(affected_refs)] self.assertEqual(len(cache_keys), 12) self.assertTrue(MatchQuery('2015casj_qm1').cache_key in cache_keys) self.assertTrue(MatchQuery('2015casj_qm2').cache_key in cache_keys) self.assertTrue(EventMatchesQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventMatchesQuery('2015cama').cache_key in cache_keys) self.assertTrue(TeamEventMatchesQuery('frc254', '2015casj').cache_key in cache_keys) self.assertTrue(TeamEventMatchesQuery('frc254', '2015cama').cache_key in cache_keys) self.assertTrue(TeamEventMatchesQuery('frc604', '2015casj').cache_key in cache_keys) self.assertTrue(TeamEventMatchesQuery('frc604', '2015cama').cache_key in cache_keys) self.assertTrue(TeamYearMatchesQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue(TeamYearMatchesQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue(TeamYearMatchesQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue(TeamYearMatchesQuery('frc604', 2015).cache_key in cache_keys) def test_media_updated_team(self): affected_refs = { 'references': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015}, } cache_keys = [q.cache_key for q in get_affected_queries.media_updated(affected_refs)] self.assertEqual(len(cache_keys), 10) self.assertTrue(TeamYearMediaQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue(TeamYearMediaQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue(TeamSocialMediaQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamYearMediaQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue(TeamYearMediaQuery('frc604', 2015).cache_key in cache_keys) self.assertTrue(TeamSocialMediaQuery('frc604').cache_key in cache_keys) self.assertTrue(EventTeamsMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsMediasQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys) def test_media_updated_event(self): affected_refs = { 'references': {ndb.Key(Event, '2016necmp')}, 'year': {2016}, } cache_keys = [q.cache_key for q in get_affected_queries.media_updated(affected_refs)] self.assertEqual(len(cache_keys), 1) self.assertTrue(EventMediasQuery('2016necmp').cache_key in cache_keys) def test_robot_updated(self): affected_refs = { 'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, } cache_keys = [q.cache_key for q in get_affected_queries.robot_updated(affected_refs)] self.assertEqual(len(cache_keys), 2) self.assertTrue(TeamRobotsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamRobotsQuery('frc604').cache_key in cache_keys) def test_team_updated(self): affected_refs = { 'key': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, } cache_keys = [q.cache_key for q in get_affected_queries.team_updated(affected_refs)] self.assertEqual(len(cache_keys), 13) self.assertTrue(TeamQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamQuery('frc604').cache_key in cache_keys) self.assertTrue(TeamListQuery(0).cache_key in cache_keys) self.assertTrue(TeamListQuery(1).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2010, 1).cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2016ne').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2010cama').cache_key in cache_keys) def test_eventteam_updated(self): affected_refs = { 'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015} } cache_keys = [q.cache_key for q in get_affected_queries.eventteam_updated(affected_refs)] self.assertEqual(len(cache_keys), 18) self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys) self.assertTrue(TeamParticipationQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamParticipationQuery('frc604').cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2014, 0).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2014, 1).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsMediasQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys) def test_districtteam_updated(self): affected_refs = { 'district_key': {ndb.Key(District, '2015fim'), ndb.Key(District, '2015mar')}, 'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')} } cache_keys = [q.cache_key for q in get_affected_queries.districtteam_updated(affected_refs)] self.assertEqual(len(cache_keys), 4) self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys) self.assertTrue(TeamDistrictsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamDistrictsQuery('frc604').cache_key in cache_keys) def test_district_updated(self): affected_refs = { 'key': {ndb.Key(District, '2016ne')}, 'year': {2015, 2016}, 'abbreviation': {'ne', 'chs'} } cache_keys = [q.cache_key for q in get_affected_queries.district_updated(affected_refs)] self.assertEqual(len(cache_keys), 11) self.assertTrue(DistrictsInYearQuery(2015).cache_key in cache_keys) self.assertTrue(DistrictsInYearQuery(2016).cache_key in cache_keys) self.assertTrue(DistrictHistoryQuery('ne').cache_key in cache_keys) self.assertTrue(DistrictHistoryQuery('chs').cache_key in cache_keys) self.assertTrue(DistrictQuery('2016ne').cache_key in cache_keys) self.assertTrue(TeamDistrictsQuery('frc604').cache_key in cache_keys) # Necessary because APIv3 Event models include the District model self.assertTrue(EventQuery('2016necmp').cache_key in cache_keys) self.assertTrue(EventListQuery(2016).cache_key in cache_keys) self.assertTrue(DistrictEventsQuery('2016ne').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc125').cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc125', 2016).cache_key in cache_keys)
def _query_async(self): team_key = self._query_args[0] district_team_keys = yield DistrictTeam.query(DistrictTeam.team == ndb.Key(Team, team_key)).fetch_async(keys_only=True) districts = yield ndb.get_multi_async([ndb.Key(District, dtk.id().split('_')[0]) for dtk in district_team_keys]) raise ndb.Return(districts)
def calculate_event_points(cls, event): event.get_awards_async() event.get_matches_async() district_team_key_futures = DistrictTeam.query(DistrictTeam.district == event.event_district_enum, DistrictTeam.year == event.year).fetch_async(None, keys_only=True) # Typically 3 for District CMP, 1 otherwise POINTS_MULTIPLIER = DistrictPointValues.DISTRICT_CMP_MULTIPLIER.get(event.year, DistrictPointValues.DISTRICT_CMP_MULIPLIER_DEFAULT) if event.event_type_enum == EventType.DISTRICT_CMP else DistrictPointValues.STANDARD_MULTIPLIER district_points = { 'points': defaultdict(lambda: { 'qual_points': 0, 'elim_points': 0, 'alliance_points': 0, 'award_points': 0, 'total': 0, }), 'tiebreakers': defaultdict(lambda: { # for tiebreaker stats that can't be calculated with 'points' 'qual_wins': 0, 'highest_qual_scores': [], }), } single_district_points = district_points.copy() # match points if event.year >= 2015: # Switched to ranking-based points for 2015 and onward cls.calc_rank_based_match_points(event, district_points, event.matches, POINTS_MULTIPLIER) else: cls.calc_wlt_based_match_points(district_points, event.matches, POINTS_MULTIPLIER) # alliance points if event.alliance_selections: selection_points = EventHelper.alliance_selections_to_points(event.key_name, POINTS_MULTIPLIER, event.alliance_selections) for team, points in selection_points.items(): district_points['points'][team]['alliance_points'] += points else: msg = "Event {} has no alliance selection district_points!".format(event.key.id()) if event.event_type_enum in EventType.SEASON_EVENT_TYPES: logging.warning(msg) else: logging.info(msg) # award points for award in event.awards: point_value = 0 if event.year >= 2014: if award.award_type_enum not in AwardType.NON_JUDGED_NON_TEAM_AWARDS: if award.award_type_enum == AwardType.CHAIRMANS: point_value = DistrictPointValues.CHAIRMANS.get(event.year, DistrictPointValues.CHAIRMANS_DEFAULT) elif award.award_type_enum in {AwardType.ENGINEERING_INSPIRATION, AwardType.ROOKIE_ALL_STAR}: point_value = DistrictPointValues.EI_AND_RAS_DEFAULT else: point_value = DistrictPointValues.OTHER_AWARD_DEFAULT else: # Legacy awards if award.award_type_enum in DistrictPointValues.LEGACY_5_PT_AWARDS.get(event.year, []): point_value = 5 elif award.award_type_enum in DistrictPointValues.LEGACY_2_PT_AWARDS.get(event.year, []): point_value = 2 # Add award points to all teams who won for team in award.team_list: district_points['points'][team.id()]['award_points'] += point_value * POINTS_MULTIPLIER # Filter out teams not in this district (only keep those with a DistrictTeam present for this district) for district_team_future in ndb.get_multi_async(district_team_key_futures.get_result()): district_team = district_team_future.get_result() team_key = district_team.team.id() if team_key in district_points['points']: single_district_points['points'][team_key] = district_points['points'][team_key] if team_key in district_points['tiebreakers']: single_district_points['tiebreakers'][team_key] = district_points['tiebreakers'][team_key] for team, point_breakdown in single_district_points['points'].items(): for p in point_breakdown.values(): single_district_points['points'][team]['total'] += p return single_district_points
def calculate_event_points(cls, event): event.get_awards_async() event.get_matches_async() district_team_key_futures = DistrictTeam.query(DistrictTeam.district == event.event_district_enum, DistrictTeam.year == event.year).fetch_async(None, keys_only=True) # Typically 3 for District CMP, 1 otherwise POINTS_MULTIPLIER = DistrictPointValues.DISTRICT_CMP_MULTIPLIER.get(event.year, DistrictPointValues.DISTRICT_CMP_MULIPLIER_DEFAULT) if event.event_type_enum == EventType.DISTRICT_CMP else DistrictPointValues.STANDARD_MULTIPLIER district_points = { 'points': defaultdict(lambda: { 'qual_points': 0, 'elim_points': 0, 'alliance_points': 0, 'award_points': 0, 'total': 0, }), 'tiebreakers': defaultdict(lambda: { # for tiebreaker stats that can't be calculated with 'points' 'qual_wins': 0, 'highest_qual_scores': [], }), } single_district_points = district_points.copy() # match points if event.year >= 2015: # Switched to ranking-based points for 2015 and onward cls.calc_rank_based_match_points(event, district_points, event.matches, POINTS_MULTIPLIER) else: cls.calc_wlt_based_match_points(district_points, event.matches, POINTS_MULTIPLIER) # alliance points if event.alliance_selections: selection_points = EventHelper.alliance_selections_to_points(event.key_name, POINTS_MULTIPLIER, event.alliance_selections) for team, points in selection_points.items(): district_points['points'][team]['alliance_points'] += points else: logging.warning("Event {} has no alliance selection district_points!".format(event.key.id())) # award points for award in event.awards: point_value = 0 if event.year >= 2014: if award.award_type_enum not in AwardType.NON_JUDGED_NON_TEAM_AWARDS: if award.award_type_enum == AwardType.CHAIRMANS: point_value = DistrictPointValues.CHAIRMANS.get(event.year, DistrictPointValues.CHAIRMANS_DEFAULT) elif award.award_type_enum in {AwardType.ENGINEERING_INSPIRATION, AwardType.ROOKIE_ALL_STAR}: point_value = DistrictPointValues.EI_AND_RAS_DEFAULT else: point_value = DistrictPointValues.OTHER_AWARD_DEFAULT else: # Legacy awards if award.award_type_enum in DistrictPointValues.LEGACY_5_PT_AWARDS.get(event.year, []): point_value = 5 elif award.award_type_enum in DistrictPointValues.LEGACY_2_PT_AWARDS.get(event.year, []): point_value = 2 # Add award points to all teams who won for team in award.team_list: district_points['points'][team.id()]['award_points'] += point_value * POINTS_MULTIPLIER # Filter out teams not in this district (only keep those with a DistrictTeam present for this district) for district_team_future in ndb.get_multi_async(district_team_key_futures.get_result()): district_team = district_team_future.get_result() team_key = district_team.team.id() if team_key in district_points['points']: single_district_points['points'][team_key] = district_points['points'][team_key] if team_key in district_points['tiebreakers']: single_district_points['tiebreakers'][team_key] = district_points['tiebreakers'][team_key] for team, point_breakdown in single_district_points['points'].items(): for p in point_breakdown.values(): single_district_points['points'][team]['total'] += p return single_district_points
class TestDatabaseCacheClearer(unittest2.TestCase): 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 tearDown(self): self.testbed.deactivate() def test_award_updated(self): affected_refs = { 'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'team_list': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015} } cache_keys = [ q.cache_key for q in get_affected_queries.award_updated(affected_refs) ] self.assertEqual(len(cache_keys), 12) self.assertTrue(EventAwardsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventAwardsQuery('2015cama').cache_key in cache_keys) self.assertTrue(TeamAwardsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamAwardsQuery('frc604').cache_key in cache_keys) self.assertTrue( TeamYearAwardsQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue( TeamYearAwardsQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue( TeamYearAwardsQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue( TeamYearAwardsQuery('frc604', 2015).cache_key in cache_keys) self.assertTrue( TeamEventAwardsQuery('frc254', '2015casj').cache_key in cache_keys) self.assertTrue( TeamEventAwardsQuery('frc254', '2015cama').cache_key in cache_keys) self.assertTrue( TeamEventAwardsQuery('frc604', '2015casj').cache_key in cache_keys) self.assertTrue( TeamEventAwardsQuery('frc604', '2015cama').cache_key in cache_keys) def test_event_updated(self): affected_refs = { 'key': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'year': {2014, 2015}, 'district_key': {ndb.Key(District, '2015fim'), ndb.Key(District, '2014mar')} } cache_keys = [ q.cache_key for q in get_affected_queries.event_updated(affected_refs) ] self.assertEqual(len(cache_keys), 10) self.assertTrue(EventQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventListQuery(2014).cache_key in cache_keys) self.assertTrue(EventListQuery(2015).cache_key in cache_keys) self.assertTrue(DistrictEventsQuery('2015fim').cache_key in cache_keys) self.assertTrue(DistrictEventsQuery('2014mar').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys) def test_event_details_updated(self): affected_refs = { 'key': { ndb.Key(EventDetails, '2015casj'), ndb.Key(EventDetails, '2015cama') }, } cache_keys = [ q.cache_key for q in get_affected_queries.event_details_updated(affected_refs) ] self.assertEqual(len(cache_keys), 2) self.assertTrue(EventDetailsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventDetailsQuery('2015cama').cache_key in cache_keys) def test_match_updated(self): affected_refs = { 'key': {ndb.Key(Match, '2015casj_qm1'), ndb.Key(Match, '2015casj_qm2')}, 'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'team_keys': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015}, } cache_keys = [ q.cache_key for q in get_affected_queries.match_updated(affected_refs) ] self.assertEqual(len(cache_keys), 12) self.assertTrue(MatchQuery('2015casj_qm1').cache_key in cache_keys) self.assertTrue(MatchQuery('2015casj_qm2').cache_key in cache_keys) self.assertTrue(EventMatchesQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventMatchesQuery('2015cama').cache_key in cache_keys) self.assertTrue( TeamEventMatchesQuery('frc254', '2015casj').cache_key in cache_keys) self.assertTrue( TeamEventMatchesQuery('frc254', '2015cama').cache_key in cache_keys) self.assertTrue( TeamEventMatchesQuery('frc604', '2015casj').cache_key in cache_keys) self.assertTrue( TeamEventMatchesQuery('frc604', '2015cama').cache_key in cache_keys) self.assertTrue( TeamYearMatchesQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue( TeamYearMatchesQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue( TeamYearMatchesQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue( TeamYearMatchesQuery('frc604', 2015).cache_key in cache_keys) def test_media_updated_team(self): affected_refs = { 'references': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015}, } cache_keys = [ q.cache_key for q in get_affected_queries.media_updated(affected_refs) ] self.assertEqual(len(cache_keys), 10) self.assertTrue( TeamYearMediaQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue( TeamYearMediaQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue(TeamSocialMediaQuery('frc254').cache_key in cache_keys) self.assertTrue( TeamYearMediaQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue( TeamYearMediaQuery('frc604', 2015).cache_key in cache_keys) self.assertTrue(TeamSocialMediaQuery('frc604').cache_key in cache_keys) self.assertTrue( EventTeamsMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue( EventTeamsMediasQuery('2015casj').cache_key in cache_keys) self.assertTrue( EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue( EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys) def test_media_updated_event(self): affected_refs = { 'references': {ndb.Key(Event, '2016necmp')}, 'year': {2016}, } cache_keys = [ q.cache_key for q in get_affected_queries.media_updated(affected_refs) ] self.assertEqual(len(cache_keys), 1) self.assertTrue(EventMediasQuery('2016necmp').cache_key in cache_keys) def test_robot_updated(self): affected_refs = { 'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, } cache_keys = [ q.cache_key for q in get_affected_queries.robot_updated(affected_refs) ] self.assertEqual(len(cache_keys), 2) self.assertTrue(TeamRobotsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamRobotsQuery('frc604').cache_key in cache_keys) def test_team_updated(self): affected_refs = { 'key': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, } cache_keys = [ q.cache_key for q in get_affected_queries.team_updated(affected_refs) ] self.assertEqual(len(cache_keys), 13) self.assertTrue(TeamQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamQuery('frc604').cache_key in cache_keys) self.assertTrue(TeamListQuery(0).cache_key in cache_keys) self.assertTrue(TeamListQuery(1).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2010, 1).cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2016ne').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2010cama').cache_key in cache_keys) def test_eventteam_updated(self): affected_refs = { 'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015} } cache_keys = [ q.cache_key for q in get_affected_queries.eventteam_updated(affected_refs) ] self.assertEqual(len(cache_keys), 18) self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys) self.assertTrue( TeamParticipationQuery('frc254').cache_key in cache_keys) self.assertTrue( TeamParticipationQuery('frc604').cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2014, 0).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2014, 1).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys) self.assertTrue( EventTeamsMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue( EventTeamsMediasQuery('2015casj').cache_key in cache_keys) self.assertTrue( EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue( EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys) def test_districtteam_updated(self): affected_refs = { 'district_key': {ndb.Key(District, '2015fim'), ndb.Key(District, '2015mar')}, 'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')} } cache_keys = [ q.cache_key for q in get_affected_queries.districtteam_updated(affected_refs) ] self.assertEqual(len(cache_keys), 4) self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys) self.assertTrue(TeamDistrictsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamDistrictsQuery('frc604').cache_key in cache_keys) def test_district_updated(self): affected_refs = { 'key': {ndb.Key(District, '2016ne')}, 'year': {2015, 2016}, 'abbreviation': {'ne', 'chs'} } cache_keys = [ q.cache_key for q in get_affected_queries.district_updated(affected_refs) ] self.assertEqual(len(cache_keys), 11) self.assertTrue(DistrictsInYearQuery(2015).cache_key in cache_keys) self.assertTrue(DistrictsInYearQuery(2016).cache_key in cache_keys) self.assertTrue(DistrictHistoryQuery('ne').cache_key in cache_keys) self.assertTrue(DistrictHistoryQuery('chs').cache_key in cache_keys) self.assertTrue(DistrictQuery('2016ne').cache_key in cache_keys) self.assertTrue(TeamDistrictsQuery('frc604').cache_key in cache_keys) # Necessary because APIv3 Event models include the District model self.assertTrue(EventQuery('2016necmp').cache_key in cache_keys) self.assertTrue(EventListQuery(2016).cache_key in cache_keys) self.assertTrue(DistrictEventsQuery('2016ne').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc125').cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc125', 2016).cache_key in cache_keys)
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 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()
class TestDatabaseCacheClearer(unittest2.TestCase): 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=".") 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() def tearDown(self): self.testbed.deactivate() def test_award_updated(self): affected_refs = { 'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'team_list': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015} } cache_keys = [q.cache_key for q in get_affected_queries.award_updated(affected_refs)] self.assertEqual(len(cache_keys), 12) self.assertTrue(EventAwardsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventAwardsQuery('2015cama').cache_key in cache_keys) self.assertTrue(TeamAwardsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamAwardsQuery('frc604').cache_key in cache_keys) self.assertTrue(TeamYearAwardsQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue(TeamYearAwardsQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue(TeamYearAwardsQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue(TeamYearAwardsQuery('frc604', 2015).cache_key in cache_keys) self.assertTrue(TeamEventAwardsQuery('frc254', '2015casj').cache_key in cache_keys) self.assertTrue(TeamEventAwardsQuery('frc254', '2015cama').cache_key in cache_keys) self.assertTrue(TeamEventAwardsQuery('frc604', '2015casj').cache_key in cache_keys) self.assertTrue(TeamEventAwardsQuery('frc604', '2015cama').cache_key in cache_keys) def test_event_updated(self): affected_refs = { 'key': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'year': {2014, 2015}, 'event_district_key': {'2015fim', '2014mar'} } cache_keys = [q.cache_key for q in get_affected_queries.event_updated(affected_refs)] self.assertEqual(len(cache_keys), 8) self.assertTrue(EventListQuery(2014).cache_key in cache_keys) self.assertTrue(EventListQuery(2015).cache_key in cache_keys) self.assertTrue(DistrictEventsQuery('2015fim').cache_key in cache_keys) self.assertTrue(DistrictEventsQuery('2014mar').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys) def test_match_updated(self): affected_refs = { 'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'team_keys': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015}, } cache_keys = [q.cache_key for q in get_affected_queries.match_updated(affected_refs)] self.assertEqual(len(cache_keys), 10) self.assertTrue(EventMatchesQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventMatchesQuery('2015cama').cache_key in cache_keys) self.assertTrue(TeamEventMatchesQuery('frc254', '2015casj').cache_key in cache_keys) self.assertTrue(TeamEventMatchesQuery('frc254', '2015cama').cache_key in cache_keys) self.assertTrue(TeamEventMatchesQuery('frc604', '2015casj').cache_key in cache_keys) self.assertTrue(TeamEventMatchesQuery('frc604', '2015cama').cache_key in cache_keys) self.assertTrue(TeamYearMatchesQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue(TeamYearMatchesQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue(TeamYearMatchesQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue(TeamYearMatchesQuery('frc604', 2015).cache_key in cache_keys) def test_media_updated(self): affected_refs = { 'references': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015}, } cache_keys = [q.cache_key for q in get_affected_queries.media_updated(affected_refs)] self.assertEqual(len(cache_keys), 10) self.assertTrue(TeamYearMediaQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue(TeamYearMediaQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue(TeamSocialMediaQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamYearMediaQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue(TeamYearMediaQuery('frc604', 2015).cache_key in cache_keys) self.assertTrue(TeamSocialMediaQuery('frc604').cache_key in cache_keys) self.assertTrue(EventTeamsMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsMediasQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys) def test_robot_updated(self): affected_refs = { 'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, } cache_keys = [q.cache_key for q in get_affected_queries.robot_updated(affected_refs)] self.assertEqual(len(cache_keys), 2) self.assertTrue(TeamRobotsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamRobotsQuery('frc604').cache_key in cache_keys) def test_team_updated(self): affected_refs = { 'key': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, } cache_keys = [q.cache_key for q in get_affected_queries.team_updated(affected_refs)] self.assertEqual(len(cache_keys), 10) self.assertTrue(TeamListQuery(0).cache_key in cache_keys) self.assertTrue(TeamListQuery(1).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2010, 1).cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2010cama').cache_key in cache_keys) def test_eventteam_updated(self): affected_refs = { 'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015} } cache_keys = [q.cache_key for q in get_affected_queries.eventteam_updated(affected_refs)] self.assertEqual(len(cache_keys), 18) self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys) self.assertTrue(TeamParticipationQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamParticipationQuery('frc604').cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue(TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2014, 0).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2014, 1).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsMediasQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys) def test_districtteam_updated(self): affected_refs = { 'district_key': {'2015fim', '2015mar'}, 'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')} } cache_keys = [q.cache_key for q in get_affected_queries.districtteam_updated(affected_refs)] self.assertEqual(len(cache_keys), 4) self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys) self.assertTrue(TeamDistrictsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamDistrictsQuery('frc604').cache_key in cache_keys)
class TestDatabaseCacheClearer(unittest2.TestCase): 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=".") 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() def tearDown(self): self.testbed.deactivate() def test_award_updated(self): affected_refs = { 'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'team_list': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015} } cache_keys = [ q.cache_key for q in get_affected_queries.award_updated(affected_refs) ] self.assertEqual(len(cache_keys), 12) self.assertTrue(EventAwardsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventAwardsQuery('2015cama').cache_key in cache_keys) self.assertTrue(TeamAwardsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamAwardsQuery('frc604').cache_key in cache_keys) self.assertTrue( TeamYearAwardsQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue( TeamYearAwardsQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue( TeamYearAwardsQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue( TeamYearAwardsQuery('frc604', 2015).cache_key in cache_keys) self.assertTrue( TeamEventAwardsQuery('frc254', '2015casj').cache_key in cache_keys) self.assertTrue( TeamEventAwardsQuery('frc254', '2015cama').cache_key in cache_keys) self.assertTrue( TeamEventAwardsQuery('frc604', '2015casj').cache_key in cache_keys) self.assertTrue( TeamEventAwardsQuery('frc604', '2015cama').cache_key in cache_keys) def test_event_updated(self): affected_refs = { 'key': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'year': {2014, 2015}, 'event_district_key': {'2015fim', '2014mar'} } cache_keys = [ q.cache_key for q in get_affected_queries.event_updated(affected_refs) ] self.assertEqual(len(cache_keys), 8) self.assertTrue(EventListQuery(2014).cache_key in cache_keys) self.assertTrue(EventListQuery(2015).cache_key in cache_keys) self.assertTrue(DistrictEventsQuery('2015fim').cache_key in cache_keys) self.assertTrue(DistrictEventsQuery('2014mar').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys) def test_match_updated(self): affected_refs = { 'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'team_keys': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015}, } cache_keys = [ q.cache_key for q in get_affected_queries.match_updated(affected_refs) ] self.assertEqual(len(cache_keys), 10) self.assertTrue(EventMatchesQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventMatchesQuery('2015cama').cache_key in cache_keys) self.assertTrue( TeamEventMatchesQuery('frc254', '2015casj').cache_key in cache_keys) self.assertTrue( TeamEventMatchesQuery('frc254', '2015cama').cache_key in cache_keys) self.assertTrue( TeamEventMatchesQuery('frc604', '2015casj').cache_key in cache_keys) self.assertTrue( TeamEventMatchesQuery('frc604', '2015cama').cache_key in cache_keys) self.assertTrue( TeamYearMatchesQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue( TeamYearMatchesQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue( TeamYearMatchesQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue( TeamYearMatchesQuery('frc604', 2015).cache_key in cache_keys) def test_media_updated(self): affected_refs = { 'references': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015}, } cache_keys = [ q.cache_key for q in get_affected_queries.media_updated(affected_refs) ] self.assertEqual(len(cache_keys), 10) self.assertTrue( TeamYearMediaQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue( TeamYearMediaQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue(TeamSocialMediaQuery('frc254').cache_key in cache_keys) self.assertTrue( TeamYearMediaQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue( TeamYearMediaQuery('frc604', 2015).cache_key in cache_keys) self.assertTrue(TeamSocialMediaQuery('frc604').cache_key in cache_keys) self.assertTrue( EventTeamsMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue( EventTeamsMediasQuery('2015casj').cache_key in cache_keys) self.assertTrue( EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue( EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys) def test_robot_updated(self): affected_refs = { 'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, } cache_keys = [ q.cache_key for q in get_affected_queries.robot_updated(affected_refs) ] self.assertEqual(len(cache_keys), 2) self.assertTrue(TeamRobotsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamRobotsQuery('frc604').cache_key in cache_keys) def test_team_updated(self): affected_refs = { 'key': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, } cache_keys = [ q.cache_key for q in get_affected_queries.team_updated(affected_refs) ] self.assertEqual(len(cache_keys), 10) self.assertTrue(TeamListQuery(0).cache_key in cache_keys) self.assertTrue(TeamListQuery(1).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2010, 1).cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2010cama').cache_key in cache_keys) def test_eventteam_updated(self): affected_refs = { 'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')}, 'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}, 'year': {2014, 2015} } cache_keys = [ q.cache_key for q in get_affected_queries.eventteam_updated(affected_refs) ] self.assertEqual(len(cache_keys), 18) self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys) self.assertTrue( TeamParticipationQuery('frc254').cache_key in cache_keys) self.assertTrue( TeamParticipationQuery('frc604').cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc254', 2014).cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc604', 2014).cache_key in cache_keys) self.assertTrue( TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2014, 0).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2014, 1).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys) self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys) self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys) self.assertTrue( EventTeamsMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue( EventTeamsMediasQuery('2015casj').cache_key in cache_keys) self.assertTrue( EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys) self.assertTrue( EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys) def test_districtteam_updated(self): affected_refs = { 'district_key': {'2015fim', '2015mar'}, 'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')} } cache_keys = [ q.cache_key for q in get_affected_queries.districtteam_updated(affected_refs) ] self.assertEqual(len(cache_keys), 4) self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys) self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys) self.assertTrue(TeamDistrictsQuery('frc254').cache_key in cache_keys) self.assertTrue(TeamDistrictsQuery('frc604').cache_key in cache_keys)