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.event = Event( id="2013casj", event_short="casj", year=2013, event_type_enum=EventType.REGIONAL, ) self.old_award = Award( id=Award.render_key_name(self.event.key_name, AwardType.WINNER), name_str="Regional Winner", award_type_enum=AwardType.WINNER, year=2013, event=self.event.key, event_type_enum=EventType.REGIONAL, team_list=[ndb.Key(Team, 'frc111'), ndb.Key(Team, 'frc234')], recipient_json_list=[ json.dumps({ 'team_number': 111, 'awardee': None }), json.dumps({ 'team_number': 234, 'awardee': None }) ], ) self.new_award = Award( id="2013casj_1", name_str="Regional Champion", award_type_enum=AwardType.WINNER, year=2013, event=self.event.key, event_type_enum=EventType.REGIONAL, team_list=[ndb.Key(Team, 'frc359')], recipient_json_list=[ json.dumps({ 'team_number': 359, 'awardee': None }) ], )
def _process_request(self, request, event_key): event = Event.get_by_id(event_key) awards = [] for award in JSONAwardsParser.parse(request.body, event_key): awards.append( Award(id=Award.render_key_name(event.key_name, award['award_type_enum']), name_str=award['name_str'], award_type_enum=award['award_type_enum'], year=event.year, event=event.key, event_type_enum=event.event_type_enum, team_list=[ ndb.Key(Team, team_key) for team_key in award['team_key_list'] ], recipient_json_list=award['recipient_json_list'])) # it's easier to clear all awards and add new ones than try to find the difference old_award_keys = Award.query(Award.event == event.key).fetch( None, keys_only=True) AwardManipulator.delete_keys(old_award_keys) if event.remap_teams: EventHelper.remapteams_awards(awards, event.remap_teams) AwardManipulator.createOrUpdate(awards) self.response.out.write( json.dumps({'Success': "Awards successfully updated"}))
def getEventAwards(self, event): """ Works reliably for regional events from 2002-present and championship events from 2007-present """ if event.year < 2002 or (event.event_type_enum in EventType.CMP_EVENT_TYPES and event.year < 2007): # award pages malformatted logging.warning("Skipping awards parsing for event: {}".format(event.key_name)) return [] url = self.EVENT_AWARDS_URL_PATTERN % (event.year, self.EVENT_SHORT_EXCEPTIONS.get(event.event_short, event.event_short)) awards, _ = self.parse(url, self.YEAR_AWARD_PARSER.get(event.year, self.DEFAULT_AWARD_PARSER)) return [Award( id=Award.render_key_name(event.key_name, award['award_type_enum']), name_str=award['name_str'], award_type_enum=award['award_type_enum'], year=event.year, event=event.key, event_type_enum=event.event_type_enum, team_list=[ndb.Key(Team, 'frc{}'.format(team_number)) for team_number in award['team_number_list']], recipient_json_list=award['recipient_json_list'] ) for award in awards]
def add_awards_from_csv(cls, awards_csv): events = {} # for reducing datastore fetches of events and teams awards = [] for award in CSVAwardsParser.parse(awards_csv): event_key_name = '{}{}'.format(award['year'], award['event_short']) if event_key_name in events: event = events[event_key_name] else: event = Event.get_by_id(event_key_name) if event is None: logging.warning( "Event: {} doesn't exist!".format(event_key_name)) continue events[event_key_name] = event awards.append( Award(id=Award.render_key_name(event.key_name, award['award_type_enum']), name_str=award['name_str'], award_type_enum=award['award_type_enum'], year=event.year, event=event.key, event_type_enum=event.event_type_enum, team_list=[ ndb.Key(Team, 'frc{}'.format(team_number)) for team_number in award['team_number_list'] ], recipient_json_list=award['recipient_json_list'])) new_awards = AwardManipulator.createOrUpdate(awards) if type(new_awards) != list: new_awards = [new_awards] return new_awards
def get(self, event_key): # Fetch for later event_future = Event.get_by_id_async(event_key) matches_future = match_query.EventMatchesQuery(event_key).fetch_async() # Rebuild event teams taskqueue.add( url='/tasks/math/do/eventteam_update/' + event_key, method='GET') # Create Winner/Finalist awards for offseason events awards = [] event = event_future.get_result() if event.event_type_enum in {EventType.OFFSEASON, EventType.FOC}: matches = MatchHelper.organizeMatches(matches_future.get_result()) bracket = MatchHelper.generateBracket(matches, event, event.alliance_selections) if 'f' in bracket: winning_alliance = '{}_alliance'.format(bracket['f'][1]['winning_alliance']) if winning_alliance == 'red_alliance': losing_alliance = 'blue_alliance' else: losing_alliance = 'red_alliance' awards.append(Award( id=Award.render_key_name(event.key_name, AwardType.WINNER), name_str="Winner", award_type_enum=AwardType.WINNER, year=event.year, event=event.key, event_type_enum=event.event_type_enum, team_list=[ndb.Key(Team, 'frc{}'.format(team)) for team in bracket['f'][1][winning_alliance] if team.isdigit()], recipient_json_list=[json.dumps({'team_number': team, 'awardee': None}) for team in bracket['f'][1][winning_alliance]], )) awards.append(Award( id=Award.render_key_name(event.key_name, AwardType.FINALIST), name_str="Finalist", award_type_enum=AwardType.FINALIST, year=event.year, event=event.key, event_type_enum=event.event_type_enum, team_list=[ndb.Key(Team, 'frc{}'.format(team)) for team in bracket['f'][1][losing_alliance] if team.isdigit()], recipient_json_list=[json.dumps({'team_number': team, 'awardee': None}) for team in bracket['f'][1][losing_alliance]], )) AwardManipulator.createOrUpdate(awards) self.response.out.write("Finished post-event tasks for {}. Created awards: {}".format(event_key, awards))
def test_remap_awards(self): awards = [ Award(recipient_json_list=[ """{"team_number": 2, "awardee": null}""" ]), ] EventHelper.remapteams_awards(awards, self.remap_teams) self.assertEqual(awards[0].recipient_list[0]['team_number'], '200') self.assertEqual(awards[0].team_list, [ndb.Key('Team', 'frc200')])
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() self.testbed.init_taskqueue_stub(root_path='.') self.event = Event( id='2020miket', event_type_enum=EventType.DISTRICT, short_name='Kettering University #1', name='FIM District Kettering University Event #1', event_short='miket', year=2020 ) self.team = Team( id='frc7332', team_number=7332 ) self.award = Award( id=Award.render_key_name(self.event.key_name, AwardType.INDUSTRIAL_DESIGN), name_str='Industrial Design Award sponsored by General Motors', award_type_enum=AwardType.INDUSTRIAL_DESIGN, event=self.event.key, event_type_enum=EventType.DISTRICT, year=2020 ) self.winner_award = Award( id=Award.render_key_name(self.event.key_name, AwardType.WINNER), name_str='District Event Winner', award_type_enum=AwardType.WINNER, event=self.event.key, event_type_enum=EventType.DISTRICT, year=2020 )
def test_team_awards(self): # Insert some Teams frc1 = Team( id='frc1', team_number=1 ) frc1.put() frc2 = Team( id='frc2', team_number=2 ) frc2.put() frc3 = Team( id='frc3', team_number=3 ) frc3.put() # Insert some Awards for some Teams award = Award( id=Award.render_key_name(self.event_ends_today.key_name, AwardType.INDUSTRIAL_DESIGN), name_str='Industrial Design Award sponsored by General Motors', award_type_enum=AwardType.INDUSTRIAL_DESIGN, event=self.event_ends_today.key, event_type_enum=EventType.REGIONAL, team_list=[ndb.Key(Team, 'frc1')], year=2020 ) award.put() winner_award = Award( id=Award.render_key_name(self.event_ends_today.key_name, AwardType.WINNER), name_str='Regional Event Winner', award_type_enum=AwardType.WINNER, event=self.event_ends_today.key, event_type_enum=EventType.REGIONAL, team_list=[ndb.Key(Team, 'frc2'), ndb.Key(Team, 'frc1')], year=2020 ) winner_award.put() self.assertItemsEqual(self.event_ends_today.team_awards().keys(), [frc1.key, frc2.key])
def parse(self, response): awards_by_type = {} for award in response['Awards']: team_number = award['teamNumber'] if self.valid_team_nums is not None and team_number not in self.valid_team_nums: continue award_type_enum = AwardHelper.parse_award_type(award['name']) if award_type_enum is None: continue recipient_json = json.dumps({ 'team_number': team_number, 'awardee': award['person'], }) if award_type_enum in awards_by_type: if team_number is not None: awards_by_type[award_type_enum]['team_number_list'].append( team_number) awards_by_type[award_type_enum]['recipient_json_list'].append( recipient_json) else: awards_by_type[award_type_enum] = { 'name_str': award['name'], 'award_type_enum': award_type_enum, 'team_number_list': [team_number] if team_number is not None else [], 'recipient_json_list': [recipient_json], } awards = [] for award in awards_by_type.values(): awards.append( Award(id=Award.render_key_name(self.event.key_name, award['award_type_enum']), name_str=award['name_str'], award_type_enum=award['award_type_enum'], year=self.event.year, event=self.event.key, event_type_enum=self.event.event_type_enum, team_list=[ ndb.Key(Team, 'frc{}'.format(team_number)) for team_number in award['team_number_list'] ], recipient_json_list=award['recipient_json_list'])) return awards
def post(self): # create a new award print('Award API: create a new award') requestData = request.get_data().decode('utf8') awardData = json.loads(requestData) newAward = Award() newAward.awardTitle = awardData['p_award_title'] newAward.awardDescription = awardData['p_award_description'] newAward.awardPoints = awardData['p_award_points'] newAward.awardAuthor = awardData['p_award_author'] newAward.awardCreatedDate = awardData['p_award_created_date'] newAward.awardUpdatedDate = awardData['p_award_updated_date'] newAward.awardCreatedBy = awardData['p_award_created_by'] newAward.awardUpdatedBy = awardData['p_award_updated_by'] add_award(newAward) # TODO: Finish this section, then do "def put()" return jsonify({"Saved": True})
def store_award(data, event): award = Award(id=Award.render_key_name(data['event_key'], data['award_type'])) award.event = ndb.Key(Event, data['event_key']) award.award_type_enum = data['award_type'] award.year = data['year'] award.name_str = data['name'] award.event_type_enum = event.event_type_enum recipient_list_fixed = [] team_keys = [] for recipient in data['recipient_list']: if recipient['team_key']: team_keys.append(ndb.Key(Team, recipient['team_key'])) recipient_list_fixed.append(json.dumps({ 'awardee': recipient['awardee'], 'team_number': int(recipient['team_key'][3:]) if recipient['team_key'] else None, })) award.recipient_json_list = recipient_list_fixed return AwardManipulator.createOrUpdate(award)
def post(self): self._require_admin() awards_csv = self.request.get('awards_csv') events = {} # for reducing datastore fetches of events and teams awards = [] for award in CSVAwardsParser.parse(awards_csv): event_key_name = '{}{}'.format(award['year'], award['event_short']) if event_key_name in events: event = events[event_key_name] else: event = Event.get_by_id(event_key_name) if event is None: logging.warning( "Event: {} doesn't exist!".format(event_key_name)) continue events[event_key_name] = event awards.append( Award(id=Award.render_key_name(event.key_name, award['award_type_enum']), name_str=award['name_str'], award_type_enum=award['award_type_enum'], year=event.year, event=event.key, event_type_enum=event.event_type_enum, team_list=[ ndb.Key(Team, 'frc{}'.format(team_number)) for team_number in award['team_number_list'] ], recipient_json_list=award['recipient_json_list'])) new_awards = AwardManipulator.createOrUpdate(awards) if type(new_awards) != list: new_awards = [new_awards] self.template_values = { 'awards': new_awards, } path = os.path.join(os.path.dirname(__file__), '../../templates/admin/awards_add.html') self.response.out.write(template.render(path, self.template_values))
def post(self, award_key): self._require_admin() event_key_name = self.request.get('event_key_name') recipient_json_list = [] team_list = [] for recipient in json.loads(self.request.get('recipient_list_json')): recipient_json_list.append(json.dumps(recipient)) if recipient['team_number'] is not None: team_list.append( ndb.Key(Team, 'frc{}'.format(recipient['team_number']))) award = Award( id=award_key, name_str=self.request.get('name_str'), award_type_enum=int(self.request.get('award_type_enum')), event=ndb.Key(Event, event_key_name), event_type_enum=int(self.request.get('event_type_enum')), team_list=team_list, recipient_json_list=recipient_json_list, ) award = AwardManipulator.createOrUpdate(award, auto_union=False) self.redirect("/admin/event/" + event_key_name)
def get(self, event_key): if tba_config.CONFIG["env"] == "prod": # disable in prod for now logging.error("Tried to restore {} from CSV in prod! No can do.".format(event_key)) return event = Event.get_by_id(event_key) # alliances result = urlfetch.fetch(self.ALLIANCES_URL.format(event.year, event_key, event_key)) if result.status_code != 200: logging.warning('Unable to retreive url: ' + (self.ALLIANCES_URL.format(event.year, event_key, event_key))) else: data = result.content.replace('frc', '') alliance_selections = CSVAllianceSelectionsParser.parse(data) event_details = EventDetails( id=event_key, alliance_selections=alliance_selections ) EventDetailsManipulator.createOrUpdate(event_details) # awards result = urlfetch.fetch(self.AWARDS_URL.format(event.year, event_key, event_key)) if result.status_code != 200: logging.warning('Unable to retreive url: ' + (self.AWARDS_URL.format(event.year, event_key, event_key))) else: # convert into expected input format data = StringIO.StringIO() writer = csv.writer(data, delimiter=',') for row in csv.reader(StringIO.StringIO(result.content), delimiter=','): writer.writerow([event.year, event.event_short, row[1], row[2].replace('frc', ''), row[3]]) awards = [] for award in CSVAwardsParser.parse(data.getvalue()): awards.append(Award( id=Award.render_key_name(event.key_name, award['award_type_enum']), name_str=award['name_str'], award_type_enum=award['award_type_enum'], year=event.year, event=event.key, event_type_enum=event.event_type_enum, team_list=[ndb.Key(Team, 'frc{}'.format(team_number)) for team_number in award['team_number_list']], recipient_json_list=award['recipient_json_list'] )) AwardManipulator.createOrUpdate(awards) # matches result = urlfetch.fetch(self.MATCHES_URL.format(event.year, event_key, event_key)) if result.status_code != 200: logging.warning('Unable to retreive url: ' + (self.MATCHES_URL.format(event.year, event_key, event_key))) else: data = result.content.replace('frc', '').replace('{}_'.format(event_key), '') match_dicts, _ = OffseasonMatchesParser.parse(data) matches = [ Match( id=Match.renderKeyName( event.key.id(), match.get("comp_level", None), match.get("set_number", 0), match.get("match_number", 0)), event=event.key, year=event.year, set_number=match.get("set_number", 0), match_number=match.get("match_number", 0), comp_level=match.get("comp_level", None), team_key_names=match.get("team_key_names", None), alliances_json=match.get("alliances_json", None) ) for match in match_dicts] MatchManipulator.createOrUpdate(matches) # rankings result = urlfetch.fetch(self.RANKINGS_URL.format(event.year, event_key, event_key)) if result.status_code != 200: logging.warning('Unable to retreive url: ' + (self.RANKINGS_URL.format(event.year, event_key, event_key))) else: # convert into expected input format rankings = list(csv.reader(StringIO.StringIO(result.content), delimiter=',')) event_details = EventDetails( id=event_key, rankings=rankings ) EventDetailsManipulator.createOrUpdate(event_details) self.response.out.write("Done restoring {}!".format(event_key))
def setUp(self): app = webapp2.WSGIApplication([ webapp2.Route(r'/<team_key:>', ApiTeamController, 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() 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", ) self.team.put() self.event = Event( id="2010sc", name="Palmetto Regional", event_type_enum=EventType.REGIONAL, short_name="Palmetto", event_short="sc", year=datetime.now().year, end_date=datetime(2010, 03, 27), official=True, location='Clemson, SC', start_date=datetime(2010, 03, 24), ) self.event.put() self.event_team = EventTeam(team=self.team.key, event=self.event.key, year=datetime.now().year) self.event_team.put() self.match = Match( id="2010sc_qm1", alliances_json= """{"blue": {"score": 57, "teams": ["frc3464", "frc20", "frc1073"]}, "red": {"score": 74, "teams": ["frc281", "frc571", "frc176"]}}""", comp_level="qm", event=self.event.key, game="frc_2012_rebr", set_number=1, match_number=1, team_key_names=[ u'frc281', u'frc571', u'frc176', u'frc3464', u'frc20', u'frc1073' ], ) self.match.put() self.award = Award( name_str="Engineering Inspiration", award_type_enum=AwardType.ENGINEERING_INSPIRATION, year=datetime.now().year, event=self.event.key, event_type_enum=EventType.REGIONAL, team_list=[self.team.key], recipient_json_list=[ json.dumps({ 'team_number': 281, 'awardee': None }) ], ) self.award.put()
def test_cached_query_result_team_awards(self): py3_b64 = "eJzFlEtv00AUhR3n5aSP0AYJZKHKpLSUigbnoRaxK4X+gJRFNsia2AOZ1I94PGkVEFJhgRAseBQJ2LKDVResCurC/mNc26iS06Q0Cagb25qZc+/4nk9nj39oc0tqA6nb2NSKqmUYllk0LA3rThHtIqpl14OnHbvx3OZVRYUt1cli0//I2vG6wHNca7E1zRqI7ay0qaWtNKlGL07MJgNlIVOW5YpBlJI8SS+JuaCowrptrGCzY0jcMi9k6WUhLaZVihHDGixlBO+V+8Y98N57372f7iFPb4lJvINNBpvX1N5uzpPkfX/TfR1Lhd2Y5vcKFD29OFoUcqJgIgMrDqOwNideqVnWNsHSuq5LWwxRKbi5tEmJhrp0A87nKVZJm/jlWo5lKjpxmBRbXhIXnxaCP8K4cEcyO7p+UyowjAwF+jUwhcVSqSo/G7uILEORipgJlv8I+w0i8QAOwBzSj6jqd4ZBDKuCVqAKHOm0tWNH3B9RR6bERBcjf4BxwdvPuS9inJ2opziO0xEjZslOvrRTNTvdaProCM14fddHZeEEKvljVAQwr6oxpTyQFL4PKV+9I/ettzcKKdDsNFLme0jJizM1/JhYJtKlTQJPmOjYzpZLq/8Ij3GLVKtrwzMG1x+ZsWFVcMF+ZHqfowREyPwYkplpAo7Zmj0R4jgJOH6InSG5fBwrg5Nr7iSP7pH7xX33X3is9PA4L169h4ihY7rRpF0H3pI/LmmrTShhYYqdT/IMzpDIbPo5NeU7NV2zc6FTF8Ap5yzBsUb0IYPjl7fvHXiH3rfhjYJm5x4cgTF3Bxe5Li78tchq9fbYNUaKjRCQclQ1f4oqBSq47fCiQaHR434ExU8hijM+irM1O9/Axd8QcvqT" expected_result = [ Award( key=ndb.Key("Award", "2003mi_10", app="tbatv-prod-hrd"), award_type_enum=10, created=datetime.datetime(2013, 11, 23, 21, 17, 57, 121480), event=ndb.Key("Event", "2003mi", app="tbatv-prod-hrd"), event_type_enum=0, name_str=u"Rookie All Star Award Friday", recipient_json_list=[ u'{"awardee": null, "team_number": 1140}', u'{"awardee": null, "team_number": 1000}', ], team_list=[ ndb.Key("Team", "frc1140", app="tbatv-prod-hrd"), ndb.Key("Team", "frc1000", app="tbatv-prod-hrd"), ], updated=datetime.datetime(2013, 11, 23, 21, 17, 57, 121460), year=2003, ), Award( key=ndb.Key("Award", "2004dt_2", app="tbatv-prod-hrd"), award_type_enum=2, created=datetime.datetime(2013, 11, 23, 21, 17, 20, 943970), event=ndb.Key("Event", "2004dt", app="tbatv-prod-hrd"), event_type_enum=0, name_str=u"Regional Finalist", recipient_json_list=[ u'{"awardee": null, "team_number": 1216}', u'{"awardee": null, "team_number": 1000}', u'{"awardee": null, "team_number": 1447}', ], team_list=[ ndb.Key("Team", "frc1216", app="tbatv-prod-hrd"), ndb.Key("Team", "frc1000", app="tbatv-prod-hrd"), ndb.Key("Team", "frc1447", app="tbatv-prod-hrd"), ], updated=datetime.datetime(2013, 11, 23, 21, 17, 20, 943960), year=2004, ), Award( key=ndb.Key("Award", "2004dt_30", app="tbatv-prod-hrd"), award_type_enum=30, created=datetime.datetime(2013, 11, 23, 21, 17, 20, 947390), event=ndb.Key("Event", "2004dt", app="tbatv-prod-hrd"), event_type_enum=0, name_str=u"DaimlerChrysler Team Spirit Award", recipient_json_list=[ u'{"awardee": null, "team_number": 1000}' ], team_list=[ndb.Key("Team", "frc1000", app="tbatv-prod-hrd")], updated=datetime.datetime(2013, 11, 23, 21, 17, 20, 947380), year=2004, ), Award( key=ndb.Key("Award", "2007il_2", app="tbatv-prod-hrd"), award_type_enum=2, created=datetime.datetime(2013, 11, 23, 21, 14, 55, 727100), event=ndb.Key("Event", "2007il", app="tbatv-prod-hrd"), event_type_enum=0, name_str=u"Regional Finalist", recipient_json_list=[ u'{"awardee": null, "team_number": 1000}', u'{"awardee": null, "team_number": 648}', u'{"awardee": null, "team_number": 447}', ], team_list=[ ndb.Key("Team", "frc1000", app="tbatv-prod-hrd"), ndb.Key("Team", "frc648", app="tbatv-prod-hrd"), ndb.Key("Team", "frc447", app="tbatv-prod-hrd"), ], updated=datetime.datetime(2013, 11, 23, 21, 14, 55, 727100), year=2007, ), ] value = ImportFixingPickleProperty()._from_base_type( zlib.decompress(base64.b64decode(py3_b64))) self.assertEqual(value, expected_result)