def test_inviting_playtester_to_exploration(self): exp = exp_domain.Exploration.create_default_exploration(self.EXP_ID) exp_services.save_new_exploration(self.user_id_a, exp) exp_rights = rights_manager.get_exploration_rights(self.EXP_ID) self.assertFalse(rights_manager.check_can_access_activity( self.user_b, exp_rights)) self.assertFalse(rights_manager.check_can_edit_activity( self.user_b, exp_rights)) self.assertFalse(rights_manager.check_can_voiceover_activity( self.user_b, exp_rights)) self.assertFalse(rights_manager.check_can_delete_activity( self.user_b, exp_rights)) rights_manager.assign_role_for_exploration( self.user_a, self.EXP_ID, self.user_id_b, rights_manager.ROLE_VIEWER) exp_rights = rights_manager.get_exploration_rights(self.EXP_ID) self.assertTrue(rights_manager.check_can_access_activity( self.user_b, exp_rights)) self.assertFalse(rights_manager.check_can_edit_activity( self.user_b, exp_rights)) self.assertFalse(rights_manager.check_can_voiceover_activity( self.user_b, exp_rights)) self.assertFalse(rights_manager.check_can_delete_activity( self.user_b, exp_rights))
def test_non_splash_page_demo_exploration(self): # Note: there is no difference between permissions for demo # explorations, whether or not they are on the splash page. exp_services.load_demo('3') rights_manager.release_ownership_of_exploration( self.system_user, '3') exp_rights = rights_manager.get_exploration_rights('3') self.assertTrue(rights_manager.check_can_access_activity( self.user_a, exp_rights)) self.assertTrue(rights_manager.check_can_edit_activity( self.user_a, exp_rights)) self.assertTrue(rights_manager.check_can_voiceover_activity( self.user_a, exp_rights)) self.assertFalse(rights_manager.check_can_delete_activity( self.user_a, exp_rights)) self.assertTrue(rights_manager.check_can_access_activity( self.user_admin, exp_rights)) self.assertTrue(rights_manager.check_can_edit_activity( self.user_admin, exp_rights)) self.assertTrue(rights_manager.check_can_voiceover_activity( self.user_admin, exp_rights)) self.assertTrue(rights_manager.check_can_delete_activity( self.user_admin, exp_rights)) self.assertTrue(rights_manager.check_can_access_activity( self.user_moderator, exp_rights)) self.assertTrue(rights_manager.check_can_edit_activity( self.user_moderator, exp_rights)) self.assertTrue(rights_manager.check_can_voiceover_activity( self.user_moderator, exp_rights)) self.assertTrue(rights_manager.check_can_delete_activity( self.user_moderator, exp_rights))
def test_demo_exploration(self): exp_services.load_demo('1') rights_manager.release_ownership_of_exploration( self.system_user, '1') exp_rights = rights_manager.get_exploration_rights('1') self.assertTrue(rights_manager.check_can_access_activity( self.user_a, exp_rights)) self.assertTrue(rights_manager.check_can_edit_activity( self.user_a, exp_rights)) self.assertTrue(rights_manager.check_can_voiceover_activity( self.user_a, exp_rights)) self.assertFalse(rights_manager.check_can_delete_activity( self.user_a, exp_rights)) self.assertTrue(rights_manager.check_can_access_activity( self.user_admin, exp_rights)) self.assertTrue(rights_manager.check_can_edit_activity( self.user_admin, exp_rights)) self.assertTrue(rights_manager.check_can_voiceover_activity( self.user_admin, exp_rights)) self.assertTrue(rights_manager.check_can_delete_activity( self.user_admin, exp_rights)) self.assertTrue(rights_manager.check_can_access_activity( self.user_moderator, exp_rights)) self.assertTrue(rights_manager.check_can_edit_activity( self.user_moderator, exp_rights)) self.assertTrue(rights_manager.check_can_voiceover_activity( self.user_moderator, exp_rights)) self.assertTrue(rights_manager.check_can_delete_activity( self.user_moderator, exp_rights))
def test_newly_created_exploration(self): exp = exp_domain.Exploration.create_default_exploration(self.EXP_ID) exp_services.save_new_exploration(self.user_id_a, exp) exp_rights = rights_manager.get_exploration_rights(self.EXP_ID) self.assertTrue( rights_manager.check_can_access_activity(self.user_a, exp_rights)) self.assertTrue( rights_manager.check_can_edit_activity(self.user_a, exp_rights)) self.assertTrue( rights_manager.check_can_voiceover_activity( self.user_a, exp_rights)) self.assertTrue( rights_manager.check_can_delete_activity(self.user_a, exp_rights)) self.assertTrue( rights_manager.check_can_access_activity(self.user_admin, exp_rights)) self.assertTrue( rights_manager.check_can_edit_activity(self.user_admin, exp_rights)) self.assertTrue( rights_manager.check_can_voiceover_activity( self.user_admin, exp_rights)) self.assertTrue( rights_manager.check_can_delete_activity(self.user_admin, exp_rights)) self.assertTrue( rights_manager.check_can_access_activity(self.user_moderator, exp_rights)) self.assertFalse( rights_manager.check_can_edit_activity(self.user_moderator, exp_rights)) self.assertFalse( rights_manager.check_can_voiceover_activity( self.user_moderator, exp_rights)) self.assertFalse( rights_manager.check_can_delete_activity(self.user_moderator, exp_rights)) self.assertFalse( rights_manager.check_can_access_activity(self.user_b, exp_rights)) self.assertFalse( rights_manager.check_can_edit_activity(self.user_b, exp_rights)) self.assertFalse( rights_manager.check_can_voiceover_activity( self.user_b, exp_rights)) self.assertFalse( rights_manager.check_can_delete_activity(self.user_b, exp_rights))
def test_accept_application_assigns_role_to_entity(self): voiceover_services.create_new_voiceover_application( suggestion_models.TARGET_TYPE_EXPLORATION, '0', 'en', '', 'audio_file.mp3', self.applicant_id) user_voiceover_applications = ( voiceover_services.get_user_submitted_voiceover_applications( self.applicant_id)) self.assertEqual(len(user_voiceover_applications), 1) self.assertEqual(user_voiceover_applications[0].status, suggestion_models.STATUS_IN_REVIEW) voiceover_services.accept_voiceover_application( user_voiceover_applications[0].voiceover_application_id, self.admin_id) user_voiceover_applications = ( voiceover_services.get_user_submitted_voiceover_applications( self.applicant_id, status=suggestion_models.STATUS_ACCEPTED)) self.assertEqual(len(user_voiceover_applications), 1) self.assertEqual(user_voiceover_applications[0].status, suggestion_models.STATUS_ACCEPTED) exploration_rights = rights_manager.get_exploration_rights('0') can_voiceover = rights_manager.check_can_voiceover_activity( self.applicant, exploration_rights) self.assertTrue(can_voiceover)
def get(self, exploration_id): """Gets the user permissions for an exploration.""" exploration_rights = rights_manager.get_exploration_rights( exploration_id) self.values.update({ 'can_delete': rights_manager.check_can_delete_activity(self.user, exploration_rights), 'can_edit': rights_manager.check_can_edit_activity(self.user, exploration_rights), 'can_modify_roles': (rights_manager.check_can_modify_core_activity_roles( self.user, exploration_rights)), 'can_publish': rights_manager.check_can_publish_activity(self.user, exploration_rights), 'can_release_ownership': (rights_manager.check_can_release_ownership( self.user, exploration_rights)), 'can_voiceover': (rights_manager.check_can_voiceover_activity( self.user, exploration_rights)), 'can_unpublish': rights_manager.check_can_unpublish_activity( self.user, exploration_rights), 'can_manage_voice_artist': rights_manager.check_can_manage_voice_artist_in_activity( self.user, exploration_rights), }) self.render_json(self.values)
def put(self, exploration_id): """Updates properties of the given exploration.""" exploration = exp_fetchers.get_exploration_by_id(exploration_id) version = self.payload.get('version') _require_valid_version(version, exploration.version) commit_message = self.payload.get('commit_message') change_list_dict = self.payload.get('change_list') change_list = [ exp_domain.ExplorationChange(change) for change in change_list_dict] try: exploration_rights = rights_manager.get_exploration_rights( exploration_id) can_edit = rights_manager.check_can_edit_activity( self.user, exploration_rights) can_voiceover = rights_manager.check_can_voiceover_activity( self.user, exploration_rights) if can_edit: exp_services.update_exploration( self.user_id, exploration_id, change_list, commit_message) elif can_voiceover: exp_services.update_exploration( self.user_id, exploration_id, change_list, commit_message, is_by_voice_artist=True) except utils.ValidationError as e: raise self.InvalidInputException(e) exploration_data = exp_services.get_user_exploration_data( self.user_id, exploration_id) self.values.update(exploration_data) self.render_json(self.values)
def put(self, exploration_id): """Updates properties of the given exploration.""" exploration = exp_fetchers.get_exploration_by_id(exploration_id) version = self.payload.get('version') if version is None: raise base.BaseHandler.InvalidInputException( 'Invalid POST request: a version must be specified.') if version > exploration.version: raise base.BaseHandler.InvalidInputException( 'Trying to update version %s of exploration from version %s, ' 'which is not possible. Please reload the page and try again.' % (exploration.version, version)) commit_message = self.payload.get('commit_message') if (commit_message is not None and len(commit_message) > constants.MAX_COMMIT_MESSAGE_LENGTH): raise self.InvalidInputException( 'Commit messages must be at most %s characters long.' % constants.MAX_COMMIT_MESSAGE_LENGTH) change_list_dict = self.payload.get('change_list') try: change_list = [ exp_domain.ExplorationChange(change) for change in change_list_dict ] except utils.ValidationError as e: raise self.InvalidInputException(e) changes_are_mergeable = exp_services.are_changes_mergeable( exploration_id, version, change_list) exploration_rights = rights_manager.get_exploration_rights( exploration_id) can_edit = rights_manager.check_can_edit_activity( self.user, exploration_rights) can_voiceover = rights_manager.check_can_voiceover_activity( self.user, exploration_rights) try: if can_edit and changes_are_mergeable: exp_services.update_exploration( self.user_id, exploration_id, change_list, commit_message) elif can_voiceover and changes_are_mergeable: exp_services.update_exploration( self.user_id, exploration_id, change_list, commit_message, is_by_voice_artist=True) except utils.ValidationError as e: raise self.InvalidInputException(e) exploration_data = exp_services.get_user_exploration_data( self.user_id, exploration_id) self.values.update(exploration_data) self.render_json(self.values)
def get(self, exploration_id): """Handles GET requests.""" exploration_rights = rights_manager.get_exploration_rights( exploration_id) interaction_ids = ( interaction_registry.Registry.get_all_interaction_ids()) interaction_dependency_ids = ( interaction_registry.Registry.get_deduplicated_dependency_ids( interaction_ids)) dependencies_html, additional_angular_modules = ( dependency_registry.Registry.get_deps_html_and_angular_modules( interaction_dependency_ids + self.EDITOR_PAGE_DEPENDENCY_IDS)) interaction_templates = (interaction_registry.Registry. get_interaction_html(interaction_ids)) self.values.update({ 'INTERACTION_SPECS': interaction_registry.Registry.get_all_specs(), 'additional_angular_modules': additional_angular_modules, 'can_delete': rights_manager.check_can_delete_activity(self.user, exploration_rights), 'can_edit': rights_manager.check_can_edit_activity(self.user, exploration_rights), 'can_modify_roles': (rights_manager.check_can_modify_activity_roles( self.user, exploration_rights)), 'can_publish': rights_manager.check_can_publish_activity(self.user, exploration_rights), 'can_release_ownership': (rights_manager.check_can_release_ownership( self.user, exploration_rights)), 'can_voiceover': (rights_manager.check_can_voiceover_activity( self.user, exploration_rights)), 'can_unpublish': rights_manager.check_can_unpublish_activity( self.user, exploration_rights), 'dependencies_html': jinja2.utils.Markup(dependencies_html), 'interaction_templates': jinja2.utils.Markup(interaction_templates), 'meta_description': feconf.CREATE_PAGE_DESCRIPTION, }) self.render_template('dist/exploration-editor-page.mainpage.html')
def put(self, exploration_id): """Handles PUT requests for draft updation.""" # Raise an Exception if the draft change list fails non-strict # validation. try: change_list_dict = self.payload.get('change_list') change_list = [ exp_domain.ExplorationChange(change) for change in change_list_dict ] except utils.ValidationError as e: # We leave any pre-existing draft changes in the datastore. raise self.InvalidInputException(e) version = self.payload.get('version') exploration_rights = rights_manager.get_exploration_rights( exploration_id) can_edit = rights_manager.check_can_edit_activity( self.user, exploration_rights) can_voiceover = rights_manager.check_can_voiceover_activity( self.user, exploration_rights) try: if can_edit: exp_services.create_or_update_draft(exploration_id, self.user_id, change_list, version, datetime.datetime.utcnow()) elif can_voiceover: exp_services.create_or_update_draft(exploration_id, self.user_id, change_list, version, datetime.datetime.utcnow(), is_by_voice_artist=True) except utils.ValidationError as e: # We leave any pre-existing draft changes in the datastore. raise self.InvalidInputException(e) exp_user_data = exp_services.get_user_exploration_data( self.user_id, exploration_id) # If the draft_change_list_id is False, have the user discard the draft # changes. We save the draft to the datastore even if the version is # invalid, so that it is available for recovery later. self.render_json({ 'draft_change_list_id': exp_user_data['draft_change_list_id'], 'is_version_of_draft_valid': exp_services.is_version_of_draft_valid(exploration_id, version) })
def put(self, exploration_id): """Updates properties of the given exploration.""" exploration = exp_fetchers.get_exploration_by_id(exploration_id) version = self.payload.get('version') _require_valid_version(version, exploration.version) commit_message = self.payload.get('commit_message') if (commit_message is not None and len(commit_message) > constants.MAX_COMMIT_MESSAGE_LENGTH): raise self.InvalidInputException( 'Commit messages must be at most %s characters long.' % constants.MAX_COMMIT_MESSAGE_LENGTH) change_list_dict = self.payload.get('change_list') try: change_list = [ exp_domain.ExplorationChange(change) for change in change_list_dict ] except utils.ValidationError as e: raise self.InvalidInputException(e) exploration_rights = rights_manager.get_exploration_rights( exploration_id) can_edit = rights_manager.check_can_edit_activity( self.user, exploration_rights) can_voiceover = rights_manager.check_can_voiceover_activity( self.user, exploration_rights) try: if can_edit: exp_services.update_exploration(self.user_id, exploration_id, change_list, commit_message) elif can_voiceover: exp_services.update_exploration(self.user_id, exploration_id, change_list, commit_message, is_by_voice_artist=True) except utils.ValidationError as e: raise self.InvalidInputException(e) exploration_data = exp_services.get_user_exploration_data( self.user_id, exploration_id) self.values.update(exploration_data) self.render_json(self.values)
def put(self, exploration_id): """Updates properties of the given exploration.""" exploration = exp_fetchers.get_exploration_by_id(exploration_id) version = self.normalized_payload.get('version') if version > exploration.version: raise base.BaseHandler.InvalidInputException( 'Trying to update version %s of exploration from version %s, ' 'which is not possible. Please reload the page and try again.' % (exploration.version, version)) commit_message = self.normalized_payload.get('commit_message') change_list_dict = self.normalized_payload.get('change_list') change_list = [ exp_domain.ExplorationChange(change) for change in change_list_dict ] changes_are_mergeable = exp_services.are_changes_mergeable( exploration_id, version, change_list) exploration_rights = rights_manager.get_exploration_rights( exploration_id) can_edit = rights_manager.check_can_edit_activity( self.user, exploration_rights) can_voiceover = rights_manager.check_can_voiceover_activity( self.user, exploration_rights) try: if can_edit and changes_are_mergeable: exp_services.update_exploration(self.user_id, exploration_id, change_list, commit_message) elif can_voiceover and changes_are_mergeable: exp_services.update_exploration(self.user_id, exploration_id, change_list, commit_message, is_by_voice_artist=True) except utils.ValidationError as e: raise self.InvalidInputException(e) exploration_data = exp_services.get_user_exploration_data( self.user_id, exploration_id) self.values.update(exploration_data) self.render_json(self.values)
def test_check_cannot_voiceover_activity_with_no_activity_rights(self): self.assertFalse( rights_manager.check_can_voiceover_activity(self.owner, None))
def get(self, exploration_id): """Handles GET requests.""" if exploration_id in constants.DISABLED_EXPLORATION_IDS: self.render_template('pages/error/disabled_exploration.html', iframe_restriction=None) return exploration_rights = rights_manager.get_exploration_rights( exploration_id) visualizations_html = visualization_registry.Registry.get_full_html() interaction_ids = ( interaction_registry.Registry.get_all_interaction_ids()) interaction_dependency_ids = ( interaction_registry.Registry.get_deduplicated_dependency_ids( interaction_ids)) dependencies_html, additional_angular_modules = ( dependency_registry.Registry.get_deps_html_and_angular_modules( interaction_dependency_ids + self.EDITOR_PAGE_DEPENDENCY_IDS)) interaction_templates = (interaction_registry.Registry. get_interaction_html(interaction_ids)) self.values.update({ 'INTERACTION_SPECS': interaction_registry.Registry.get_all_specs(), 'DEFAULT_OBJECT_VALUES': obj_services.get_default_object_values(), 'DEFAULT_TWITTER_SHARE_MESSAGE_EDITOR': (DEFAULT_TWITTER_SHARE_MESSAGE_EDITOR.value), 'additional_angular_modules': additional_angular_modules, 'can_delete': rights_manager.check_can_delete_activity(self.user, exploration_rights), 'can_edit': rights_manager.check_can_edit_activity(self.user, exploration_rights), 'can_modify_roles': (rights_manager.check_can_modify_activity_roles( self.user, exploration_rights)), 'can_publish': rights_manager.check_can_publish_activity(self.user, exploration_rights), 'can_release_ownership': (rights_manager.check_can_release_ownership( self.user, exploration_rights)), 'can_voiceover': (rights_manager.check_can_voiceover_activity( self.user, exploration_rights)), 'can_unpublish': rights_manager.check_can_unpublish_activity( self.user, exploration_rights), 'dependencies_html': jinja2.utils.Markup(dependencies_html), 'interaction_templates': jinja2.utils.Markup(interaction_templates), 'meta_description': feconf.CREATE_PAGE_DESCRIPTION, 'value_generators_js': jinja2.utils.Markup(get_value_generators_js()), 'visualizations_html': jinja2.utils.Markup(visualizations_html), 'INVALID_PARAMETER_NAMES': feconf.INVALID_PARAMETER_NAMES, 'SHOW_TRAINABLE_UNRESOLVED_ANSWERS': (feconf.SHOW_TRAINABLE_UNRESOLVED_ANSWERS), 'TAG_REGEX': feconf.TAG_REGEX, }) self.render_template('dist/exploration_editor.html')