def post(self): if self.request.get("verdict") == "accept": webcast = dict() webcast["type"] = self.request.get("webcast_type") webcast["channel"] = self.request.get("webcast_channel") if self.request.get("webcast_file"): webcast["file"] = self.request.get("webcast_file") event = Event.get_by_id(self.request.get("event_key")) suggestion = Suggestion.get_by_id( int(self.request.get("suggestion_key"))) EventWebcastAdder.add_webcast(event, webcast) MemcacheWebcastFlusher.flush() suggestion.review_state = Suggestion.REVIEW_ACCEPTED suggestion.reviewer = self.user_bundle.account.key suggestion.reviewer_at = datetime.datetime.now() suggestion.put() self.redirect( "/suggest/event/webcast/review?success=accept&event_key=%s" % event.key.id()) return elif self.request.get("verdict") == "reject": suggestion = Suggestion.get_by_id( int(self.request.get("suggestion_key"))) suggestion.review_state = Suggestion.REVIEW_REJECTED suggestion.reviewer = self.user_bundle.account.key suggestion.reviewer_at = datetime.datetime.now() suggestion.put() self.redirect("/suggest/event/webcast/review?success=reject") return elif self.request.get("verdict") == "reject_all": suggestion_keys = self.request.get("suggestion_keys").split(",") suggestions = [ Suggestion.get_by_id(int(suggestion_key)) for suggestion_key in suggestion_keys ] for suggestion in suggestions: event_key = suggestion.target_key suggestion.review_state = Suggestion.REVIEW_REJECTED suggestion.reviewer = self.user_bundle.account.key suggestion.reviewer_at = datetime.datetime.now() suggestion.put() self.redirect( "/suggest/event/webcast/review?success=reject_all&event_key=%s" % event_key) return self.redirect("/suggest/event/webcast/review")
def post(self): self._require_admin() if self.request.get("verdict") == "accept": webcast = dict() webcast["type"] = self.request.get("webcast_type") webcast["channel"] = self.request.get("webcast_channel") if self.request.get("webcast_file"): webcast["file"] = self.request.get("webcast_file") event = Event.get_by_id(self.request.get("event_key")) suggestion = Suggestion.get_by_id(int(self.request.get("suggestion_key"))) EventWebcastAdder.add_webcast(event, webcast) MemcacheWebcastFlusher.flush() suggestion.review_state = Suggestion.REVIEW_ACCEPTED suggestion.reviewer = self.user_bundle.account.key suggestion.reviewer_at = datetime.datetime.now() suggestion.put() self.redirect("/admin/suggestions/event/webcast/review?success=accept&event_key=%s" % event.key.id()) return elif self.request.get("verdict") == "reject": suggestion = Suggestion.get_by_id(int(self.request.get("suggestion_key"))) suggestion.review_state = Suggestion.REVIEW_REJECTED suggestion.reviewer = self.user_bundle.account.key suggestion.reviewer_at = datetime.datetime.now() suggestion.put() self.redirect("/admin/suggestions/event/webcast/review?success=reject") return elif self.request.get("verdict") == "reject_all": suggestion_keys = self.request.get("suggestion_keys").split(",") suggestions = [Suggestion.get_by_id(int(suggestion_key)) for suggestion_key in suggestion_keys] for suggestion in suggestions: event_key = suggestion.target_key suggestion.review_state = Suggestion.REVIEW_REJECTED suggestion.reviewer = self.user_bundle.account.key suggestion.reviewer_at = datetime.datetime.now() suggestion.put() self.redirect("/admin/suggestions/event/webcast/review?success=reject_all&event_key=%s" % event_key) return self.redirect("/admin/suggestions/event/webcast/review")
def testAcceptWithDifferentDetails(self): self.loginUser() self.givePermission() suggestion_id = self.createSuggestion() form = self.getSuggestionForm('review_{}'.format(suggestion_id)) form['webcast_type'] = 'youtube' form['webcast_channel'] = 'foobar' form['webcast_file'] = 'meow' response = form.submit('verdict', value='accept').follow() self.assertEqual(response.status_int, 200) request = response.request self.assertEqual(request.GET.get('success'), 'accept') # Make sure we mark the Suggestion as REVIEWED suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED) # Make sure the Event has no webcasts event = Event.get_by_id('2016necmp') self.assertIsNotNone(event.webcast) self.assertEqual(len(event.webcast), 1) webcast = event.webcast[0] self.assertEqual(webcast['type'], 'youtube') self.assertEqual(webcast['channel'], 'foobar') self.assertEqual(webcast['file'], 'meow')
def createMatchVideoInternetArchiveSuggestion(cls, author_account_key, archive_id, match_key): if archive_id: match = Match.get_by_id(match_key) if not match: return 'bad_match' if archive_id not in match.internet_archive_videos: year = match_key[:4] suggestion_id = Suggestion.render_media_key_name( year, 'match', match_key, 'internet_archive', archive_id) suggestion = Suggestion.get_by_id(suggestion_id) if not suggestion or suggestion.review_state != Suggestion.REVIEW_PENDING: suggestion = Suggestion( id=suggestion_id, author=author_account_key, target_key=match_key, target_model="match", ) suggestion.contents = { "internet_archive_videos": [archive_id] } suggestion.put() return 'success' else: return 'suggestion_exists' else: return 'video_exists' else: return 'bad_url'
def testAcceptWithDefaultDetails(self): self.loginUser() self.givePermission() suggestion_id = self.createSuggestion() form = self.getSuggestionForm('review_{}'.format(suggestion_id)) response = form.submit('verdict', value='accept').follow() self.assertEqual(response.status_int, 200) request = response.request self.assertEqual(request.GET.get('success'), 'accept') # Process task queue tasks = self.testbed.get_stub(testbed.TASKQUEUE_SERVICE_NAME).get_filtered_tasks() for task in tasks: deferred.run(task.payload) # Make sure we mark the Suggestion as REVIEWED suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED) # Make sure the Event has no webcasts event = Event.get_by_id('2016necmp') self.assertIsNotNone(event.webcast) self.assertEqual(len(event.webcast), 1) webcast = event.webcast[0] self.assertEqual(webcast['type'], 'twitch') self.assertEqual(webcast['channel'], 'frcgamesense')
def testAcceptNewKey(self): self.loginUser() self.givePermission() suggestion_id = self.createSuggestion() form = self.getSuggestionForm() form.set('accept_keys[]', suggestion_id) form.set('key-{}'.format(suggestion_id), '2016necmp_f1m2') response = form.submit().follow() self.assertEqual(response.status_int, 200) # Make sure we mark the Suggestion as REVIEWED suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED) # Make sure the video gets associated match = Match.get_by_id(self.match2.key_name) self.assertIsNotNone(match) self.assertIsNotNone(match.youtube_videos) self.assertTrue('H-54KMwMKY0' in match.youtube_videos) # Make sure we don't add it to the first match match = Match.get_by_id(self.match.key_name) self.assertIsNotNone(match) self.assertIsNotNone(match.youtube_videos) self.assertFalse('H-54KMwMKY0' in match.youtube_videos)
def test_create_suggestion_banned(self): event = Event(id="2016test", name="Test Event", event_short="Test Event", year=2016, event_type_enum=EventType.OFFSEASON) event.put() status = SuggestionCreator.createEventWebcastSuggestion( self.account_banned.key, "http://twitch.tv/frcgamesense", "", "2016test") self.assertEqual(status, 'success') # Ensure the Suggestion gets created expected_key = "webcast_2016test_twitch_frcgamesense_None" suggestion = Suggestion.get_by_id(expected_key) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.target_key, "2016test") self.assertEqual(suggestion.author, self.account_banned.key) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_AUTOREJECTED) self.assertIsNotNone(suggestion.contents) self.assertEqual(suggestion.contents.get('webcast_url'), "http://twitch.tv/frcgamesense") self.assertIsNotNone(suggestion.contents.get('webcast_dict'))
def createEventMediaSuggestion(cls, author_account_key, media_url, event_key, private_details_json=None): """Create an Event Media Suggestion. Returns status (success, suggestion_exists, media_exists, bad_url)""" media_dict = MediaParser.partial_media_dict_from_url(media_url) if media_dict is not None: if media_dict['media_type_enum'] != MediaType.YOUTUBE_VIDEO: return 'bad_url', None existing_media = Media.get_by_id(Media.render_key_name(media_dict['media_type_enum'], media_dict['foreign_key'])) if existing_media is None or event_key not in [reference.id() for reference in existing_media.references]: foreign_type = Media.SLUG_NAMES[media_dict['media_type_enum']] suggestion_id = Suggestion.render_media_key_name(event_key[:4], 'event', event_key, foreign_type, media_dict['foreign_key']) suggestion = Suggestion.get_by_id(suggestion_id) if not suggestion or suggestion.review_state != Suggestion.REVIEW_PENDING: media_dict['year'] = event_key[:4] media_dict['reference_type'] = 'event' media_dict['reference_key'] = event_key target_model = 'event_media' if private_details_json is not None: media_dict['private_details_json'] = private_details_json suggestion = Suggestion( id=suggestion_id, author=author_account_key, target_model=target_model, ) suggestion.contents = media_dict suggestion.put() return 'success', suggestion else: return 'suggestion_exists', None else: return 'media_exists', None else: return 'bad_url', None
def createTeamMediaSuggestion(cls, author_account_key, media_url, team_key, year_str): """Create a Team Media Suggestion. Returns status (success, exists, bad_url)""" media_dict = MediaParser.partial_media_dict_from_url(media_url) if media_dict is not None: existing_media = Media.get_by_id(Media.render_key_name(media_dict['media_type_enum'], media_dict['foreign_key'])) if existing_media is None or team_key not in [reference.id() for reference in existing_media.references]: foreign_type = Media.SLUG_NAMES[media_dict['media_type_enum']] suggestion_id = Suggestion.render_key_name(year_str, 'team', team_key, foreign_type, media_dict['foreign_key']) suggestion = Suggestion.get_by_id(suggestion_id) if not suggestion or suggestion.review_state != Suggestion.REVIEW_PENDING: media_dict['year'] = int(year_str) media_dict['reference_type'] = 'team' media_dict['reference_key'] = team_key suggestion = Suggestion( id=suggestion_id, author=author_account_key, target_model="media", ) suggestion.contents = media_dict suggestion.put() return 'success' else: return 'suggestion_exists' else: return 'media_exists' else: return 'bad_url'
def createMatchVideoYouTubeSuggestion(cls, author_account_key, youtube_id, match_key): """Create a YouTube Match Video. Returns status (success, suggestion_exists, video_exists, bad_url)""" if youtube_id: match = Match.get_by_id(match_key) if not match: return 'bad_match' if youtube_id not in match.youtube_videos: year = match_key[:4] suggestion_id = Suggestion.render_media_key_name(year, 'match', match_key, 'youtube', youtube_id) suggestion = Suggestion.get_by_id(suggestion_id) if not suggestion or suggestion.review_state != Suggestion.REVIEW_PENDING: suggestion = Suggestion( id=suggestion_id, author=author_account_key, target_key=match_key, target_model="match", ) suggestion.contents = {"youtube_videos": [youtube_id]} suggestion.put() return 'success' else: return 'suggestion_exists' else: return 'video_exists' else: return 'bad_url'
def post(self): self.verify_permissions() suggestion_id = int(self.request.get("suggestion_id")) verdict = self.request.get("verdict") message = self.request.get("user_message") admin_email_body = None email_body = None user = None event_key = None status = '' if verdict == "accept": status = 'accept' auth_id, user, event_key, email_body = self._process_accepted(suggestion_id, message) admin_email_body = """{} ({}) has accepted the request with the following message: {} View the key: https://www.thebluealliance.com/admin/api_auth/edit/{} """.format(self.user_bundle.account.display_name, self.user_bundle.account.email, message, auth_id) elif verdict == "reject": suggestion = Suggestion.get_by_id(suggestion_id) event_key = suggestion.contents['event_key'] user = suggestion.author.get() event = Event.get_by_id(event_key) suggestion.review_state = Suggestion.REVIEW_REJECTED suggestion.reviewer = self.user_bundle.account.key suggestion.reviewed_at = datetime.now() suggestion.put() status = 'reject' email_body = """Hi {}, We have reviewer your request for auth tokens for {} {} and have regretfully declined with the following message: {} If you have any questions, please don't hesitate to reach out to us at [email protected] Thanks, TBA Admins """.format(user.display_name, event.year, event.name, message) admin_email_body = """{} ({}) has rejected this request with the following reason: {} """.format(self.user_bundle.account.display_name, self.user_bundle.account.email, message) # Notify the user their keys are available if email_body: mail.send_mail(sender="The Blue Alliance Contact <*****@*****.**>", to=user.email, subject="The Blue Alliance Auth Tokens for {}".format(event_key), body=email_body) if admin_email_body: # Subject should match the one in suggest_apiwrite_controller subject = "Trusted API Key Request for {}".format(event_key) SuggestionNotifier.send_admin_alert_email(subject, admin_email_body) self.redirect("/suggest/apiwrite/review?success={}".format(status))
def test_accept_with_different_details(self): self.loginUser() self.givePermission() suggestion_id = self.createSuggestion() form = self.getSuggestionForm('review_{}'.format(suggestion_id)) form['webcast_type'] = 'youtube' form['webcast_channel'] = 'foobar' form['webcast_file'] = 'meow' response = form.submit('verdict', value='accept').follow() self.assertEqual(response.status_int, 200) request = response.request self.assertEqual(request.GET.get('success'), 'accept') # Process task queue tasks = self.testbed.get_stub(testbed.TASKQUEUE_SERVICE_NAME).get_filtered_tasks() for task in tasks: deferred.run(task.payload) # Make sure we mark the Suggestion as REVIEWED suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED) # Make sure the Event has no webcasts event = Event.get_by_id('2016necmp') self.assertIsNotNone(event.webcast) self.assertEqual(len(event.webcast), 1) webcast = event.webcast[0] self.assertEqual(webcast['type'], 'youtube') self.assertEqual(webcast['channel'], 'foobar') self.assertEqual(webcast['file'], 'meow')
def createMatchVideoYouTubeSuggestion(cls, author_account_key, youtube_id, match_key): """Create a YouTube Match Video. Returns status (success, suggestion_exists, video_exists, bad_url)""" if youtube_id: match = Match.get_by_id(match_key) if not match: return 'bad_match' if youtube_id not in match.youtube_videos: year = match_key[:4] suggestion_id = Suggestion.render_media_key_name( year, 'match', match_key, 'youtube', youtube_id) suggestion = Suggestion.get_by_id(suggestion_id) if not suggestion or suggestion.review_state != Suggestion.REVIEW_PENDING: suggestion = Suggestion( id=suggestion_id, author=author_account_key, target_key=match_key, target_model="match", ) suggestion.contents = {"youtube_videos": [youtube_id]} suggestion.put() return 'success' else: return 'suggestion_exists' else: return 'video_exists' else: return 'bad_url'
def test_accept_new_key(self): self.loginUser() self.givePermission() suggestion_id = self.createSuggestion() form = self.getSuggestionForm() form.set('accept_keys[]', suggestion_id) form.set('key-{}'.format(suggestion_id), '2016necmp_f1m2') response = form.submit().follow() self.assertEqual(response.status_int, 200) # Make sure we mark the Suggestion as REVIEWED suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED) # Make sure the video gets associated match = Match.get_by_id(self.match2.key_name) self.assertIsNotNone(match) self.assertIsNotNone(match.youtube_videos) self.assertTrue('H-54KMwMKY0' in match.youtube_videos) # Make sure we don't add it to the first match match = Match.get_by_id(self.match.key_name) self.assertIsNotNone(match) self.assertIsNotNone(match.youtube_videos) self.assertFalse('H-54KMwMKY0' in match.youtube_videos)
def createTeamMediaSuggestion(cls, author_account_key, media_url, team_key, year_str, private_details_json=None, is_social=False): """Create a Team Media Suggestion. Returns status (success, suggestion_exists, media_exists, bad_url)""" media_dict = MediaParser.partial_media_dict_from_url(media_url) if media_dict is not None: if media_dict.get("is_social", False) != is_social: return 'bad_url', None existing_media = Media.get_by_id( Media.render_key_name(media_dict['media_type_enum'], media_dict['foreign_key'])) if existing_media is None or team_key not in [ reference.id() for reference in existing_media.references ]: foreign_type = Media.SLUG_NAMES[media_dict['media_type_enum']] suggestion_id = Suggestion.render_media_key_name( year_str, 'team', team_key, foreign_type, media_dict['foreign_key']) suggestion = Suggestion.get_by_id(suggestion_id) if not suggestion or suggestion.review_state != Suggestion.REVIEW_PENDING: media_dict['year'] = int(year_str) if year_str else None media_dict['reference_type'] = 'team' media_dict['reference_key'] = team_key if private_details_json is not None: media_dict[ 'private_details_json'] = private_details_json target_model = "media" if media_dict.get("is_social", False): target_model = "social-media" if media_dict.get('media_type', '') in MediaType.robot_types: target_model = "robot" if Event.validate_key_name(team_key): target_model = 'event_media' media_dict['reference_type'] = 'event' suggestion = Suggestion( id=suggestion_id, author=author_account_key, target_model=target_model, ) suggestion.contents = media_dict suggestion.put() return 'success', suggestion else: return 'suggestion_exists', None else: return 'media_exists', None else: return 'bad_url', None
def post(self): self.verify_permissions() suggestion_id = int(self.request.get("suggestion_id")) verdict = self.request.get("verdict") message = self.request.get("user_message") admin_email_body = None email_body = None user = None event_key = None status = '' if verdict == "accept": status = 'accept' auth_id, user, event_key, email_body = self._process_accepted(suggestion_id) admin_email_body = """{} ({}) has accepted the request with the following message: {} View the key: https://www.thebluealliance.com/admin/api_auth/edit/{} """.format(self.user_bundle.account.display_name, self.user_bundle.account.email, message, auth_id) elif verdict == "reject": suggestion = Suggestion.get_by_id(suggestion_id) event_key = suggestion.contents['event_key'] user = suggestion.author.get() event = Event.get_by_id(event_key) self._process_rejected(suggestion.key.id()) status = 'reject' email_body = """Hi {}, We have reviewer your request for auth tokens for {} {} and have regretfully declined with the following message: {} If you have any questions, please don't hesitate to reach out to us at [email protected] Thanks, TBA Admins """.format(user.display_name, event.year, event.name, message) admin_email_body = """{} ({}) has rejected this request with the following reason: {} """.format(self.user_bundle.account.display_name, self.user_bundle.account.email, message) # Notify the user their keys are available if email_body: mail.send_mail(sender="The Blue Alliance Contact <*****@*****.**>", to=user.email, subject="The Blue Alliance Auth Tokens for {}".format(event_key), body=email_body) if admin_email_body: # Subject should match the one in suggest_apiwrite_controller subject = "Trusted API Key Request for {}".format(event_key) OutgoingNotificationHelper.send_admin_alert_email(subject, admin_email_body) self.redirect("/suggest/apiwrite/review?success={}".format(status))
def testSuggestMedia(self): self.loginUser() self.storeEvent() form = self.getSuggestionForm('2016nyny') form['media_url'] = 'https://www.youtube.com/watch?v=H-54KMwMKY0' response = form.submit().follow() self.assertEqual(response.status_int, 200) request = response.request self.assertEqual(request.GET.get('status'), 'success') suggestion = Suggestion.get_by_id('media_2016_event_2016nyny_youtube_H-54KMwMKY0') self.assertIsNotNone(suggestion)
def test_suggest_team(self): self.loginUser() self.storeTeam() form = self.getSuggestionForm('frc1124') form['media_url'] = 'https://github.com/frc1124' response = form.submit().follow() self.assertEqual(response.status_int, 200) request = response.request self.assertEqual(request.GET.get('status'), 'success') suggestion = Suggestion.get_by_id('media_None_team_frc1124_github-profile_frc1124') self.assertIsNotNone(suggestion)
def test_suggest_media(self): self.loginUser() self.storeTeam() form = self.getSuggestionForm('frc1124', 2016) form['media_url'] = 'http://imgur.com/aF8T5ZE' response = form.submit().follow() self.assertEqual(response.status_int, 200) request = response.request self.assertEqual(request.GET.get('status'), 'success') suggestion = Suggestion.get_by_id('media_2016_team_frc1124_imgur_aF8T5ZE') self.assertIsNotNone(suggestion)
def testCleanUrl(self): status, _ = SuggestionCreator.createTeamMediaSuggestion( self.account.key, " http://imgur.com/ruRAxDm?foo=bar#meow ", "frc1124", "2016") self.assertEqual(status, 'success') # Ensure the Suggestion gets created suggestion_id = Suggestion.render_media_key_name( '2016', 'team', 'frc1124', 'imgur', 'ruRAxDm') suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING) self.assertEqual(suggestion.author, self.account.key) self.assertEqual(suggestion.target_model, 'media')
def test_suggest_team(self): self.loginUser() self.storeTeam() form = self.getSuggestionForm('frc1124') form['media_url'] = 'https://github.com/frc1124' response = form.submit().follow() self.assertEqual(response.status_int, 200) request = response.request self.assertEqual(request.GET.get('status'), 'success') suggestion = Suggestion.get_by_id( 'media_None_team_frc1124_github-profile_frc1124') self.assertIsNotNone(suggestion)
def test_suggest_media(self): self.loginUser() self.storeTeam() form = self.getSuggestionForm('frc1124', 2016) form['media_url'] = 'http://imgur.com/aF8T5ZE' response = form.submit().follow() self.assertEqual(response.status_int, 200) request = response.request self.assertEqual(request.GET.get('status'), 'success') suggestion = Suggestion.get_by_id( 'media_2016_team_frc1124_imgur_aF8T5ZE') self.assertIsNotNone(suggestion)
def test_submit_one_video(self): self.loginUser() response = self.testapp.post('/suggest/event/video?event_key=2016necmp', { 'num_videos': 1, 'video_id_0': '37F5tbrFqJQ', 'match_partial_0': 'f1m1' }).follow() self.assertEqual(response.status_int, 200) request = response.request self.assertEqual(request.GET.get('num_added'), '1') suggestion_id = "media_2016_match_2016necmp_f1m1_youtube_37F5tbrFqJQ" suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion)
def test_create_suggestion(self): status = SuggestionCreator.createMatchVideoYouTubeSuggestion(self.account.key, "37F5tbrFqJQ", "2016test_f1m1") self.assertEqual(status, 'success') suggestion_id = "media_2016_match_2016test_f1m1_youtube_37F5tbrFqJQ" suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.author, self.account.key) self.assertEqual(suggestion.target_key, '2016test_f1m1') self.assertEqual(suggestion.target_model, 'match') self.assertIsNotNone(suggestion.contents) self.assertIsNotNone(suggestion.contents.get('youtube_videos')) self.assertEqual(len(suggestion.contents.get('youtube_videos')), 1) self.assertEqual(suggestion.contents.get('youtube_videos')[0], "37F5tbrFqJQ")
def testRejectSuggestion(self): self.loginUser() self.givePermission() suggestion_id = self.createSuggestion() form = self.getSuggestionForm(suggestion_id) response = form.submit('verdict', value='reject').follow() self.assertEqual(response.status_int, 200) auths = ApiAuthAccess.query().fetch() self.assertEqual(len(auths), 0) # Make sure we mark the Suggestion as REJECTED suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED)
def test_fast_path_already_reviewed(self): self.loginUser() self.givePermission() suggestion_id = self.createSuggestion() suggestion = Suggestion.get_by_id(suggestion_id) suggestion.review_state = Suggestion.REVIEW_ACCEPTED suggestion.put() response = self.testapp.get( '/suggest/cad/review?action=accept&id={}'.format(suggestion_id)) response = response.follow() self.assertEqual(response.status_int, 200) self.assertEqual(response.request.GET.get('status'), 'already_reviewed')
def testCreateSuggestion(self): status = SuggestionCreator.createMatchVideoYouTubeSuggestion(self.account.key, "37F5tbrFqJQ", "2016test_f1m1") self.assertEqual(status, 'success') suggestion_id = "media_2016_match_2016test_f1m1_youtube_37F5tbrFqJQ" suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.author, self.account.key) self.assertEqual(suggestion.target_key, '2016test_f1m1') self.assertEqual(suggestion.target_model, 'match') self.assertIsNotNone(suggestion.contents) self.assertIsNotNone(suggestion.contents.get('youtube_videos')) self.assertEqual(len(suggestion.contents.get('youtube_videos')), 1) self.assertEqual(suggestion.contents.get('youtube_videos')[0], "37F5tbrFqJQ")
def test_reject_suggestion(self): self.loginUser() self.givePermission() suggestion_id = self.createSuggestion() form = self.getSuggestionForm() form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(suggestion_id) response = form.submit().follow() self.assertEqual(response.status_int, 200) suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED) medias = Media.query().fetch() self.assertEqual(len(medias), 0)
def testCleanUrl(self): status = SuggestionCreator.createTeamMediaSuggestion( self.account.key, " http://imgur.com/ruRAxDm?foo=bar#meow ", "frc1124", "2016") self.assertEqual(status, 'success') # Ensure the Suggestion gets created suggestion_id = Suggestion.render_media_key_name('2016', 'team', 'frc1124', 'imgur', 'ruRAxDm') suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING) self.assertEqual(suggestion.author, self.account.key) self.assertEqual(suggestion.target_model, 'media')
def post(self): self.verify_permissions() suggestion = Suggestion.get_by_id(int(self.request.get("suggestion_id"))) verdict = self.request.get("verdict") if verdict == "accept": start_date = None if self.request.get("start_date"): start_date = datetime.strptime(self.request.get("start_date"), "%Y-%m-%d") end_date = None if self.request.get("end_date"): end_date = datetime.strptime(self.request.get("end_date"), "%Y-%m-%d") event = Event( id=str(self.request.get("year")) + str.lower(str(self.request.get("event_short"))), end_date=end_date, event_short=self.request.get("event_short"), event_type_enum=EventType.OFFSEASON, event_district_enum=DistrictType.NO_DISTRICT, venue=self.request.get("venue"), venue_address=self.request.get("venue_address"), location=self.request.get("location"), name=self.request.get("name"), short_name=self.request.get("short_name"), start_date=start_date, website=self.request.get("website"), year=int(self.request.get("year")), official=False, ) EventManipulator.createOrUpdate(event) suggestion.review_state = Suggestion.REVIEW_ACCEPTED suggestion.reviewer = self.user_bundle.account.key suggestion.reviewed_at = datetime.now() suggestion.put() self.redirect("/suggest/offseason/review?success=accept&event_key=%s" % event.key.id()) return elif verdict == "reject": suggestion.review_state = Suggestion.REVIEW_REJECTED suggestion.reviewer = self.user_bundle.account.key suggestion.reviewed_at = datetime.now() suggestion.put() self.redirect("/suggest/offseason/review?success=reject") return self.redirect("/suggest/offseason/review")
def testCleanupUrlWithoutScheme(self): event = Event(id="2016test", name="Test Event", event_short="Test Event", year=2016, event_type_enum=EventType.OFFSEASON) event.put() status = SuggestionCreator.createEventWebcastSuggestion( self.account.key, "twitch.tv/frcgamesense", "2016test") self.assertEqual(status, 'success') expected_key = "webcast_2016test_twitch_frcgamesense_None" suggestion = Suggestion.get_by_id(expected_key) self.assertIsNotNone(suggestion) self.assertIsNotNone(suggestion.contents) self.assertIsNotNone(suggestion.contents.get('webcast_dict')) self.assertEqual(suggestion.contents.get('webcast_url'), "http://twitch.tv/frcgamesense")
def testAcceptSuggestion(self): self.loginUser() self.givePermission() suggestion_id = self.createSuggestion() form = self.getSuggestionForm(suggestion_id) form['event_short'] = 'test' response = form.submit('verdict', value='accept').follow() self.assertEqual(response.status_int, 200) suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED) event = Event.get_by_id('2016test') self.assertIsNotNone(event)
def test_reject_suggestion(self): self.loginUser() self.givePermission() suggestion_id = self.createSuggestion() form = self.getSuggestionForm() form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format( suggestion_id) response = form.submit().follow() self.assertEqual(response.status_int, 200) suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED) medias = Media.query().fetch() self.assertEqual(len(medias), 0)
def test_create_suggestion_banned(self): status, _ = SuggestionCreator.createEventMediaSuggestion( self.account_banned.key, "https://www.youtube.com/watch?v=H-54KMwMKY0", "2016nyny") self.assertEqual(status, 'success') # Ensure the Suggestion gets created suggestion_id = Suggestion.render_media_key_name('2016', 'event', '2016nyny', 'youtube', 'H-54KMwMKY0') suggestion = Suggestion.get_by_id(suggestion_id) expected_dict = MediaParser.partial_media_dict_from_url("https://www.youtube.com/watch?v=H-54KMwMKY0") self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_AUTOREJECTED) self.assertEqual(suggestion.author, self.account_banned.key) self.assertEqual(suggestion.target_model, 'event_media') self.assertDictContainsSubset(expected_dict, suggestion.contents)
def testCreateSuggestion(self): status, _ = SuggestionCreator.createTeamMediaSuggestion( self.account.key, "http://imgur.com/ruRAxDm", "frc1124", "2016") self.assertEqual(status, 'success') # Ensure the Suggestion gets created suggestion_id = Suggestion.render_media_key_name( '2016', 'team', 'frc1124', 'imgur', 'ruRAxDm') suggestion = Suggestion.get_by_id(suggestion_id) expected_dict = MediaParser.partial_media_dict_from_url( "http://imgur.com/ruRAxDm") self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING) self.assertEqual(suggestion.author, self.account.key) self.assertEqual(suggestion.target_model, 'media') self.assertDictContainsSubset(expected_dict, suggestion.contents)
def test_submit_one_video(self): self.loginUser() response = self.testapp.post( '/suggest/event/video?event_key=2016necmp', { 'num_videos': 1, 'video_id_0': '37F5tbrFqJQ', 'match_partial_0': 'f1m1' }).follow() self.assertEqual(response.status_int, 200) request = response.request self.assertEqual(request.GET.get('num_added'), '1') suggestion_id = "media_2016_match_2016necmp_f1m1_youtube_37F5tbrFqJQ" suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion)
def test_submit_match_video(self): self.loginUser() form = self.getSuggestionForm('2016necmp_f1m1') form['youtube_url'] = "http://youtu.be/bHGyTjxbLz8" response = form.submit().follow() self.assertEqual(response.status_int, 200) # Make sure the Suggestion gets created suggestion_id = "media_2016_match_2016necmp_f1m1_youtube_bHGyTjxbLz8" suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING) # Ensure we show a success message on the page request = response.request self.assertEqual(request.GET.get('status'), 'success')
def post(self): self.verify_permissions() suggestion_id = int(self.request.get("suggestion_id")) verdict = self.request.get("verdict") message = self.request.get("user_message") email_body = None user = None event_key = None status = '' if verdict == "accept": status = 'accept' user, event_key, email_body = self._process_accepted(suggestion_id, message) elif verdict == "reject": suggestion = Suggestion.get_by_id(suggestion_id) event_key = suggestion.contents['event_key'] user = suggestion.author.get() event = Event.get_by_id(event_key) suggestion.review_state = Suggestion.REVIEW_REJECTED suggestion.reviewer = self.user_bundle.account.key suggestion.reviewed_at = datetime.now() suggestion.put() status = 'reject' email_body = """Hi {}, We have reviewer your request for auth tokens for {} {} and have regretfully declined with the following message: {} If you have any questions, please don't heasitate to reach out to us at [email protected] Thanks, TBA Admins """.format(user.display_name, event.year, event.name, message) # Notify the user their keys are available sender = "{}@appspot.gserviceaccount.com".format(app_identity.get_application_id()) reply_to = sender if tba_config.DEBUG else "*****@*****.**" if email_body: mail.send_mail(sender=sender, reply_to=reply_to, to=user.email, subject="The Blue Alliance Auth Tokens for {}".format(event_key), body=email_body) self.redirect("/suggest/apiwrite/review?success={}".format(status))
def createTeamMediaSuggestion(cls, author_account_key, media_url, team_key, year_str, private_details_json=None, is_social=False, default_preferred=False): """Create a Team Media Suggestion. Returns status (success, suggestion_exists, media_exists, bad_url)""" media_dict = MediaParser.partial_media_dict_from_url(media_url) if media_dict is not None: if media_dict.get("is_social", False) != is_social: return 'bad_url', None existing_media = Media.get_by_id(Media.render_key_name(media_dict['media_type_enum'], media_dict['foreign_key'])) if existing_media is None or team_key not in [reference.id() for reference in existing_media.references]: foreign_type = Media.SLUG_NAMES[media_dict['media_type_enum']] suggestion_id = Suggestion.render_media_key_name(year_str, 'team', team_key, foreign_type, media_dict['foreign_key']) suggestion = Suggestion.get_by_id(suggestion_id) if not suggestion or suggestion.review_state != Suggestion.REVIEW_PENDING: media_dict['year'] = int(year_str) if year_str else None media_dict['reference_type'] = 'team' media_dict['reference_key'] = team_key media_dict['default_preferred'] = default_preferred if private_details_json is not None: media_dict['private_details_json'] = private_details_json target_model = "media" if media_dict.get("is_social", False): target_model = "social-media" if media_dict.get('media_type', '') in MediaType.robot_types: target_model = "robot" if Event.validate_key_name(team_key): target_model = 'event_media' media_dict['reference_type'] = 'event' suggestion = Suggestion( id=suggestion_id, author=author_account_key, target_model=target_model, target_key=team_key, ) suggestion.contents = media_dict suggestion.put() return 'success', suggestion else: return 'suggestion_exists', None else: return 'media_exists', None else: return 'bad_url', None
def _process_accepted(self, suggestion_id, message): suggestion = Suggestion.get_by_id(suggestion_id) event_key = suggestion.contents['event_key'] user = suggestion.author.get() event = Event.get_by_id(event_key) auth_id = ''.join( random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for _ in range(16)) auth_types = self.request.get_all("auth_types", []) expiration_offset = int(self.request.get("expiration_days")) if expiration_offset != -1: expiration_event_end = event.end_date + timedelta( days=expiration_offset + 1) expiration_now = datetime.now() + timedelta(days=expiration_offset) expiration = max(expiration_event_end, expiration_now) else: expiration = None auth = ApiAuthAccess( id=auth_id, description="{} @ {}".format(user.display_name, suggestion.contents['event_key']), secret=''.join( random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for _ in range(64)), event_list=[ndb.Key(Event, event_key)], auth_types_enum=[int(type) for type in auth_types], owner=suggestion.author, expiration=expiration) auth.put() suggestion.review_state = Suggestion.REVIEW_ACCEPTED suggestion.reviewer = self.user_bundle.account.key suggestion.reviewed_at = datetime.now() suggestion.put() return auth_id, user, event_key, """Hi {}, We graciously accept your request for auth tokens so you can add data to the following event: {} {} You can find the keys on your account overview page: https://www.thebluealliance.com/account {} If you have any questions, please don't heasitate to reach out to us at [email protected] Thanks, TBA Admins """.format(user.display_name, event.year, event.name, message)
def test_remove_media_reference(self): self.loginUser() self.giveTeamAdminAccess() team_reference = Media.create_reference('team', 'frc1124') suggestion_id = self.createMediaSuggestion() suggestion = Suggestion.get_by_id(suggestion_id) media = MediaCreator.create_media_model(suggestion, team_reference) media_id = media.put() self.assertTrue(ndb.Key(Team, 'frc1124') in media.references) form = self.getMediaAdminForm('remove_media', media_id.id()) response = form.submit().follow() self.assertEqual(response.status_int, 301) media = media_id.get() self.assertFalse(team_reference in media.references)
def testCreateSuggestionWithUrlParams(self): status, _ = SuggestionCreator.createTeamMediaSuggestion( self.account.key, "https://www.youtube.com/watch?v=VP992UKFbko", "frc1124", "2016") self.assertEqual(status, 'success') # Ensure the Suggestion gets created suggestion_id = Suggestion.render_media_key_name( '2016', 'team', 'frc1124', 'youtube', 'VP992UKFbko') suggestion = Suggestion.get_by_id(suggestion_id) expected_dict = MediaParser.partial_media_dict_from_url( "https://www.youtube.com/watch?v=VP992UKFbko") self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING) self.assertEqual(suggestion.author, self.account.key) self.assertEqual(suggestion.target_model, 'media') self.assertDictContainsSubset(expected_dict, suggestion.contents)
def testCreateSuggestion(self): status = SuggestionCreator.createTeamMediaSuggestion( self.account.key, "http://imgur.com/ruRAxDm", "frc1124", "2016") self.assertEqual(status, 'success') # Ensure the Suggestion gets created suggestion_id = Suggestion.render_media_key_name('2016', 'team', 'frc1124', 'imgur', 'ruRAxDm') suggestion = Suggestion.get_by_id(suggestion_id) expected_dict = MediaParser.partial_media_dict_from_url("http://imgur.com/ruRAxDm") self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING) self.assertEqual(suggestion.author, self.account.key) self.assertEqual(suggestion.target_model, 'media') self.assertDictContainsSubset(expected_dict, suggestion.contents)
def test_reject_robot_design_expired_auth(self): self.loginUser() access_key = self.giveTeamAdminAccess() suggestion_id = self.createDesignSuggestion() form = self.getSuggestionForm('robot') form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format( suggestion_id) access = access_key.get() access.expiration += datetime.timedelta(days=-7) access.put() response = form.submit().follow(expect_errors=True) self.assertEqual(response.request.path, "/") suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)
def testCreateSuggestionWithUrlParams(self): status = SuggestionCreator.createTeamMediaSuggestion( self.account.key, "https://www.youtube.com/watch?v=VP992UKFbko", "frc1124", "2016") self.assertEqual(status, 'success') # Ensure the Suggestion gets created suggestion_id = Suggestion.render_media_key_name('2016', 'team', 'frc1124', 'youtube', 'VP992UKFbko') suggestion = Suggestion.get_by_id(suggestion_id) expected_dict = MediaParser.partial_media_dict_from_url("https://www.youtube.com/watch?v=VP992UKFbko") self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING) self.assertEqual(suggestion.author, self.account.key) self.assertEqual(suggestion.target_model, 'media') self.assertDictContainsSubset(expected_dict, suggestion.contents)
def _process_accepted(self, suggestion_id, message): suggestion = Suggestion.get_by_id(suggestion_id) event_key = suggestion.contents['event_key'] user = suggestion.author.get() event = Event.get_by_id(event_key) auth_id = ''.join( random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for _ in range(16)) auth_types = self.request.get_all("auth_types", []) expiration_offset = int(self.request.get("expiration_days")) if expiration_offset != -1: expiration_event_end = event.end_date + timedelta(days=expiration_offset + 1) expiration_now = datetime.now() + timedelta(days=expiration_offset) expiration = max(expiration_event_end, expiration_now) else: expiration = None auth = ApiAuthAccess( id=auth_id, description="{} @ {}".format(user.display_name, suggestion.contents['event_key']), secret=''.join( random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for _ in range(64)), event_list=[ndb.Key(Event, event_key)], auth_types_enum=[int(type) for type in auth_types], owner=suggestion.author, expiration=expiration ) auth.put() suggestion.review_state = Suggestion.REVIEW_ACCEPTED suggestion.reviewer = self.user_bundle.account.key suggestion.reviewed_at = datetime.now() suggestion.put() return auth_id, user, event_key, """Hi {}, We graciously accept your request for auth tokens so you can add data to the following event: {} {} You can find the keys on your account overview page: https://www.thebluealliance.com/account {} If you have any questions, please don't heasitate to reach out to us at [email protected] Thanks, TBA Admins """.format(user.display_name, event.year, event.name, message)
def test_fast_path_reject(self): self.loginUser() self.givePermission() suggestion_id = self.createSuggestion() response = self.testapp.get( '/suggest/cad/review?action=reject&id={}'.format(suggestion_id)) response = response.follow() self.assertEqual(response.status_int, 200) self.assertEqual(response.request.GET.get('status'), 'rejected') medias = Media.query().fetch(keys_only=True) self.assertEqual(len(medias), 0) suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED)
def test_manage_media_expired_auth(self): self.loginUser() access_key = self.giveTeamAdminAccess() team_reference = Media.create_reference('team', 'frc1124') suggestion_id = self.createSocialMediaSuggestion() suggestion = Suggestion.get_by_id(suggestion_id) media = MediaCreator.create_media_model(suggestion, team_reference) media_id = media.put() self.assertTrue(ndb.Key(Team, 'frc1124') in media.references) form = self.getMediaAdminForm('remove_media', media_id.id()) access = access_key.get() access.expiration += datetime.timedelta(days=-7) access.put() response = form.submit(status='403', expect_errors=True) self.assertEqual(response.status_int, 403)
def testRejectSuggestion(self): self.loginUser() self.givePermission() suggestion_id = self.createSuggestion() form = self.getSuggestionForm() form.set('reject_keys[]', suggestion_id) response = form.submit().follow() self.assertEqual(response.status_int, 200) # Make sure we mark the Suggestion as REVIEWED suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED) # Make sure the video gets associated match = Match.get_by_id(self.match.key_name) self.assertIsNotNone(match) self.assertFalse(match.youtube_videos)
def test_reject_robot_design(self): self.loginUser() self.giveTeamAdminAccess() suggestion_id = self.createDesignSuggestion() form = self.getSuggestionForm('robot') form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format( suggestion_id) response = form.submit().follow() self.assertEqual(response.status_int, 200) # Make sure the Media object doesn't get created medias = Media.query().fetch(keys_only=True) self.assertEqual(len(medias), 0) # Make sure we mark the Suggestion as REVIEWED suggestion = Suggestion.get_by_id(suggestion_id) self.assertIsNotNone(suggestion) self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED)